From 9f00d44927c373757721017b43a89eb6e46328c9 Mon Sep 17 00:00:00 2001 From: Steven Valeri Date: Tue, 3 Aug 2021 07:34:05 -0400 Subject: [PATCH] feat: remove amm test scripts --- package.json | 17 +- test-suites/{test-aave => }/__setup.spec.ts | 26 +- .../addresses-provider-registry.spec.ts | 4 +- .../{test-aave => }/atoken-modifiers.spec.ts | 2 +- .../{test-amm => }/atoken-permit.spec.ts | 25 +- .../{test-aave => }/atoken-transfer.spec.ts | 8 +- .../authorized-flashloan.spec.ts | 14 +- .../{test-aave => }/borrow-cap.spec.ts | 6 +- .../{test-aave => }/borrow-repay-same-tx.ts | 10 +- .../{test-aave => }/configurator.spec.ts | 13 +- .../delegation-aware-atoken.spec.ts | 24 +- .../{test-aave => }/delegation-permit.spec.ts | 15 +- .../{test-aave => }/drop-reserve.spec.ts | 10 +- test-suites/{test-aave => }/flashloan.spec.ts | 14 +- .../{test-aave => }/helpers/actions.ts | 16 +- .../{test-aave => }/helpers/almost-equal.ts | 0 .../{test-aave => }/helpers/make-suite.ts | 34 +- .../helpers/scenario-engine.ts | 6 +- .../helpers/scenarios/borrow-negatives.json | 0 .../scenarios/borrow-repay-stable.json | 0 .../scenarios/borrow-repay-variable.json | 0 .../borrow-repayWithPermit-variable.json | 0 .../helpers/scenarios/credit-delegation.json | 0 .../helpers/scenarios/deposit.json | 0 .../scenarios/rebalance-stable-rate.json | 0 .../scenarios/set-use-as-collateral.json | 0 .../helpers/scenarios/swap-rate-mode.json | 0 .../helpers/scenarios/withdraw-negatives.json | 0 .../helpers/scenarios/withdraw.json | 0 .../helpers/utils/calculations.ts | 4 +- .../{test-amm => }/helpers/utils/helpers.ts | 10 +- .../helpers/utils/interfaces/index.ts | 0 .../{test-aave => }/helpers/utils/math.ts | 2 +- .../liquidation-atoken.spec.ts | 8 +- .../liquidation-underlying.spec.ts | 10 +- .../{test-aave => }/ltv-validation.spec.ts | 6 +- .../{test-aave => }/mint-to-treasury.spec.ts | 8 +- .../pausable-functions.spec.ts | 10 +- .../pool-addresses-provider.spec.ts | 10 +- .../{test-aave => }/rate-strategy.spec.ts | 8 +- .../{test-aave => }/reserve-pause.spec.ts | 10 +- test-suites/{test-aave => }/scenario.spec.ts | 6 +- .../stable-rate-economy.spec.ts | 0 .../{test-aave => }/stable-token.spec.ts | 4 +- .../subgraph-scenarios.spec.ts | 4 +- .../{test-aave => }/supply-cap.spec.ts | 11 +- test-suites/test-aave/atoken-permit.spec.ts | 312 ---- .../test-aave/helpers/utils/helpers.ts | 130 -- .../test-aave/pool-addresses-provider.spec.ts | 99 -- test-suites/test-amm/__setup.spec.ts | 281 ---- .../addresses-provider-registry.spec.ts | 100 -- test-suites/test-amm/atoken-modifiers.spec.ts | 33 - test-suites/test-amm/atoken-transfer.spec.ts | 99 -- test-suites/test-amm/configurator.spec.ts | 413 ----- .../test-amm/delegation-aware-atoken.spec.ts | 71 - test-suites/test-amm/flashloan.spec.ts | 616 ------- test-suites/test-amm/helpers/actions.ts | 770 --------- test-suites/test-amm/helpers/almost-equal.ts | 31 - test-suites/test-amm/helpers/make-suite.ts | 170 -- .../test-amm/helpers/scenario-engine.ts | 237 --- .../helpers/scenarios/borrow-negatives.json | 142 -- .../scenarios/borrow-repay-stable.json | 730 --------- .../scenarios/borrow-repay-variable.json | 956 ----------- .../helpers/scenarios/credit-delegation.json | 184 --- .../test-amm/helpers/scenarios/deposit.json | 266 --- .../scenarios/rebalance-stable-rate.json | 198 --- .../scenarios/set-use-as-collateral.json | 236 --- .../helpers/scenarios/swap-rate-mode.json | 221 --- .../helpers/scenarios/withdraw-negatives.json | 164 -- .../test-amm/helpers/scenarios/withdraw.json | 434 ----- .../test-amm/helpers/utils/calculations.ts | 1443 ----------------- .../helpers/utils/interfaces/index.ts | 40 - test-suites/test-amm/helpers/utils/math.ts | 97 -- .../test-amm/liquidation-atoken.spec.ts | 378 ----- .../test-amm/liquidation-underlying.spec.ts | 492 ------ .../test-amm/pausable-functions.spec.ts | 330 ---- test-suites/test-amm/pool-modifiers.spec.ts | 241 --- test-suites/test-amm/scenario.spec.ts | 44 - .../test-amm/stable-rate-economy.spec.ts | 199 --- test-suites/test-amm/stable-token.spec.ts | 37 - .../test-amm/subgraph-scenarios.spec.ts | 32 - test-suites/test-amm/upgradeability.spec.ts | 233 --- .../test-amm/variable-debt-token.spec.ts | 36 - .../{test-aave => }/upgradeability.spec.ts | 16 +- .../variable-debt-token.spec.ts | 4 +- 85 files changed, 183 insertions(+), 10687 deletions(-) rename test-suites/{test-aave => }/__setup.spec.ts (94%) rename test-suites/{test-aave => }/addresses-provider-registry.spec.ts (97%) rename test-suites/{test-aave => }/atoken-modifiers.spec.ts (95%) rename test-suites/{test-amm => }/atoken-permit.spec.ts (90%) rename test-suites/{test-aave => }/atoken-transfer.spec.ts (93%) rename test-suites/{test-aave => }/authorized-flashloan.spec.ts (97%) rename test-suites/{test-aave => }/borrow-cap.spec.ts (98%) rename test-suites/{test-aave => }/borrow-repay-same-tx.ts (87%) rename test-suites/{test-aave => }/configurator.spec.ts (99%) rename test-suites/{test-aave => }/delegation-aware-atoken.spec.ts (73%) rename test-suites/{test-aave => }/delegation-permit.spec.ts (91%) rename test-suites/{test-aave => }/drop-reserve.spec.ts (91%) rename test-suites/{test-aave => }/flashloan.spec.ts (98%) rename test-suites/{test-aave => }/helpers/actions.ts (98%) rename test-suites/{test-aave => }/helpers/almost-equal.ts (100%) rename test-suites/{test-aave => }/helpers/make-suite.ts (84%) rename test-suites/{test-aave => }/helpers/scenario-engine.ts (97%) rename test-suites/{test-aave => }/helpers/scenarios/borrow-negatives.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/borrow-repay-stable.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/borrow-repay-variable.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/borrow-repayWithPermit-variable.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/credit-delegation.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/deposit.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/rebalance-stable-rate.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/set-use-as-collateral.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/swap-rate-mode.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/withdraw-negatives.json (100%) rename test-suites/{test-aave => }/helpers/scenarios/withdraw.json (100%) rename test-suites/{test-aave => }/helpers/utils/calculations.ts (99%) rename test-suites/{test-amm => }/helpers/utils/helpers.ts (94%) rename test-suites/{test-aave => }/helpers/utils/interfaces/index.ts (100%) rename test-suites/{test-aave => }/helpers/utils/math.ts (98%) rename test-suites/{test-aave => }/liquidation-atoken.spec.ts (98%) rename test-suites/{test-aave => }/liquidation-underlying.spec.ts (98%) rename test-suites/{test-aave => }/ltv-validation.spec.ts (93%) rename test-suites/{test-aave => }/mint-to-treasury.spec.ts (91%) rename test-suites/{test-aave => }/pausable-functions.spec.ts (96%) rename test-suites/{test-amm => }/pool-addresses-provider.spec.ts (92%) rename test-suites/{test-aave => }/rate-strategy.spec.ts (95%) rename test-suites/{test-aave => }/reserve-pause.spec.ts (96%) rename test-suites/{test-aave => }/scenario.spec.ts (87%) rename test-suites/{test-aave => }/stable-rate-economy.spec.ts (100%) rename test-suites/{test-aave => }/stable-token.spec.ts (91%) rename test-suites/{test-aave => }/subgraph-scenarios.spec.ts (88%) rename test-suites/{test-aave => }/supply-cap.spec.ts (97%) delete mode 100644 test-suites/test-aave/atoken-permit.spec.ts delete mode 100644 test-suites/test-aave/helpers/utils/helpers.ts delete mode 100644 test-suites/test-aave/pool-addresses-provider.spec.ts delete mode 100644 test-suites/test-amm/__setup.spec.ts delete mode 100644 test-suites/test-amm/addresses-provider-registry.spec.ts delete mode 100644 test-suites/test-amm/atoken-modifiers.spec.ts delete mode 100644 test-suites/test-amm/atoken-transfer.spec.ts delete mode 100644 test-suites/test-amm/configurator.spec.ts delete mode 100644 test-suites/test-amm/delegation-aware-atoken.spec.ts delete mode 100644 test-suites/test-amm/flashloan.spec.ts delete mode 100644 test-suites/test-amm/helpers/actions.ts delete mode 100644 test-suites/test-amm/helpers/almost-equal.ts delete mode 100644 test-suites/test-amm/helpers/make-suite.ts delete mode 100644 test-suites/test-amm/helpers/scenario-engine.ts delete mode 100644 test-suites/test-amm/helpers/scenarios/borrow-negatives.json delete mode 100644 test-suites/test-amm/helpers/scenarios/borrow-repay-stable.json delete mode 100644 test-suites/test-amm/helpers/scenarios/borrow-repay-variable.json delete mode 100644 test-suites/test-amm/helpers/scenarios/credit-delegation.json delete mode 100644 test-suites/test-amm/helpers/scenarios/deposit.json delete mode 100644 test-suites/test-amm/helpers/scenarios/rebalance-stable-rate.json delete mode 100644 test-suites/test-amm/helpers/scenarios/set-use-as-collateral.json delete mode 100644 test-suites/test-amm/helpers/scenarios/swap-rate-mode.json delete mode 100644 test-suites/test-amm/helpers/scenarios/withdraw-negatives.json delete mode 100644 test-suites/test-amm/helpers/scenarios/withdraw.json delete mode 100644 test-suites/test-amm/helpers/utils/calculations.ts delete mode 100644 test-suites/test-amm/helpers/utils/interfaces/index.ts delete mode 100644 test-suites/test-amm/helpers/utils/math.ts delete mode 100644 test-suites/test-amm/liquidation-atoken.spec.ts delete mode 100644 test-suites/test-amm/liquidation-underlying.spec.ts delete mode 100644 test-suites/test-amm/pausable-functions.spec.ts delete mode 100644 test-suites/test-amm/pool-modifiers.spec.ts delete mode 100644 test-suites/test-amm/scenario.spec.ts delete mode 100644 test-suites/test-amm/stable-rate-economy.spec.ts delete mode 100644 test-suites/test-amm/stable-token.spec.ts delete mode 100644 test-suites/test-amm/subgraph-scenarios.spec.ts delete mode 100644 test-suites/test-amm/upgradeability.spec.ts delete mode 100644 test-suites/test-amm/variable-debt-token.spec.ts rename test-suites/{test-aave => }/upgradeability.spec.ts (93%) rename test-suites/{test-aave => }/variable-debt-token.spec.ts (93%) diff --git a/package.json b/package.json index fda628578..003d701ad 100644 --- a/package.json +++ b/package.json @@ -18,14 +18,13 @@ "hardhat:matic": "hardhat --network matic", "compile": "SKIP_LOAD=true hardhat compile", "console:fork": "FORK=main hardhat console", - "test": "npm run compile && TS_NODE_TRANSPILE_ONLY=1 hardhat test ./test-suites/test-aave/*.spec.ts", + "test": "npm run compile && TS_NODE_TRANSPILE_ONLY=1 hardhat test ./test-suites/*.spec.ts", "test-amm": "npm run compile && TS_NODE_TRANSPILE_ONLY=1 hardhat test ./test-suites/test-amm/*.spec.ts", "test-amm-scenarios": "npm run compile && TS_NODE_TRANSPILE_ONLY=1 hardhat test ./test-suites/test-amm/__setup.spec.ts test-suites/test-amm/scenario.spec.ts", - "test-scenarios": "npm run compile && npx hardhat test test-suites/test-aave/__setup.spec.ts test-suites/test-aave/scenario.spec.ts", - "test-subgraph:scenarios": "npm run compile && hardhat --network hardhatevm_docker test test-suites/test-aave/__setup.spec.ts test-suites/test-aave/subgraph-scenarios.spec.ts", - "test:main:check-list": "npm run compile && FORK=main TS_NODE_TRANSPILE_ONLY=1 hardhat test test-suites/test-aave/__setup.spec.ts test-suites/test-aave/mainnet/check-list.spec.ts", - "test:aave": "hardhat test test-suites/test-aave/__setup.spec.ts", - "test:amm": "hardhat test test-suites/test-amm/__setup.spec.ts", + "test-scenarios": "npm run compile && npx hardhat test test-suites/__setup.spec.ts test-suites/scenario.spec.ts", + "test-subgraph:scenarios": "npm run compile && hardhat --network hardhatevm_docker test test-suites/__setup.spec.ts test-suites/subgraph-scenarios.spec.ts", + "test:main:check-list": "npm run compile && FORK=main TS_NODE_TRANSPILE_ONLY=1 hardhat test test-suites/__setup.spec.ts test-suites/mainnet/check-list.spec.ts", + "test:aave": "hardhat test test-suites/__setup.spec.ts", "dev:coverage": "buidler compile --force && buidler coverage --network coverage", "aave:evm:dev:migration": "npm run compile && hardhat aave:dev", "aave:docker:full:migration": "npm run compile && npm run hardhat:docker -- aave:mainnet --skip-registry", @@ -61,8 +60,8 @@ "aave:main:full:migration": "npm run compile && npm run hardhat:main -- aave:mainnet --verify", "aave:main:full:initialize": "npm run compile && FORK=main full:initialize-tokens --pool Aave", "amm:main:full:migration": "npm run compile && npm run hardhat:main -- amm:mainnet --verify", - "prettier:check": "npx prettier -c 'tasks/**/*.ts' 'contracts/**/*.sol' 'helpers/**/*.ts' 'test-suites/test-aave/**/*.ts' 'test-suites/test-amm/**/*.ts' 'markets/**/*.ts'", - "prettier:write": "prettier --write 'tasks/**/*.ts' 'contracts/**/*.sol' 'helpers/**/*.ts' 'test-suites/test-aave/**/*.ts' 'test-suites/test-amm/**/*.ts' 'markets/**/*.ts'", + "prettier:check": "npx prettier -c 'tasks/**/*.ts' 'contracts/**/*.sol' 'helpers/**/*.ts' 'test-suites/**/*.ts' 'markets/**/*.ts'", + "prettier:write": "prettier --write 'tasks/**/*.ts' 'contracts/**/*.sol' 'helpers/**/*.ts' 'test-suites/**/*.ts' 'markets/**/*.ts'", "ci:test": "npm run compile && npm run test", "ci:clean": "rm -rf ./artifacts ./cache ./types", "print-contracts:kovan": "npm run hardhat:kovan -- print-contracts", @@ -134,7 +133,7 @@ }, "husky": { "hooks": { - "pre-commit": "pretty-quick --staged --pattern 'contracts/**/*.sol' --pattern 'helpers/**/*.ts' --pattern 'test-suites/test-aave/**/*.ts' --pattern 'test-suites/test-amm/**/*.ts' --pattern 'tasks/**/*.ts' --pattern 'markets/**/*.ts'" + "pre-commit": "pretty-quick --staged --pattern 'contracts/**/*.sol' --pattern 'helpers/**/*.ts' --pattern 'test-suites**/*.ts' --pattern 'tasks/**/*.ts' --pattern 'markets/**/*.ts'" } }, "author": "Aave", diff --git a/test-suites/test-aave/__setup.spec.ts b/test-suites/__setup.spec.ts similarity index 94% rename from test-suites/test-aave/__setup.spec.ts rename to test-suites/__setup.spec.ts index 397134878..eef8b93b7 100644 --- a/test-suites/test-aave/__setup.spec.ts +++ b/test-suites/__setup.spec.ts @@ -5,7 +5,7 @@ import { getEthersSigners, registerContractInJsonDb, getEthersSignersAddresses, -} from '../../helpers/contracts-helpers'; +} from '../helpers/contracts-helpers'; import { deployPoolAddressesProvider, deployMintableERC20, @@ -22,34 +22,34 @@ import { deployATokensAndRatesHelper, deployWETHMocked, deployMockUniswapRouter, -} from '../../helpers/contracts-deployments'; -import { eEthereumNetwork } from '../../helpers/types'; +} from '../helpers/contracts-deployments'; +import { eEthereumNetwork } from '../helpers/types'; import { ethers, Signer } from 'ethers'; -import { TokenContractId, eContractid, tEthereumAddress, AavePools } from '../../helpers/types'; -import { MintableERC20 } from '../../types/MintableERC20'; +import { TokenContractId, eContractid, tEthereumAddress, AavePools } from '../helpers/types'; +import { MintableERC20 } from '../types/MintableERC20'; import { ConfigNames, getReservesConfigByPool, getTreasuryAddress, loadPoolConfig, -} from '../../helpers/configuration'; +} from '../helpers/configuration'; import { initializeMakeSuite } from './helpers/make-suite'; import { setInitialAssetPricesInOracle, deployAllMockAggregators, setInitialMarketRatesInRatesOracleByHelper, -} from '../../helpers/oracles-helpers'; -import { DRE, waitForTx } from '../../helpers/misc-utils'; -import { initReservesByHelper, configureReservesByHelper } from '../../helpers/init-helpers'; -import AaveConfig from '../../markets/aave'; -import { ZERO_ADDRESS } from '../../helpers/constants'; +} from '../helpers/oracles-helpers'; +import { DRE, waitForTx } from '../helpers/misc-utils'; +import { initReservesByHelper, configureReservesByHelper } from '../helpers/init-helpers'; +import AaveConfig from '../markets/aave'; +import { ZERO_ADDRESS } from '../helpers/constants'; import { getPool, getPoolConfiguratorProxy, getPairsTokenAggregator, -} from '../../helpers/contracts-getters'; -import { WETH9Mocked } from '../../types/WETH9Mocked'; +} from '../helpers/contracts-getters'; +import { WETH9Mocked } from '../types/WETH9Mocked'; const MOCK_USD_PRICE_IN_WEI = AaveConfig.ProtocolGlobalParams.MockUsdPriceInWei; const ALL_ASSETS_INITIAL_PRICES = AaveConfig.Mocks.AllAssetsInitialPrices; diff --git a/test-suites/test-aave/addresses-provider-registry.spec.ts b/test-suites/addresses-provider-registry.spec.ts similarity index 97% rename from test-suites/test-aave/addresses-provider-registry.spec.ts rename to test-suites/addresses-provider-registry.spec.ts index b19720655..658e39ea5 100644 --- a/test-suites/test-aave/addresses-provider-registry.spec.ts +++ b/test-suites/addresses-provider-registry.spec.ts @@ -1,6 +1,6 @@ import { TestEnv, makeSuite } from './helpers/make-suite'; -import { ZERO_ADDRESS } from '../../helpers/constants'; -import { ProtocolErrors } from '../../helpers/types'; +import { ZERO_ADDRESS } from '../helpers/constants'; +import { ProtocolErrors } from '../helpers/types'; const { expect } = require('chai'); diff --git a/test-suites/test-aave/atoken-modifiers.spec.ts b/test-suites/atoken-modifiers.spec.ts similarity index 95% rename from test-suites/test-aave/atoken-modifiers.spec.ts rename to test-suites/atoken-modifiers.spec.ts index ddd1f2afd..16b1fa252 100644 --- a/test-suites/test-aave/atoken-modifiers.spec.ts +++ b/test-suites/atoken-modifiers.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors } from '../../helpers/types'; +import { ProtocolErrors } from '../helpers/types'; makeSuite('AToken: Modifiers', (testEnv: TestEnv) => { const { CT_CALLER_MUST_BE_POOL } = ProtocolErrors; diff --git a/test-suites/test-amm/atoken-permit.spec.ts b/test-suites/atoken-permit.spec.ts similarity index 90% rename from test-suites/test-amm/atoken-permit.spec.ts rename to test-suites/atoken-permit.spec.ts index 24e8b39cb..acceb1005 100644 --- a/test-suites/test-amm/atoken-permit.spec.ts +++ b/test-suites/atoken-permit.spec.ts @@ -1,14 +1,15 @@ -import { MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../../helpers/constants'; -import { BUIDLEREVM_CHAINID } from '../../helpers/buidler-constants'; -import { buildPermitParams, getSignatureFromTypedData } from '../../helpers/contracts-helpers'; +import { MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../helpers/constants'; +import { BUIDLEREVM_CHAINID } from '../helpers/buidler-constants'; +import { buildPermitParams, getSignatureFromTypedData } from '../helpers/contracts-helpers'; import { expect } from 'chai'; import { ethers } from 'ethers'; import { makeSuite, TestEnv } from './helpers/make-suite'; -import { DRE } from '../../helpers/misc-utils'; -import { waitForTx } from '../../helpers/misc-utils'; +import { DRE } from '../helpers/misc-utils'; +import { waitForTx } from '../helpers/misc-utils'; import { _TypedDataEncoder } from 'ethers/lib/utils'; const { parseEther } = ethers.utils; +const TEST_WALLET_PATH = '../test-wallets.js'; makeSuite('AToken: Permit', (testEnv: TestEnv) => { it('Checks the domain separator', async () => { @@ -58,7 +59,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { expiration.toFixed() ); - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; + const ownerPrivateKey = require(TEST_WALLET_PATH).accounts[0].secretKey; if (!ownerPrivateKey) { throw new Error('INVALID_OWNER_PK'); } @@ -103,7 +104,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { permitAmount ); - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; + const ownerPrivateKey = require(TEST_WALLET_PATH).accounts[0].secretKey; if (!ownerPrivateKey) { throw new Error('INVALID_OWNER_PK'); } @@ -145,7 +146,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { permitAmount ); - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; + const ownerPrivateKey = require(TEST_WALLET_PATH).accounts[0].secretKey; if (!ownerPrivateKey) { throw new Error('INVALID_OWNER_PK'); } @@ -191,7 +192,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { permitAmount ); - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; + const ownerPrivateKey = require(TEST_WALLET_PATH).accounts[0].secretKey; if (!ownerPrivateKey) { throw new Error('INVALID_OWNER_PK'); } @@ -226,7 +227,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { permitAmount ); - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; + const ownerPrivateKey = require(TEST_WALLET_PATH).accounts[0].secretKey; if (!ownerPrivateKey) { throw new Error('INVALID_OWNER_PK'); } @@ -261,7 +262,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { permitAmount ); - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; + const ownerPrivateKey = require(TEST_WALLET_PATH).accounts[0].secretKey; if (!ownerPrivateKey) { throw new Error('INVALID_OWNER_PK'); } @@ -296,7 +297,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { permitAmount ); - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; + const ownerPrivateKey = require(TEST_WALLET_PATH).accounts[0].secretKey; if (!ownerPrivateKey) { throw new Error('INVALID_OWNER_PK'); } diff --git a/test-suites/test-aave/atoken-transfer.spec.ts b/test-suites/atoken-transfer.spec.ts similarity index 93% rename from test-suites/test-aave/atoken-transfer.spec.ts rename to test-suites/atoken-transfer.spec.ts index 87a4b1f36..76264a58c 100644 --- a/test-suites/test-aave/atoken-transfer.spec.ts +++ b/test-suites/atoken-transfer.spec.ts @@ -1,10 +1,10 @@ -import { APPROVAL_AMOUNT_POOL, MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; +import { APPROVAL_AMOUNT_POOL, MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../helpers/constants'; +import { convertToCurrencyDecimals } from '../helpers/contracts-helpers'; import { expect } from 'chai'; import { ethers } from 'ethers'; -import { RateMode, ProtocolErrors } from '../../helpers/types'; +import { RateMode, ProtocolErrors } from '../helpers/types'; import { makeSuite, TestEnv } from './helpers/make-suite'; -import { CommonsConfig } from '../../markets/aave/commons'; +import { CommonsConfig } from '../markets/aave/commons'; const AAVE_REFERRAL = CommonsConfig.ProtocolGlobalParams.AaveReferral; diff --git a/test-suites/test-aave/authorized-flashloan.spec.ts b/test-suites/authorized-flashloan.spec.ts similarity index 97% rename from test-suites/test-aave/authorized-flashloan.spec.ts rename to test-suites/authorized-flashloan.spec.ts index 578a4ad10..07dfdf653 100644 --- a/test-suites/test-aave/authorized-flashloan.spec.ts +++ b/test-suites/authorized-flashloan.spec.ts @@ -1,18 +1,18 @@ import BigNumber from 'bignumber.js'; import { TestEnv, makeSuite } from './helpers/make-suite'; -import { APPROVAL_AMOUNT_POOL, oneRay } from '../../helpers/constants'; -import { convertToCurrencyDecimals, getContract } from '../../helpers/contracts-helpers'; +import { APPROVAL_AMOUNT_POOL, oneRay } from '../helpers/constants'; +import { convertToCurrencyDecimals, getContract } from '../helpers/contracts-helpers'; import { ethers } from 'ethers'; -import { MockFlashLoanReceiver } from '../../types/MockFlashLoanReceiver'; -import { ProtocolErrors, eContractid } from '../../helpers/types'; -import { VariableDebtToken } from '../../types/VariableDebtToken'; -import { StableDebtToken } from '../../types/StableDebtToken'; +import { MockFlashLoanReceiver } from '../types/MockFlashLoanReceiver'; +import { ProtocolErrors, eContractid } from '../helpers/types'; +import { VariableDebtToken } from '../types/VariableDebtToken'; +import { StableDebtToken } from '../types/StableDebtToken'; import { getMockFlashLoanReceiver, getStableDebtToken, getVariableDebtToken, -} from '../../helpers/contracts-getters'; +} from '../helpers/contracts-getters'; const { expect } = require('chai'); diff --git a/test-suites/test-aave/borrow-cap.spec.ts b/test-suites/borrow-cap.spec.ts similarity index 98% rename from test-suites/test-aave/borrow-cap.spec.ts rename to test-suites/borrow-cap.spec.ts index 2085a0d56..01d6e9a90 100644 --- a/test-suites/test-aave/borrow-cap.spec.ts +++ b/test-suites/borrow-cap.spec.ts @@ -5,9 +5,9 @@ import { RAY, MAX_BORROW_CAP, MAX_SUPPLY_CAP, -} from '../../helpers/constants'; -import { ProtocolErrors } from '../../helpers/types'; -import { MintableERC20, WETH9, WETH9Mocked } from '../../types'; +} from '../helpers/constants'; +import { ProtocolErrors } from '../helpers/types'; +import { MintableERC20, WETH9, WETH9Mocked } from '../types'; import { parseEther } from '@ethersproject/units'; import { BigNumber } from '@ethersproject/bignumber'; diff --git a/test-suites/test-aave/borrow-repay-same-tx.ts b/test-suites/borrow-repay-same-tx.ts similarity index 87% rename from test-suites/test-aave/borrow-repay-same-tx.ts rename to test-suites/borrow-repay-same-tx.ts index c865e0dc4..3b4e3f1bf 100644 --- a/test-suites/test-aave/borrow-repay-same-tx.ts +++ b/test-suites/borrow-repay-same-tx.ts @@ -5,19 +5,19 @@ import { RAY, MAX_BORROW_CAP, MAX_SUPPLY_CAP, -} from '../../helpers/constants'; -import { ProtocolErrors } from '../../helpers/types'; +} from '../helpers/constants'; +import { ProtocolErrors } from '../helpers/types'; import { BorrowRepayTestMock, BorrowRepayTestMockFactory, MintableERC20, WETH9, WETH9Mocked, -} from '../../types'; +} from '../types'; import { parseEther } from '@ethersproject/units'; import { BigNumber } from '@ethersproject/bignumber'; -import { waitForTx } from '../../helpers/misc-utils'; -import { getFirstSigner } from '../../helpers/contracts-getters'; +import { waitForTx } from '../helpers/misc-utils'; +import { getFirstSigner } from '../helpers/contracts-getters'; const { expect } = require('chai'); diff --git a/test-suites/test-aave/configurator.spec.ts b/test-suites/configurator.spec.ts similarity index 99% rename from test-suites/test-aave/configurator.spec.ts rename to test-suites/configurator.spec.ts index 6ec15ce34..c652b7b36 100644 --- a/test-suites/test-aave/configurator.spec.ts +++ b/test-suites/configurator.spec.ts @@ -1,13 +1,8 @@ import { TestEnv, makeSuite } from './helpers/make-suite'; -import { - APPROVAL_AMOUNT_POOL, - MAX_UINT_AMOUNT, - RAY, - MAX_BORROW_CAP, -} from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; -import { ProtocolErrors } from '../../helpers/types'; -import { strategyWETH } from '../../markets/aave/reservesConfigs'; +import { APPROVAL_AMOUNT_POOL, MAX_UINT_AMOUNT, RAY, MAX_BORROW_CAP } from '../helpers/constants'; +import { convertToCurrencyDecimals } from '../helpers/contracts-helpers'; +import { ProtocolErrors } from '../helpers/types'; +import { strategyWETH } from '../markets/aave/reservesConfigs'; import { BigNumber } from '@ethersproject/bignumber'; const { expect } = require('chai'); diff --git a/test-suites/test-aave/delegation-aware-atoken.spec.ts b/test-suites/delegation-aware-atoken.spec.ts similarity index 73% rename from test-suites/test-aave/delegation-aware-atoken.spec.ts rename to test-suites/delegation-aware-atoken.spec.ts index 7e9381723..aa037374d 100644 --- a/test-suites/test-aave/delegation-aware-atoken.spec.ts +++ b/test-suites/delegation-aware-atoken.spec.ts @@ -1,26 +1,26 @@ -import { MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../../helpers/constants'; -import { BUIDLEREVM_CHAINID } from '../../helpers/buidler-constants'; -import { buildPermitParams, getSignatureFromTypedData } from '../../helpers/contracts-helpers'; +import { MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../helpers/constants'; +import { BUIDLEREVM_CHAINID } from '../helpers/buidler-constants'; +import { buildPermitParams, getSignatureFromTypedData } from '../helpers/contracts-helpers'; import { expect } from 'chai'; import { ethers } from 'ethers'; -import { ProtocolErrors } from '../../helpers/types'; +import { ProtocolErrors } from '../helpers/types'; import { makeSuite, TestEnv } from './helpers/make-suite'; -import { DRE } from '../../helpers/misc-utils'; +import { DRE } from '../helpers/misc-utils'; import { ConfigNames, getATokenDomainSeparatorPerNetwork, getTreasuryAddress, loadPoolConfig, -} from '../../helpers/configuration'; -import { waitForTx } from '../../helpers/misc-utils'; +} from '../helpers/configuration'; +import { waitForTx } from '../helpers/misc-utils'; import { deployDelegationAwareAToken, deployMintableDelegationERC20, -} from '../../helpers/contracts-deployments'; -import { DelegationAwareATokenFactory } from '../../types'; -import { DelegationAwareAToken } from '../../types/DelegationAwareAToken'; -import { MintableDelegationERC20 } from '../../types/MintableDelegationERC20'; -import AaveConfig from '../../markets/aave'; +} from '../helpers/contracts-deployments'; +import { DelegationAwareATokenFactory } from '../types'; +import { DelegationAwareAToken } from '../types/DelegationAwareAToken'; +import { MintableDelegationERC20 } from '../types/MintableDelegationERC20'; +import AaveConfig from '../markets/aave'; const { parseEther } = ethers.utils; diff --git a/test-suites/test-aave/delegation-permit.spec.ts b/test-suites/delegation-permit.spec.ts similarity index 91% rename from test-suites/test-aave/delegation-permit.spec.ts rename to test-suites/delegation-permit.spec.ts index a3b927726..a4398f495 100644 --- a/test-suites/test-aave/delegation-permit.spec.ts +++ b/test-suites/delegation-permit.spec.ts @@ -1,19 +1,20 @@ -import { MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../../helpers/constants'; -import { BUIDLEREVM_CHAINID } from '../../helpers/buidler-constants'; +import { MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../helpers/constants'; +import { BUIDLEREVM_CHAINID } from '../helpers/buidler-constants'; import { buildPermitDelegationParams, buildPermitParams, convertToCurrencyDecimals, getSignatureFromTypedData, -} from '../../helpers/contracts-helpers'; +} from '../helpers/contracts-helpers'; import { expect } from 'chai'; import { BigNumber, ethers } from 'ethers'; import { makeSuite, TestEnv } from './helpers/make-suite'; -import { DRE } from '../../helpers/misc-utils'; -import { waitForTx } from '../../helpers/misc-utils'; +import { DRE } from '../helpers/misc-utils'; +import { waitForTx } from '../helpers/misc-utils'; import { _TypedDataEncoder } from 'ethers/lib/utils'; const { parseEther } = ethers.utils; +const TEST_WALLET_PATH = '../test-wallets.js'; makeSuite('Permit Delegation', (testEnv: TestEnv) => { const mintedAmount = '1000'; @@ -91,7 +92,7 @@ makeSuite('Permit Delegation', (testEnv: TestEnv) => { permitAmount.toString() ); - const user2PrivateKey = require('../../test-wallets.js').accounts[1].secretKey; + const user2PrivateKey = require('../test-wallets.js').accounts[1].secretKey; if (!user2PrivateKey) { throw new Error('INVALID_OWNER_PK'); } @@ -141,7 +142,7 @@ makeSuite('Permit Delegation', (testEnv: TestEnv) => { permitAmount.toString() ); - const user2PrivateKey = require('../../test-wallets.js').accounts[1].secretKey; + const user2PrivateKey = require('../test-wallets.js').accounts[1].secretKey; if (!user2PrivateKey) { throw new Error('INVALID_OWNER_PK'); } diff --git a/test-suites/test-aave/drop-reserve.spec.ts b/test-suites/drop-reserve.spec.ts similarity index 91% rename from test-suites/test-aave/drop-reserve.spec.ts rename to test-suites/drop-reserve.spec.ts index 5dc7fcc2e..8f09d1c4c 100644 --- a/test-suites/test-aave/drop-reserve.spec.ts +++ b/test-suites/drop-reserve.spec.ts @@ -1,11 +1,11 @@ import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors, RateMode } from '../../helpers/types'; -import { APPROVAL_AMOUNT_POOL, MAX_UINT_AMOUNT, oneEther } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; +import { ProtocolErrors, RateMode } from '../helpers/types'; +import { APPROVAL_AMOUNT_POOL, MAX_UINT_AMOUNT, oneEther } from '../helpers/constants'; +import { convertToCurrencyDecimals } from '../helpers/contracts-helpers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { BigNumber } from 'bignumber.js'; -import { MockFlashLoanReceiver } from '../../types/MockFlashLoanReceiver'; -import { getMockFlashLoanReceiver } from '../../helpers/contracts-getters'; +import { MockFlashLoanReceiver } from '../types/MockFlashLoanReceiver'; +import { getMockFlashLoanReceiver } from '../helpers/contracts-getters'; import { domainToUnicode } from 'url'; const { expect } = require('chai'); diff --git a/test-suites/test-aave/flashloan.spec.ts b/test-suites/flashloan.spec.ts similarity index 98% rename from test-suites/test-aave/flashloan.spec.ts rename to test-suites/flashloan.spec.ts index d22dfe0ef..28ee8214e 100644 --- a/test-suites/test-aave/flashloan.spec.ts +++ b/test-suites/flashloan.spec.ts @@ -1,18 +1,18 @@ import BigNumber from 'bignumber.js'; import { TestEnv, makeSuite } from './helpers/make-suite'; -import { APPROVAL_AMOUNT_POOL, MAX_UINT_AMOUNT, oneRay } from '../../helpers/constants'; -import { convertToCurrencyDecimals, getContract } from '../../helpers/contracts-helpers'; +import { APPROVAL_AMOUNT_POOL, MAX_UINT_AMOUNT, oneRay } from '../helpers/constants'; +import { convertToCurrencyDecimals, getContract } from '../helpers/contracts-helpers'; import { ethers } from 'ethers'; -import { MockFlashLoanReceiver } from '../../types/MockFlashLoanReceiver'; -import { ProtocolErrors, eContractid } from '../../helpers/types'; -import { VariableDebtToken } from '../../types/VariableDebtToken'; -import { StableDebtToken } from '../../types/StableDebtToken'; +import { MockFlashLoanReceiver } from '../types/MockFlashLoanReceiver'; +import { ProtocolErrors, eContractid } from '../helpers/types'; +import { VariableDebtToken } from '../types/VariableDebtToken'; +import { StableDebtToken } from '../types/StableDebtToken'; import { getMockFlashLoanReceiver, getStableDebtToken, getVariableDebtToken, -} from '../../helpers/contracts-getters'; +} from '../helpers/contracts-getters'; const { expect } = require('chai'); diff --git a/test-suites/test-aave/helpers/actions.ts b/test-suites/helpers/actions.ts similarity index 98% rename from test-suites/test-aave/helpers/actions.ts rename to test-suites/helpers/actions.ts index fac619f4a..03ac785eb 100644 --- a/test-suites/test-aave/helpers/actions.ts +++ b/test-suites/helpers/actions.ts @@ -16,26 +16,26 @@ import { calcExpectedUserDataAfterWithdraw, } from './utils/calculations'; import { getReserveAddressFromSymbol, getReserveData, getUserData } from './utils/helpers'; -import { buildPermitParams, getSignatureFromTypedData } from '../../../helpers/contracts-helpers'; +import { buildPermitParams, getSignatureFromTypedData } from '../../helpers/contracts-helpers'; -import { convertToCurrencyDecimals } from '../../../helpers/contracts-helpers'; +import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; import { getAToken, getMintableERC20, getStableDebtToken, getVariableDebtToken, getChainId, -} from '../../../helpers/contracts-getters'; -import { MAX_UINT_AMOUNT, ONE_YEAR } from '../../../helpers/constants'; +} from '../../helpers/contracts-getters'; +import { MAX_UINT_AMOUNT, ONE_YEAR } from '../../helpers/constants'; import { SignerWithAddress, TestEnv } from './make-suite'; -import { advanceTimeAndBlock, DRE, timeLatest, waitForTx } from '../../../helpers/misc-utils'; +import { advanceTimeAndBlock, DRE, timeLatest, waitForTx } from '../../helpers/misc-utils'; import chai from 'chai'; import { ReserveData, UserReserveData } from './utils/interfaces'; import { ContractReceipt, Wallet } from 'ethers'; -import { AToken } from '../../../types/AToken'; -import { RateMode, tEthereumAddress } from '../../../helpers/types'; -import { MintableERC20Factory } from '../../../types'; +import { AToken } from '../../types/AToken'; +import { RateMode, tEthereumAddress } from '../../helpers/types'; +import { MintableERC20Factory } from '../../types'; const { expect } = chai; diff --git a/test-suites/test-aave/helpers/almost-equal.ts b/test-suites/helpers/almost-equal.ts similarity index 100% rename from test-suites/test-aave/helpers/almost-equal.ts rename to test-suites/helpers/almost-equal.ts diff --git a/test-suites/test-aave/helpers/make-suite.ts b/test-suites/helpers/make-suite.ts similarity index 84% rename from test-suites/test-aave/helpers/make-suite.ts rename to test-suites/helpers/make-suite.ts index 6ab1781c2..7a3fa9a9f 100644 --- a/test-suites/test-aave/helpers/make-suite.ts +++ b/test-suites/helpers/make-suite.ts @@ -1,4 +1,4 @@ -import { evmRevert, evmSnapshot, DRE } from '../../../helpers/misc-utils'; +import { evmRevert, evmSnapshot, DRE } from '../../helpers/misc-utils'; import { Signer } from 'ethers'; import { getPool, @@ -12,29 +12,29 @@ import { getWETHMocked, getVariableDebtToken, getStableDebtToken, -} from '../../../helpers/contracts-getters'; -import { eEthereumNetwork, eNetwork, tEthereumAddress } from '../../../helpers/types'; -import { Pool } from '../../../types/Pool'; -import { AaveProtocolDataProvider } from '../../../types/AaveProtocolDataProvider'; -import { MintableERC20 } from '../../../types/MintableERC20'; -import { AToken } from '../../../types/AToken'; -import { PoolConfigurator } from '../../../types/PoolConfigurator'; +} from '../../helpers/contracts-getters'; +import { eEthereumNetwork, eNetwork, tEthereumAddress } from '../../helpers/types'; +import { Pool } from '../../types/Pool'; +import { AaveProtocolDataProvider } from '../../types/AaveProtocolDataProvider'; +import { MintableERC20 } from '../../types/MintableERC20'; +import { AToken } from '../../types/AToken'; +import { PoolConfigurator } from '../../types/PoolConfigurator'; import chai from 'chai'; // @ts-ignore import bignumberChai from 'chai-bignumber'; import { almostEqual } from './almost-equal'; -import { PriceOracle } from '../../../types/PriceOracle'; -import { PoolAddressesProvider } from '../../../types/PoolAddressesProvider'; -import { PoolAddressesProviderRegistry } from '../../../types/PoolAddressesProviderRegistry'; -import { getEthersSigners } from '../../../helpers/contracts-helpers'; -import { getParamPerNetwork } from '../../../helpers/contracts-helpers'; -import { WETH9Mocked } from '../../../types/WETH9Mocked'; +import { PriceOracle } from '../../types/PriceOracle'; +import { PoolAddressesProvider } from '../../types/PoolAddressesProvider'; +import { PoolAddressesProviderRegistry } from '../../types/PoolAddressesProviderRegistry'; +import { getEthersSigners } from '../../helpers/contracts-helpers'; +import { getParamPerNetwork } from '../../helpers/contracts-helpers'; +import { WETH9Mocked } from '../../types/WETH9Mocked'; import { solidity } from 'ethereum-waffle'; -import { AaveConfig } from '../../../markets/aave'; -import { StableDebtToken, VariableDebtToken } from '../../../types'; +import { AaveConfig } from '../../markets/aave'; +import { StableDebtToken, VariableDebtToken } from '../../types'; import { HardhatRuntimeEnvironment } from 'hardhat/types'; -import { usingTenderly } from '../../../helpers/tenderly-utils'; +import { usingTenderly } from '../../helpers/tenderly-utils'; chai.use(bignumberChai()); chai.use(almostEqual()); diff --git a/test-suites/test-aave/helpers/scenario-engine.ts b/test-suites/helpers/scenario-engine.ts similarity index 97% rename from test-suites/test-aave/helpers/scenario-engine.ts rename to test-suites/helpers/scenario-engine.ts index 7ec22bd58..523e0fd87 100644 --- a/test-suites/test-aave/helpers/scenario-engine.ts +++ b/test-suites/helpers/scenario-engine.ts @@ -13,7 +13,7 @@ import { repayWithPermit, depositWithPermit, } from './actions'; -import { RateMode } from '../../../helpers/types'; +import { RateMode } from '../../helpers/types'; import { Wallet } from '@ethersproject/wallet'; export interface Action { @@ -76,8 +76,8 @@ const executeAction = async (action: Action, users: SignerWithAddress[], testEnv const user = users[parseInt(userIndex)]; - const userPrivateKey = require('../../../test-wallets.js').accounts[parseInt(userIndex) + 1] - .secretKey; + const userPrivateKey = + require('../../test-wallets.js').accounts[parseInt(userIndex) + 1].secretKey; if (!userPrivateKey) { throw new Error('INVALID_OWNER_PK'); } diff --git a/test-suites/test-aave/helpers/scenarios/borrow-negatives.json b/test-suites/helpers/scenarios/borrow-negatives.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/borrow-negatives.json rename to test-suites/helpers/scenarios/borrow-negatives.json diff --git a/test-suites/test-aave/helpers/scenarios/borrow-repay-stable.json b/test-suites/helpers/scenarios/borrow-repay-stable.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/borrow-repay-stable.json rename to test-suites/helpers/scenarios/borrow-repay-stable.json diff --git a/test-suites/test-aave/helpers/scenarios/borrow-repay-variable.json b/test-suites/helpers/scenarios/borrow-repay-variable.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/borrow-repay-variable.json rename to test-suites/helpers/scenarios/borrow-repay-variable.json diff --git a/test-suites/test-aave/helpers/scenarios/borrow-repayWithPermit-variable.json b/test-suites/helpers/scenarios/borrow-repayWithPermit-variable.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/borrow-repayWithPermit-variable.json rename to test-suites/helpers/scenarios/borrow-repayWithPermit-variable.json diff --git a/test-suites/test-aave/helpers/scenarios/credit-delegation.json b/test-suites/helpers/scenarios/credit-delegation.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/credit-delegation.json rename to test-suites/helpers/scenarios/credit-delegation.json diff --git a/test-suites/test-aave/helpers/scenarios/deposit.json b/test-suites/helpers/scenarios/deposit.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/deposit.json rename to test-suites/helpers/scenarios/deposit.json diff --git a/test-suites/test-aave/helpers/scenarios/rebalance-stable-rate.json b/test-suites/helpers/scenarios/rebalance-stable-rate.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/rebalance-stable-rate.json rename to test-suites/helpers/scenarios/rebalance-stable-rate.json diff --git a/test-suites/test-aave/helpers/scenarios/set-use-as-collateral.json b/test-suites/helpers/scenarios/set-use-as-collateral.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/set-use-as-collateral.json rename to test-suites/helpers/scenarios/set-use-as-collateral.json diff --git a/test-suites/test-aave/helpers/scenarios/swap-rate-mode.json b/test-suites/helpers/scenarios/swap-rate-mode.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/swap-rate-mode.json rename to test-suites/helpers/scenarios/swap-rate-mode.json diff --git a/test-suites/test-aave/helpers/scenarios/withdraw-negatives.json b/test-suites/helpers/scenarios/withdraw-negatives.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/withdraw-negatives.json rename to test-suites/helpers/scenarios/withdraw-negatives.json diff --git a/test-suites/test-aave/helpers/scenarios/withdraw.json b/test-suites/helpers/scenarios/withdraw.json similarity index 100% rename from test-suites/test-aave/helpers/scenarios/withdraw.json rename to test-suites/helpers/scenarios/withdraw.json diff --git a/test-suites/test-aave/helpers/utils/calculations.ts b/test-suites/helpers/utils/calculations.ts similarity index 99% rename from test-suites/test-aave/helpers/utils/calculations.ts rename to test-suites/helpers/utils/calculations.ts index 6380371a9..900d7deef 100644 --- a/test-suites/test-aave/helpers/utils/calculations.ts +++ b/test-suites/helpers/utils/calculations.ts @@ -1,11 +1,11 @@ import BigNumber from 'bignumber.js'; -import { ONE_YEAR, RAY, MAX_UINT_AMOUNT, PERCENTAGE_FACTOR } from '../../../../helpers/constants'; +import { ONE_YEAR, RAY, MAX_UINT_AMOUNT, PERCENTAGE_FACTOR } from '../../../helpers/constants'; import { IReserveParams, iAavePoolAssets, RateMode, tEthereumAddress, -} from '../../../../helpers/types'; +} from '../../../helpers/types'; import './math'; import { ReserveData, UserReserveData } from './interfaces'; import { expect } from 'chai'; diff --git a/test-suites/test-amm/helpers/utils/helpers.ts b/test-suites/helpers/utils/helpers.ts similarity index 94% rename from test-suites/test-amm/helpers/utils/helpers.ts rename to test-suites/helpers/utils/helpers.ts index c65a8931c..76daa8525 100644 --- a/test-suites/test-amm/helpers/utils/helpers.ts +++ b/test-suites/helpers/utils/helpers.ts @@ -1,4 +1,4 @@ -import { Pool } from '../../../../types/Pool'; +import { Pool } from '../../../types/Pool'; import { ReserveData, UserReserveData } from './interfaces'; import { getRateOracle, @@ -7,11 +7,11 @@ import { getAToken, getStableDebtToken, getVariableDebtToken, -} from '../../../../helpers/contracts-getters'; -import { tEthereumAddress } from '../../../../helpers/types'; +} from '../../../helpers/contracts-getters'; +import { tEthereumAddress } from '../../../helpers/types'; import BigNumber from 'bignumber.js'; -import { getDb, DRE } from '../../../../helpers/misc-utils'; -import { AaveProtocolDataProvider } from '../../../../types/AaveProtocolDataProvider'; +import { getDb, DRE } from '../../../helpers/misc-utils'; +import { AaveProtocolDataProvider } from '../../../types/AaveProtocolDataProvider'; export const getReserveData = async ( helper: AaveProtocolDataProvider, diff --git a/test-suites/test-aave/helpers/utils/interfaces/index.ts b/test-suites/helpers/utils/interfaces/index.ts similarity index 100% rename from test-suites/test-aave/helpers/utils/interfaces/index.ts rename to test-suites/helpers/utils/interfaces/index.ts diff --git a/test-suites/test-aave/helpers/utils/math.ts b/test-suites/helpers/utils/math.ts similarity index 98% rename from test-suites/test-aave/helpers/utils/math.ts rename to test-suites/helpers/utils/math.ts index 27ea0531e..efd296e0b 100644 --- a/test-suites/test-aave/helpers/utils/math.ts +++ b/test-suites/helpers/utils/math.ts @@ -7,7 +7,7 @@ import { WAD_RAY_RATIO, HALF_PERCENTAGE, PERCENTAGE_FACTOR, -} from '../../../../helpers/constants'; +} from '../../../helpers/constants'; declare module 'bignumber.js' { interface BigNumber { diff --git a/test-suites/test-aave/liquidation-atoken.spec.ts b/test-suites/liquidation-atoken.spec.ts similarity index 98% rename from test-suites/test-aave/liquidation-atoken.spec.ts rename to test-suites/liquidation-atoken.spec.ts index 4a277182b..12d062088 100644 --- a/test-suites/test-aave/liquidation-atoken.spec.ts +++ b/test-suites/liquidation-atoken.spec.ts @@ -1,10 +1,10 @@ import BigNumber from 'bignumber.js'; -import { DRE } from '../../helpers/misc-utils'; -import { APPROVAL_AMOUNT_POOL, oneEther } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; +import { DRE } from '../helpers/misc-utils'; +import { APPROVAL_AMOUNT_POOL, oneEther } from '../helpers/constants'; +import { convertToCurrencyDecimals } from '../helpers/contracts-helpers'; import { makeSuite } from './helpers/make-suite'; -import { ProtocolErrors, RateMode } from '../../helpers/types'; +import { ProtocolErrors, RateMode } from '../helpers/types'; import { calcExpectedVariableDebtTokenBalance } from './helpers/utils/calculations'; import { getUserData, getReserveData } from './helpers/utils/helpers'; diff --git a/test-suites/test-aave/liquidation-underlying.spec.ts b/test-suites/liquidation-underlying.spec.ts similarity index 98% rename from test-suites/test-aave/liquidation-underlying.spec.ts rename to test-suites/liquidation-underlying.spec.ts index 5e9b54965..1178c1f55 100644 --- a/test-suites/test-aave/liquidation-underlying.spec.ts +++ b/test-suites/liquidation-underlying.spec.ts @@ -1,13 +1,13 @@ import BigNumber from 'bignumber.js'; -import { DRE, increaseTime } from '../../helpers/misc-utils'; -import { APPROVAL_AMOUNT_POOL, oneEther } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; +import { DRE, increaseTime } from '../helpers/misc-utils'; +import { APPROVAL_AMOUNT_POOL, oneEther } from '../helpers/constants'; +import { convertToCurrencyDecimals } from '../helpers/contracts-helpers'; import { makeSuite } from './helpers/make-suite'; -import { ProtocolErrors, RateMode } from '../../helpers/types'; +import { ProtocolErrors, RateMode } from '../helpers/types'; import { calcExpectedStableDebtTokenBalance } from './helpers/utils/calculations'; import { getUserData } from './helpers/utils/helpers'; -import { CommonsConfig } from '../../markets/aave/commons'; +import { CommonsConfig } from '../markets/aave/commons'; import { parseEther } from 'ethers/lib/utils'; diff --git a/test-suites/test-aave/ltv-validation.spec.ts b/test-suites/ltv-validation.spec.ts similarity index 93% rename from test-suites/test-aave/ltv-validation.spec.ts rename to test-suites/ltv-validation.spec.ts index f32115b3b..26fda5f8b 100644 --- a/test-suites/test-aave/ltv-validation.spec.ts +++ b/test-suites/ltv-validation.spec.ts @@ -1,7 +1,7 @@ import { TestEnv, makeSuite } from './helpers/make-suite'; -import { MAX_UINT_AMOUNT } from '../../helpers/constants'; -import { ProtocolErrors } from '../../helpers/types'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; +import { MAX_UINT_AMOUNT } from '../helpers/constants'; +import { ProtocolErrors } from '../helpers/types'; +import { convertToCurrencyDecimals } from '../helpers/contracts-helpers'; const { expect } = require('chai'); makeSuite('LTV validation tests', (testEnv: TestEnv) => { diff --git a/test-suites/test-aave/mint-to-treasury.spec.ts b/test-suites/mint-to-treasury.spec.ts similarity index 91% rename from test-suites/test-aave/mint-to-treasury.spec.ts rename to test-suites/mint-to-treasury.spec.ts index 531455619..143e3c698 100644 --- a/test-suites/test-aave/mint-to-treasury.spec.ts +++ b/test-suites/mint-to-treasury.spec.ts @@ -1,9 +1,9 @@ import { makeSuite, TestEnv } from './helpers/make-suite'; -import { RateMode } from '../../helpers/types'; -import { APPROVAL_AMOUNT_POOL, ONE_YEAR } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; +import { RateMode } from '../helpers/types'; +import { APPROVAL_AMOUNT_POOL, ONE_YEAR } from '../helpers/constants'; +import { convertToCurrencyDecimals } from '../helpers/contracts-helpers'; import { BigNumber } from 'bignumber.js'; -import { advanceTimeAndBlock, waitForTx } from '../../helpers/misc-utils'; +import { advanceTimeAndBlock, waitForTx } from '../helpers/misc-utils'; import './helpers/utils/math'; const { expect } = require('chai'); diff --git a/test-suites/test-aave/pausable-functions.spec.ts b/test-suites/pausable-functions.spec.ts similarity index 96% rename from test-suites/test-aave/pausable-functions.spec.ts rename to test-suites/pausable-functions.spec.ts index 7cd51400a..a65ae2b5c 100644 --- a/test-suites/test-aave/pausable-functions.spec.ts +++ b/test-suites/pausable-functions.spec.ts @@ -1,11 +1,11 @@ import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors, RateMode } from '../../helpers/types'; -import { APPROVAL_AMOUNT_POOL, oneEther } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; +import { ProtocolErrors, RateMode } from '../helpers/types'; +import { APPROVAL_AMOUNT_POOL, oneEther } from '../helpers/constants'; +import { convertToCurrencyDecimals } from '../helpers/contracts-helpers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { BigNumber } from 'bignumber.js'; -import { MockFlashLoanReceiver } from '../../types/MockFlashLoanReceiver'; -import { getMockFlashLoanReceiver } from '../../helpers/contracts-getters'; +import { MockFlashLoanReceiver } from '../types/MockFlashLoanReceiver'; +import { getMockFlashLoanReceiver } from '../helpers/contracts-getters'; const { expect } = require('chai'); diff --git a/test-suites/test-amm/pool-addresses-provider.spec.ts b/test-suites/pool-addresses-provider.spec.ts similarity index 92% rename from test-suites/test-amm/pool-addresses-provider.spec.ts rename to test-suites/pool-addresses-provider.spec.ts index dacfb51e2..f7e0367af 100644 --- a/test-suites/test-amm/pool-addresses-provider.spec.ts +++ b/test-suites/pool-addresses-provider.spec.ts @@ -1,11 +1,11 @@ import { expect } from 'chai'; -import { createRandomAddress } from '../../helpers/misc-utils'; +import { createRandomAddress } from '../helpers/misc-utils'; import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors } from '../../helpers/types'; +import { ProtocolErrors } from '../helpers/types'; import { ethers } from 'ethers'; -import { ZERO_ADDRESS } from '../../helpers/constants'; -import { waitForTx } from '../../helpers/misc-utils'; -import { deployPool } from '../../helpers/contracts-deployments'; +import { ZERO_ADDRESS } from '../helpers/constants'; +import { waitForTx } from '../helpers/misc-utils'; +import { deployPool } from '../helpers/contracts-deployments'; const { utils } = ethers; diff --git a/test-suites/test-aave/rate-strategy.spec.ts b/test-suites/rate-strategy.spec.ts similarity index 95% rename from test-suites/test-aave/rate-strategy.spec.ts rename to test-suites/rate-strategy.spec.ts index 4e41ca4bc..280d12578 100644 --- a/test-suites/test-aave/rate-strategy.spec.ts +++ b/test-suites/rate-strategy.spec.ts @@ -1,11 +1,11 @@ import { TestEnv, makeSuite } from './helpers/make-suite'; -import { deployDefaultReserveInterestRateStrategy } from '../../helpers/contracts-deployments'; +import { deployDefaultReserveInterestRateStrategy } from '../helpers/contracts-deployments'; -import { APPROVAL_AMOUNT_POOL, PERCENTAGE_FACTOR, RAY } from '../../helpers/constants'; +import { APPROVAL_AMOUNT_POOL, PERCENTAGE_FACTOR, RAY } from '../helpers/constants'; -import { rateStrategyStableOne } from '../../markets/aave/rateStrategies'; +import { rateStrategyStableOne } from '../markets/aave/rateStrategies'; -import { strategyDAI } from '../../markets/aave/reservesConfigs'; +import { strategyDAI } from '../markets/aave/reservesConfigs'; import { AToken, DefaultReserveInterestRateStrategy, MintableERC20 } from '../../types'; import BigNumber from 'bignumber.js'; import './helpers/utils/math'; diff --git a/test-suites/test-aave/reserve-pause.spec.ts b/test-suites/reserve-pause.spec.ts similarity index 96% rename from test-suites/test-aave/reserve-pause.spec.ts rename to test-suites/reserve-pause.spec.ts index 9da2d9bb1..a680a5cac 100644 --- a/test-suites/test-aave/reserve-pause.spec.ts +++ b/test-suites/reserve-pause.spec.ts @@ -1,11 +1,11 @@ import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors, RateMode } from '../../helpers/types'; -import { APPROVAL_AMOUNT_POOL, oneEther } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; +import { ProtocolErrors, RateMode } from '../helpers/types'; +import { APPROVAL_AMOUNT_POOL, oneEther } from '../helpers/constants'; +import { convertToCurrencyDecimals } from '../helpers/contracts-helpers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { BigNumber } from 'bignumber.js'; -import { MockFlashLoanReceiver } from '../../types/MockFlashLoanReceiver'; -import { getMockFlashLoanReceiver } from '../../helpers/contracts-getters'; +import { MockFlashLoanReceiver } from '../types/MockFlashLoanReceiver'; +import { getMockFlashLoanReceiver } from '../helpers/contracts-getters'; const { expect } = require('chai'); diff --git a/test-suites/test-aave/scenario.spec.ts b/test-suites/scenario.spec.ts similarity index 87% rename from test-suites/test-aave/scenario.spec.ts rename to test-suites/scenario.spec.ts index 8eeb0a95d..f7e3bac7a 100644 --- a/test-suites/test-aave/scenario.spec.ts +++ b/test-suites/scenario.spec.ts @@ -4,11 +4,11 @@ import { configuration as calculationsConfiguration } from './helpers/utils/calc import fs from 'fs'; import BigNumber from 'bignumber.js'; import { makeSuite } from './helpers/make-suite'; -import { getReservesConfigByPool } from '../../helpers/configuration'; -import { AavePools, iAavePoolAssets, IReserveParams } from '../../helpers/types'; +import { getReservesConfigByPool } from '../helpers/configuration'; +import { AavePools, iAavePoolAssets, IReserveParams } from '../helpers/types'; import { executeStory } from './helpers/scenario-engine'; -const scenarioFolder = './test-suites/test-aave/helpers/scenarios/'; +const scenarioFolder = './test-suites/helpers/scenarios/'; const selectedScenarios: string[] = []; diff --git a/test-suites/test-aave/stable-rate-economy.spec.ts b/test-suites/stable-rate-economy.spec.ts similarity index 100% rename from test-suites/test-aave/stable-rate-economy.spec.ts rename to test-suites/stable-rate-economy.spec.ts diff --git a/test-suites/test-aave/stable-token.spec.ts b/test-suites/stable-token.spec.ts similarity index 91% rename from test-suites/test-aave/stable-token.spec.ts rename to test-suites/stable-token.spec.ts index e141f2864..281440640 100644 --- a/test-suites/test-aave/stable-token.spec.ts +++ b/test-suites/stable-token.spec.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors } from '../../helpers/types'; -import { getStableDebtToken } from '../../helpers/contracts-getters'; +import { ProtocolErrors } from '../helpers/types'; +import { getStableDebtToken } from '../helpers/contracts-getters'; makeSuite('Stable debt token tests', (testEnv: TestEnv) => { const { CT_CALLER_MUST_BE_POOL } = ProtocolErrors; diff --git a/test-suites/test-aave/subgraph-scenarios.spec.ts b/test-suites/subgraph-scenarios.spec.ts similarity index 88% rename from test-suites/test-aave/subgraph-scenarios.spec.ts rename to test-suites/subgraph-scenarios.spec.ts index 24959a418..27f0b9944 100644 --- a/test-suites/test-aave/subgraph-scenarios.spec.ts +++ b/test-suites/subgraph-scenarios.spec.ts @@ -3,8 +3,8 @@ import { configuration as calculationsConfiguration } from './helpers/utils/calc import BigNumber from 'bignumber.js'; import { makeSuite } from './helpers/make-suite'; -import { getReservesConfigByPool } from '../../helpers/configuration'; -import { AavePools, iAavePoolAssets, IReserveParams } from '../../helpers/types'; +import { getReservesConfigByPool } from '../helpers/configuration'; +import { AavePools, iAavePoolAssets, IReserveParams } from '../helpers/types'; import { executeStory } from './helpers/scenario-engine'; makeSuite('Subgraph scenario tests', async (testEnv) => { diff --git a/test-suites/test-aave/supply-cap.spec.ts b/test-suites/supply-cap.spec.ts similarity index 97% rename from test-suites/test-aave/supply-cap.spec.ts rename to test-suites/supply-cap.spec.ts index 4f7b23398..41e75f479 100644 --- a/test-suites/test-aave/supply-cap.spec.ts +++ b/test-suites/supply-cap.spec.ts @@ -1,12 +1,7 @@ import { TestEnv, makeSuite } from './helpers/make-suite'; -import { - APPROVAL_AMOUNT_POOL, - MAX_UINT_AMOUNT, - RAY, - MAX_SUPPLY_CAP, -} from '../../helpers/constants'; -import { ProtocolErrors } from '../../helpers/types'; -import { MintableERC20, WETH9, WETH9Mocked } from '../../types'; +import { APPROVAL_AMOUNT_POOL, MAX_UINT_AMOUNT, RAY, MAX_SUPPLY_CAP } from '../helpers/constants'; +import { ProtocolErrors } from '../helpers/types'; +import { MintableERC20, WETH9, WETH9Mocked } from '../types'; import { parseEther } from '@ethersproject/units'; import { BigNumber } from '@ethersproject/bignumber'; diff --git a/test-suites/test-aave/atoken-permit.spec.ts b/test-suites/test-aave/atoken-permit.spec.ts deleted file mode 100644 index 24e8b39cb..000000000 --- a/test-suites/test-aave/atoken-permit.spec.ts +++ /dev/null @@ -1,312 +0,0 @@ -import { MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../../helpers/constants'; -import { BUIDLEREVM_CHAINID } from '../../helpers/buidler-constants'; -import { buildPermitParams, getSignatureFromTypedData } from '../../helpers/contracts-helpers'; -import { expect } from 'chai'; -import { ethers } from 'ethers'; -import { makeSuite, TestEnv } from './helpers/make-suite'; -import { DRE } from '../../helpers/misc-utils'; -import { waitForTx } from '../../helpers/misc-utils'; -import { _TypedDataEncoder } from 'ethers/lib/utils'; - -const { parseEther } = ethers.utils; - -makeSuite('AToken: Permit', (testEnv: TestEnv) => { - it('Checks the domain separator', async () => { - const { aDai } = testEnv; - const separator = await aDai.DOMAIN_SEPARATOR(); - - const domain = { - name: await aDai.name(), - version: '1', - chainId: DRE.network.config.chainId, - verifyingContract: aDai.address, - }; - const domainSeparator = _TypedDataEncoder.hashDomain(domain); - - expect(separator).to.be.equal(domainSeparator, 'Invalid domain separator'); - }); - - it('Get aDAI for tests', async () => { - const { dai, pool, deployer } = testEnv; - - await dai.mint(parseEther('20000')); - await dai.approve(pool.address, parseEther('20000')); - - await pool.deposit(dai.address, parseEther('20000'), deployer.address, 0); - }); - - it('Reverts submitting a permit with 0 expiration', async () => { - const { aDai, deployer, users } = testEnv; - const owner = deployer; - const spender = users[1]; - - const tokenName = await aDai.name(); - - const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; - const expiration = 0; - const nonce = (await aDai._nonces(owner.address)).toNumber(); - const permitAmount = ethers.utils.parseEther('2').toString(); - const msgParams = buildPermitParams( - chainId, - aDai.address, - '1', - tokenName, - owner.address, - spender.address, - nonce, - permitAmount, - expiration.toFixed() - ); - - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; - if (!ownerPrivateKey) { - throw new Error('INVALID_OWNER_PK'); - } - - expect((await aDai.allowance(owner.address, spender.address)).toString()).to.be.equal( - '0', - 'INVALID_ALLOWANCE_BEFORE_PERMIT' - ); - - const { v, r, s } = getSignatureFromTypedData(ownerPrivateKey, msgParams); - - await expect( - aDai - .connect(spender.signer) - .permit(owner.address, spender.address, permitAmount, expiration, v, r, s) - ).to.be.revertedWith('INVALID_EXPIRATION'); - - expect((await aDai.allowance(owner.address, spender.address)).toString()).to.be.equal( - '0', - 'INVALID_ALLOWANCE_AFTER_PERMIT' - ); - }); - - it('Submits a permit with maximum expiration length', async () => { - const { aDai, deployer, users } = testEnv; - const owner = deployer; - const spender = users[1]; - - const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; - const deadline = MAX_UINT_AMOUNT; - const nonce = (await aDai._nonces(owner.address)).toNumber(); - const permitAmount = parseEther('2').toString(); - const msgParams = buildPermitParams( - chainId, - aDai.address, - '1', - await aDai.name(), - owner.address, - spender.address, - nonce, - deadline, - permitAmount - ); - - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; - if (!ownerPrivateKey) { - throw new Error('INVALID_OWNER_PK'); - } - - expect((await aDai.allowance(owner.address, spender.address)).toString()).to.be.equal( - '0', - 'INVALID_ALLOWANCE_BEFORE_PERMIT' - ); - - const { v, r, s } = getSignatureFromTypedData(ownerPrivateKey, msgParams); - - await waitForTx( - await aDai - .connect(spender.signer) - .permit(owner.address, spender.address, permitAmount, deadline, v, r, s) - ); - - expect((await aDai._nonces(owner.address)).toNumber()).to.be.equal(1); - }); - - it('Cancels the previous permit', async () => { - const { aDai, deployer, users } = testEnv; - const owner = deployer; - const spender = users[1]; - - const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; - const deadline = MAX_UINT_AMOUNT; - const nonce = (await aDai._nonces(owner.address)).toNumber(); - const permitAmount = '0'; - const msgParams = buildPermitParams( - chainId, - aDai.address, - '1', - await aDai.name(), - owner.address, - spender.address, - nonce, - deadline, - permitAmount - ); - - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; - if (!ownerPrivateKey) { - throw new Error('INVALID_OWNER_PK'); - } - - const { v, r, s } = getSignatureFromTypedData(ownerPrivateKey, msgParams); - - expect((await aDai.allowance(owner.address, spender.address)).toString()).to.be.equal( - ethers.utils.parseEther('2'), - 'INVALID_ALLOWANCE_BEFORE_PERMIT' - ); - - await waitForTx( - await aDai - .connect(spender.signer) - .permit(owner.address, spender.address, permitAmount, deadline, v, r, s) - ); - expect((await aDai.allowance(owner.address, spender.address)).toString()).to.be.equal( - permitAmount, - 'INVALID_ALLOWANCE_AFTER_PERMIT' - ); - - expect((await aDai._nonces(owner.address)).toNumber()).to.be.equal(2); - }); - - it('Tries to submit a permit with invalid nonce', async () => { - const { aDai, deployer, users } = testEnv; - const owner = deployer; - const spender = users[1]; - - const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; - const deadline = MAX_UINT_AMOUNT; - const nonce = 1000; - const permitAmount = '0'; - const msgParams = buildPermitParams( - chainId, - aDai.address, - '1', - await aDai.name(), - owner.address, - spender.address, - nonce, - deadline, - permitAmount - ); - - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; - if (!ownerPrivateKey) { - throw new Error('INVALID_OWNER_PK'); - } - - const { v, r, s } = getSignatureFromTypedData(ownerPrivateKey, msgParams); - - await expect( - aDai - .connect(spender.signer) - .permit(owner.address, spender.address, permitAmount, deadline, v, r, s) - ).to.be.revertedWith('INVALID_SIGNATURE'); - }); - - it('Tries to submit a permit with invalid expiration (previous to the current block)', async () => { - const { aDai, deployer, users } = testEnv; - const owner = deployer; - const spender = users[1]; - - const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; - const expiration = '1'; - const nonce = (await aDai._nonces(owner.address)).toNumber(); - const permitAmount = '0'; - const msgParams = buildPermitParams( - chainId, - aDai.address, - '1', - await aDai.name(), - owner.address, - spender.address, - nonce, - expiration, - permitAmount - ); - - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; - if (!ownerPrivateKey) { - throw new Error('INVALID_OWNER_PK'); - } - - const { v, r, s } = getSignatureFromTypedData(ownerPrivateKey, msgParams); - - await expect( - aDai - .connect(spender.signer) - .permit(owner.address, spender.address, expiration, permitAmount, v, r, s) - ).to.be.revertedWith('INVALID_EXPIRATION'); - }); - - it('Tries to submit a permit with invalid signature', async () => { - const { aDai, deployer, users } = testEnv; - const owner = deployer; - const spender = users[1]; - - const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; - const deadline = MAX_UINT_AMOUNT; - const nonce = (await aDai._nonces(owner.address)).toNumber(); - const permitAmount = '0'; - const msgParams = buildPermitParams( - chainId, - aDai.address, - '1', - await aDai.name(), - owner.address, - spender.address, - nonce, - deadline, - permitAmount - ); - - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; - if (!ownerPrivateKey) { - throw new Error('INVALID_OWNER_PK'); - } - - const { v, r, s } = getSignatureFromTypedData(ownerPrivateKey, msgParams); - - await expect( - aDai - .connect(spender.signer) - .permit(owner.address, ZERO_ADDRESS, permitAmount, deadline, v, r, s) - ).to.be.revertedWith('INVALID_SIGNATURE'); - }); - - it('Tries to submit a permit with invalid owner', async () => { - const { aDai, deployer, users } = testEnv; - const owner = deployer; - const spender = users[1]; - - const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; - const expiration = MAX_UINT_AMOUNT; - const nonce = (await aDai._nonces(owner.address)).toNumber(); - const permitAmount = '0'; - const msgParams = buildPermitParams( - chainId, - aDai.address, - '1', - await aDai.name(), - owner.address, - spender.address, - nonce, - expiration, - permitAmount - ); - - const ownerPrivateKey = require('../../test-wallets.js').accounts[0].secretKey; - if (!ownerPrivateKey) { - throw new Error('INVALID_OWNER_PK'); - } - - const { v, r, s } = getSignatureFromTypedData(ownerPrivateKey, msgParams); - - await expect( - aDai - .connect(spender.signer) - .permit(ZERO_ADDRESS, spender.address, expiration, permitAmount, v, r, s) - ).to.be.revertedWith('INVALID_OWNER'); - }); -}); diff --git a/test-suites/test-aave/helpers/utils/helpers.ts b/test-suites/test-aave/helpers/utils/helpers.ts deleted file mode 100644 index c65a8931c..000000000 --- a/test-suites/test-aave/helpers/utils/helpers.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { Pool } from '../../../../types/Pool'; -import { ReserveData, UserReserveData } from './interfaces'; -import { - getRateOracle, - getIErc20Detailed, - getMintableERC20, - getAToken, - getStableDebtToken, - getVariableDebtToken, -} from '../../../../helpers/contracts-getters'; -import { tEthereumAddress } from '../../../../helpers/types'; -import BigNumber from 'bignumber.js'; -import { getDb, DRE } from '../../../../helpers/misc-utils'; -import { AaveProtocolDataProvider } from '../../../../types/AaveProtocolDataProvider'; - -export const getReserveData = async ( - helper: AaveProtocolDataProvider, - reserve: tEthereumAddress -): Promise => { - const [reserveData, tokenAddresses, rateOracle, token] = await Promise.all([ - helper.getReserveData(reserve), - helper.getReserveTokensAddresses(reserve), - getRateOracle(), - getIErc20Detailed(reserve), - ]); - - const stableDebtToken = await getStableDebtToken(tokenAddresses.stableDebtTokenAddress); - const variableDebtToken = await getVariableDebtToken(tokenAddresses.variableDebtTokenAddress); - - const { 0: principalStableDebt } = await stableDebtToken.getSupplyData(); - const totalStableDebtLastUpdated = await stableDebtToken.getTotalSupplyLastUpdated(); - - const scaledVariableDebt = await variableDebtToken.scaledTotalSupply(); - - const rate = (await rateOracle.getMarketBorrowRate(reserve)).toString(); - const symbol = await token.symbol(); - const decimals = new BigNumber(await token.decimals()); - - const totalLiquidity = new BigNumber(reserveData.availableLiquidity.toString()) - .plus(reserveData.totalStableDebt.toString()) - .plus(reserveData.totalVariableDebt.toString()); - - const utilizationRate = new BigNumber( - totalLiquidity.eq(0) - ? 0 - : new BigNumber(reserveData.totalStableDebt.toString()) - .plus(reserveData.totalVariableDebt.toString()) - .rayDiv(totalLiquidity) - ); - - return { - totalLiquidity, - utilizationRate, - availableLiquidity: new BigNumber(reserveData.availableLiquidity.toString()), - totalStableDebt: new BigNumber(reserveData.totalStableDebt.toString()), - totalVariableDebt: new BigNumber(reserveData.totalVariableDebt.toString()), - liquidityRate: new BigNumber(reserveData.liquidityRate.toString()), - variableBorrowRate: new BigNumber(reserveData.variableBorrowRate.toString()), - stableBorrowRate: new BigNumber(reserveData.stableBorrowRate.toString()), - averageStableBorrowRate: new BigNumber(reserveData.averageStableBorrowRate.toString()), - liquidityIndex: new BigNumber(reserveData.liquidityIndex.toString()), - variableBorrowIndex: new BigNumber(reserveData.variableBorrowIndex.toString()), - lastUpdateTimestamp: new BigNumber(reserveData.lastUpdateTimestamp), - totalStableDebtLastUpdated: new BigNumber(totalStableDebtLastUpdated), - principalStableDebt: new BigNumber(principalStableDebt.toString()), - scaledVariableDebt: new BigNumber(scaledVariableDebt.toString()), - address: reserve, - aTokenAddress: tokenAddresses.aTokenAddress, - symbol, - decimals, - marketStableRate: new BigNumber(rate), - }; -}; - -export const getUserData = async ( - pool: Pool, - helper: AaveProtocolDataProvider, - reserve: string, - user: tEthereumAddress, - sender?: tEthereumAddress -): Promise => { - const [userData, scaledATokenBalance] = await Promise.all([ - helper.getUserReserveData(reserve, user), - getATokenUserData(reserve, user, helper), - ]); - - const token = await getMintableERC20(reserve); - const walletBalance = new BigNumber((await token.balanceOf(sender || user)).toString()); - - return { - scaledATokenBalance: new BigNumber(scaledATokenBalance), - currentATokenBalance: new BigNumber(userData.currentATokenBalance.toString()), - currentStableDebt: new BigNumber(userData.currentStableDebt.toString()), - currentVariableDebt: new BigNumber(userData.currentVariableDebt.toString()), - principalStableDebt: new BigNumber(userData.principalStableDebt.toString()), - scaledVariableDebt: new BigNumber(userData.scaledVariableDebt.toString()), - stableBorrowRate: new BigNumber(userData.stableBorrowRate.toString()), - liquidityRate: new BigNumber(userData.liquidityRate.toString()), - usageAsCollateralEnabled: userData.usageAsCollateralEnabled, - stableRateLastUpdated: new BigNumber(userData.stableRateLastUpdated.toString()), - walletBalance, - }; -}; - -export const getReserveAddressFromSymbol = async (symbol: string) => { - const token = await getMintableERC20( - ( - await getDb().get(`${symbol}.${DRE.network.name}`).value() - ).address - ); - - if (!token) { - throw `Could not find instance for contract ${symbol}`; - } - return token.address; -}; - -const getATokenUserData = async ( - reserve: string, - user: string, - helpersContract: AaveProtocolDataProvider -) => { - const aTokenAddress: string = (await helpersContract.getReserveTokensAddresses(reserve)) - .aTokenAddress; - - const aToken = await getAToken(aTokenAddress); - - const scaledBalance = await aToken.scaledBalanceOf(user); - return scaledBalance.toString(); -}; diff --git a/test-suites/test-aave/pool-addresses-provider.spec.ts b/test-suites/test-aave/pool-addresses-provider.spec.ts deleted file mode 100644 index dacfb51e2..000000000 --- a/test-suites/test-aave/pool-addresses-provider.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { expect } from 'chai'; -import { createRandomAddress } from '../../helpers/misc-utils'; -import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors } from '../../helpers/types'; -import { ethers } from 'ethers'; -import { ZERO_ADDRESS } from '../../helpers/constants'; -import { waitForTx } from '../../helpers/misc-utils'; -import { deployPool } from '../../helpers/contracts-deployments'; - -const { utils } = ethers; - -makeSuite('PoolAddressesProvider', (testEnv: TestEnv) => { - it('Test the accessibility of the PoolAddressesProvider', async () => { - const { addressesProvider, users } = testEnv; - const mockAddress = createRandomAddress(); - const { INVALID_OWNER_REVERT_MSG } = ProtocolErrors; - - await addressesProvider.transferOwnership(users[1].address); - - for (const contractFunction of [ - addressesProvider.setMarketId, - addressesProvider.setPoolImpl, - addressesProvider.setPoolConfiguratorImpl, - addressesProvider.setPoolCollateralManager, - addressesProvider.setPoolAdmin, - addressesProvider.setPriceOracle, - addressesProvider.setRateOracle, - ]) { - await expect(contractFunction(mockAddress)).to.be.revertedWith(INVALID_OWNER_REVERT_MSG); - } - - await expect( - addressesProvider.setAddress(utils.keccak256(utils.toUtf8Bytes('RANDOM_ID')), mockAddress) - ).to.be.revertedWith(INVALID_OWNER_REVERT_MSG); - - await expect( - addressesProvider.setAddressAsProxy( - utils.keccak256(utils.toUtf8Bytes('RANDOM_ID')), - mockAddress - ) - ).to.be.revertedWith(INVALID_OWNER_REVERT_MSG); - }); - - it('Tests adding a proxied address with `setAddressAsProxy()`', async () => { - const { addressesProvider, users } = testEnv; - const { INVALID_OWNER_REVERT_MSG } = ProtocolErrors; - - const currentAddressesProviderOwner = users[1]; - - const mockPool = await deployPool(); - const proxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_PROXIED')); - - const proxiedAddressSetReceipt = await waitForTx( - await addressesProvider - .connect(currentAddressesProviderOwner.signer) - .setAddressAsProxy(proxiedAddressId, mockPool.address) - ); - - if (!proxiedAddressSetReceipt.events || proxiedAddressSetReceipt.events?.length < 1) { - throw new Error('INVALID_EVENT_EMMITED'); - } - - expect(proxiedAddressSetReceipt.events[0].event).to.be.equal('ProxyCreated'); - expect(proxiedAddressSetReceipt.events[1].event).to.be.equal('AddressSet'); - expect(proxiedAddressSetReceipt.events[1].args?.id).to.be.equal(proxiedAddressId); - expect(proxiedAddressSetReceipt.events[1].args?.newAddress).to.be.equal(mockPool.address); - expect(proxiedAddressSetReceipt.events[1].args?.hasProxy).to.be.equal(true); - }); - - it('Tests adding a non proxied address with `setAddress()`', async () => { - const { addressesProvider, users } = testEnv; - const { INVALID_OWNER_REVERT_MSG } = ProtocolErrors; - - const currentAddressesProviderOwner = users[1]; - const mockNonProxiedAddress = createRandomAddress(); - const nonProxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_NON_PROXIED')); - - const nonProxiedAddressSetReceipt = await waitForTx( - await addressesProvider - .connect(currentAddressesProviderOwner.signer) - .setAddress(nonProxiedAddressId, mockNonProxiedAddress) - ); - - expect(mockNonProxiedAddress.toLowerCase()).to.be.equal( - (await addressesProvider.getAddress(nonProxiedAddressId)).toLowerCase() - ); - - if (!nonProxiedAddressSetReceipt.events || nonProxiedAddressSetReceipt.events?.length < 1) { - throw new Error('INVALID_EVENT_EMMITED'); - } - - expect(nonProxiedAddressSetReceipt.events[0].event).to.be.equal('AddressSet'); - expect(nonProxiedAddressSetReceipt.events[0].args?.id).to.be.equal(nonProxiedAddressId); - expect(nonProxiedAddressSetReceipt.events[0].args?.newAddress).to.be.equal( - mockNonProxiedAddress - ); - expect(nonProxiedAddressSetReceipt.events[0].args?.hasProxy).to.be.equal(false); - }); -}); diff --git a/test-suites/test-amm/__setup.spec.ts b/test-suites/test-amm/__setup.spec.ts deleted file mode 100644 index df67f2ba4..000000000 --- a/test-suites/test-amm/__setup.spec.ts +++ /dev/null @@ -1,281 +0,0 @@ -import rawBRE from 'hardhat'; -import { MockContract } from 'ethereum-waffle'; -import { - insertContractAddressInDb, - getEthersSigners, - registerContractInJsonDb, - getEthersSignersAddresses, -} from '../../helpers/contracts-helpers'; -import { - deployPoolAddressesProvider, - deployMintableERC20, - deployPoolAddressesProviderRegistry, - deployPoolConfigurator, - deployPool, - deployPriceOracle, - deployAaveOracle, - deployPoolCollateralManager, - deployMockFlashLoanReceiver, - deployAaveProtocolDataProvider, - deployRateOracle, - deployStableAndVariableTokensHelper, - deployATokensAndRatesHelper, - deployWETHMocked, - deployMockUniswapRouter, -} from '../../helpers/contracts-deployments'; -import { ethers, Signer } from 'ethers'; -import { TokenContractId, eContractid, tEthereumAddress, AavePools } from '../../helpers/types'; -import { MintableERC20 } from '../../types/MintableERC20'; -import { - ConfigNames, - getReservesConfigByPool, - getTreasuryAddress, - loadPoolConfig, -} from '../../helpers/configuration'; -import { initializeMakeSuite } from './helpers/make-suite'; - -import { - setInitialAssetPricesInOracle, - deployAllMockAggregators, - setInitialMarketRatesInRatesOracleByHelper, -} from '../../helpers/oracles-helpers'; -import { DRE, waitForTx } from '../../helpers/misc-utils'; -import { initReservesByHelper, configureReservesByHelper } from '../../helpers/init-helpers'; -import AmmConfig from '../../markets/amm'; -import { ZERO_ADDRESS } from '../../helpers/constants'; -import { - getPool, - getPoolConfiguratorProxy, - getPairsTokenAggregator, -} from '../../helpers/contracts-getters'; -import { WETH9Mocked } from '../../types/WETH9Mocked'; - -const MOCK_USD_PRICE_IN_WEI = AmmConfig.ProtocolGlobalParams.MockUsdPriceInWei; -const ALL_ASSETS_INITIAL_PRICES = AmmConfig.Mocks.AllAssetsInitialPrices; -const USD_ADDRESS = AmmConfig.ProtocolGlobalParams.UsdAddress; -const MOCK_CHAINLINK_AGGREGATORS_PRICES = AmmConfig.Mocks.AllAssetsInitialPrices; -const RATE_ORACLE_RATES_COMMON = AmmConfig.RateOracleRatesCommon; - -const deployAllMockTokens = async (deployer: Signer) => { - const tokens: { [symbol: string]: MockContract | MintableERC20 | WETH9Mocked } = {}; - - const ammConfigData = getReservesConfigByPool(AavePools.amm); - - for (const tokenSymbol of Object.keys(TokenContractId)) { - if (tokenSymbol === 'WETH') { - tokens[tokenSymbol] = await deployWETHMocked(); - await registerContractInJsonDb('WETH', tokens[tokenSymbol]); - continue; - } - let decimals = 18; - - let configData = (ammConfigData)[tokenSymbol]; - - if (!configData) { - decimals = 18; - } - - tokens[tokenSymbol] = await deployMintableERC20([ - tokenSymbol, - tokenSymbol, - configData ? configData.reserveDecimals : 18, - ]); - await registerContractInJsonDb(tokenSymbol.toUpperCase(), tokens[tokenSymbol]); - } - - return tokens; -}; - -const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { - console.time('setup'); - const aaveAdmin = await deployer.getAddress(); - - const mockTokens = await deployAllMockTokens(deployer); - - const addressesProvider = await deployPoolAddressesProvider(AmmConfig.MarketId); - await waitForTx(await addressesProvider.setPoolAdmin(aaveAdmin)); - - //setting users[1] as emergency admin, which is in position 2 in the DRE addresses list - const addressList = await getEthersSignersAddresses(); - - await waitForTx(await addressesProvider.setEmergencyAdmin(addressList[2])); - - const addressesProviderRegistry = await deployPoolAddressesProviderRegistry(); - await waitForTx( - await addressesProviderRegistry.registerAddressesProvider(addressesProvider.address, 1) - ); - - const poolImpl = await deployPool(); - - await waitForTx(await addressesProvider.setPoolImpl(poolImpl.address)); - - const poolAddress = await addressesProvider.getPool(); - const poolProxy = await getPool(poolAddress); - - await insertContractAddressInDb(eContractid.Pool, poolProxy.address); - - const poolConfiguratorImpl = await deployPoolConfigurator(); - await waitForTx(await addressesProvider.setPoolConfiguratorImpl(poolConfiguratorImpl.address)); - const poolConfiguratorProxy = await getPoolConfiguratorProxy( - await addressesProvider.getPoolConfigurator() - ); - await insertContractAddressInDb(eContractid.PoolConfigurator, poolConfiguratorProxy.address); - - // Deploy deployment helpers - await deployStableAndVariableTokensHelper([poolProxy.address, addressesProvider.address]); - await deployATokensAndRatesHelper([ - poolProxy.address, - addressesProvider.address, - poolConfiguratorProxy.address, - ]); - - const fallbackOracle = await deployPriceOracle(); - await waitForTx(await fallbackOracle.setEthUsdPrice(MOCK_USD_PRICE_IN_WEI)); - await setInitialAssetPricesInOracle( - ALL_ASSETS_INITIAL_PRICES, - { - WETH: mockTokens.WETH.address, - DAI: mockTokens.DAI.address, - TUSD: mockTokens.TUSD.address, - USDC: mockTokens.USDC.address, - USDT: mockTokens.USDT.address, - SUSD: mockTokens.SUSD.address, - AAVE: mockTokens.AAVE.address, - BAT: mockTokens.BAT.address, - MKR: mockTokens.MKR.address, - LINK: mockTokens.LINK.address, - KNC: mockTokens.KNC.address, - WBTC: mockTokens.WBTC.address, - MANA: mockTokens.MANA.address, - ZRX: mockTokens.ZRX.address, - SNX: mockTokens.SNX.address, - BUSD: mockTokens.BUSD.address, - YFI: mockTokens.BUSD.address, - REN: mockTokens.REN.address, - UNI: mockTokens.UNI.address, - ENJ: mockTokens.ENJ.address, - // DAI: mockTokens.LpDAI.address, - // USDC: mockTokens.LpUSDC.address, - // USDT: mockTokens.LpUSDT.address, - // WBTC: mockTokens.LpWBTC.address, - // WETH: mockTokens.LpWETH.address, - UniDAIWETH: mockTokens.UniDAIWETH.address, - UniWBTCWETH: mockTokens.UniWBTCWETH.address, - UniAAVEWETH: mockTokens.UniAAVEWETH.address, - UniBATWETH: mockTokens.UniBATWETH.address, - UniDAIUSDC: mockTokens.UniDAIUSDC.address, - UniCRVWETH: mockTokens.UniCRVWETH.address, - UniLINKWETH: mockTokens.UniLINKWETH.address, - UniMKRWETH: mockTokens.UniMKRWETH.address, - UniRENWETH: mockTokens.UniRENWETH.address, - UniSNXWETH: mockTokens.UniSNXWETH.address, - UniUNIWETH: mockTokens.UniUNIWETH.address, - UniUSDCWETH: mockTokens.UniUSDCWETH.address, - UniWBTCUSDC: mockTokens.UniWBTCUSDC.address, - UniYFIWETH: mockTokens.UniYFIWETH.address, - BptWBTCWETH: mockTokens.BptWBTCWETH.address, - BptBALWETH: mockTokens.BptBALWETH.address, - WMATIC: mockTokens.WMATIC.address, - USD: USD_ADDRESS, - STAKE: mockTokens.STAKE.address, - }, - fallbackOracle - ); - - const mockAggregators = await deployAllMockAggregators(MOCK_CHAINLINK_AGGREGATORS_PRICES); - - const allTokenAddresses = Object.entries(mockTokens).reduce( - (accum: { [tokenSymbol: string]: tEthereumAddress }, [tokenSymbol, tokenContract]) => ({ - ...accum, - [tokenSymbol]: tokenContract.address, - }), - {} - ); - const allAggregatorsAddresses = Object.entries(mockAggregators).reduce( - (accum: { [tokenSymbol: string]: tEthereumAddress }, [tokenSymbol, aggregator]) => ({ - ...accum, - [tokenSymbol]: aggregator.address, - }), - {} - ); - - const [tokens, aggregators] = getPairsTokenAggregator(allTokenAddresses, allAggregatorsAddresses); - - await deployAaveOracle([ - tokens, - aggregators, - fallbackOracle.address, - mockTokens.WETH.address, - ethers.constants.WeiPerEther.toString(), - ]); - await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address)); - - const rateOracle = await deployRateOracle(); - await waitForTx(await addressesProvider.setRateOracle(rateOracle.address)); - - const { USD, ...tokensAddressesWithoutUsd } = allTokenAddresses; - const allReservesAddresses = { - ...tokensAddressesWithoutUsd, - }; - await setInitialMarketRatesInRatesOracleByHelper( - RATE_ORACLE_RATES_COMMON, - allReservesAddresses, - rateOracle, - aaveAdmin - ); - - const reservesParams = getReservesConfigByPool(AavePools.amm); - - const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address); - - await insertContractAddressInDb(eContractid.AaveProtocolDataProvider, testHelpers.address); - const admin = await deployer.getAddress(); - - console.log('Initialize configuration'); - - const config = loadPoolConfig(ConfigNames.Amm); - - const { ATokenNamePrefix, StableDebtTokenNamePrefix, VariableDebtTokenNamePrefix, SymbolPrefix } = - config; - const treasuryAddress = await getTreasuryAddress(config); - - await initReservesByHelper( - reservesParams, - allReservesAddresses, - ATokenNamePrefix, - StableDebtTokenNamePrefix, - VariableDebtTokenNamePrefix, - SymbolPrefix, - admin, - treasuryAddress, - ZERO_ADDRESS, - false - ); - await configureReservesByHelper(reservesParams, allReservesAddresses, testHelpers, admin); - - const collateralManager = await deployPoolCollateralManager(); - await waitForTx(await addressesProvider.setPoolCollateralManager(collateralManager.address)); - await deployMockFlashLoanReceiver(addressesProvider.address); - - const mockUniswapRouter = await deployMockUniswapRouter(); - - console.timeEnd('setup'); -}; - -before(async () => { - await rawBRE.run('set-DRE'); - const [deployer, secondaryWallet] = await getEthersSigners(); - const FORK = process.env.FORK; - - if (FORK) { - await rawBRE.run('amm:mainnet'); - } else { - console.log('-> Deploying test environment...'); - await buildTestEnv(deployer, secondaryWallet); - } - - await initializeMakeSuite(); - console.log('\n***************'); - console.log('Setup and snapshot finished'); - console.log('***************\n'); -}); diff --git a/test-suites/test-amm/addresses-provider-registry.spec.ts b/test-suites/test-amm/addresses-provider-registry.spec.ts deleted file mode 100644 index b19720655..000000000 --- a/test-suites/test-amm/addresses-provider-registry.spec.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { TestEnv, makeSuite } from './helpers/make-suite'; -import { ZERO_ADDRESS } from '../../helpers/constants'; -import { ProtocolErrors } from '../../helpers/types'; - -const { expect } = require('chai'); - -makeSuite('AddressesProviderRegistry', (testEnv: TestEnv) => { - it('Checks the addresses provider is added to the registry', async () => { - const { addressesProvider, registry } = testEnv; - - const providers = await registry.getAddressesProvidersList(); - - expect(providers.length).to.be.equal(1, 'Invalid length of the addresses providers list'); - expect(providers[0].toString()).to.be.equal( - addressesProvider.address, - ' Invalid addresses provider added to the list' - ); - }); - - it('tries to register an addresses provider with id 0', async () => { - const { users, registry } = testEnv; - const { PAPR_INVALID_ADDRESSES_PROVIDER_ID } = ProtocolErrors; - - await expect(registry.registerAddressesProvider(users[2].address, '0')).to.be.revertedWith( - PAPR_INVALID_ADDRESSES_PROVIDER_ID - ); - }); - - it('Registers a new mock addresses provider', async () => { - const { users, registry } = testEnv; - - //simulating an addresses provider using the users[1] wallet address - await registry.registerAddressesProvider(users[1].address, '2'); - - const providers = await registry.getAddressesProvidersList(); - - expect(providers.length).to.be.equal(2, 'Invalid length of the addresses providers list'); - expect(providers[1].toString()).to.be.equal( - users[1].address, - ' Invalid addresses provider added to the list' - ); - }); - - it('Removes the mock addresses provider', async () => { - const { users, registry, addressesProvider } = testEnv; - - const id = await registry.getAddressesProviderIdByAddress(users[1].address); - - expect(id).to.be.equal('2', 'Invalid isRegistered return value'); - - await registry.unregisterAddressesProvider(users[1].address); - - const providers = await registry.getAddressesProvidersList(); - - expect(providers.length).to.be.equal(2, 'Invalid length of the addresses providers list'); - expect(providers[0].toString()).to.be.equal( - addressesProvider.address, - ' Invalid addresses provider added to the list' - ); - expect(providers[1].toString()).to.be.equal(ZERO_ADDRESS, ' Invalid addresses'); - }); - - it('Tries to remove a unregistered addressesProvider', async () => { - const { PAPR_PROVIDER_NOT_REGISTERED } = ProtocolErrors; - - const { users, registry } = testEnv; - - await expect(registry.unregisterAddressesProvider(users[2].address)).to.be.revertedWith( - PAPR_PROVIDER_NOT_REGISTERED - ); - }); - - it('Tries to remove a unregistered addressesProvider', async () => { - const { PAPR_PROVIDER_NOT_REGISTERED } = ProtocolErrors; - - const { users, registry } = testEnv; - - await expect(registry.unregisterAddressesProvider(users[2].address)).to.be.revertedWith( - PAPR_PROVIDER_NOT_REGISTERED - ); - }); - - it('Tries to add an already added addressesProvider with a different id. Should overwrite the previous id', async () => { - const { users, registry, addressesProvider } = testEnv; - - await registry.registerAddressesProvider(addressesProvider.address, '2'); - - const providers = await registry.getAddressesProvidersList(); - - const id = await registry.getAddressesProviderIdByAddress(addressesProvider.address); - - expect(providers.length).to.be.equal(2, 'Invalid length of the addresses providers list'); - - expect(providers[0].toString()).to.be.equal( - addressesProvider.address, - ' Invalid addresses provider added to the list' - ); - expect(providers[1].toString()).to.be.equal(ZERO_ADDRESS, ' Invalid addresses'); - }); -}); diff --git a/test-suites/test-amm/atoken-modifiers.spec.ts b/test-suites/test-amm/atoken-modifiers.spec.ts deleted file mode 100644 index ddd1f2afd..000000000 --- a/test-suites/test-amm/atoken-modifiers.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { expect } from 'chai'; -import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors } from '../../helpers/types'; - -makeSuite('AToken: Modifiers', (testEnv: TestEnv) => { - const { CT_CALLER_MUST_BE_POOL } = ProtocolErrors; - - it('Tries to invoke mint not being the Pool', async () => { - const { deployer, aDai } = testEnv; - await expect(aDai.mint(deployer.address, '1', '1')).to.be.revertedWith(CT_CALLER_MUST_BE_POOL); - }); - - it('Tries to invoke burn not being the Pool', async () => { - const { deployer, aDai } = testEnv; - await expect(aDai.burn(deployer.address, deployer.address, '1', '1')).to.be.revertedWith( - CT_CALLER_MUST_BE_POOL - ); - }); - - it('Tries to invoke transferOnLiquidation not being the Pool', async () => { - const { deployer, users, aDai } = testEnv; - await expect( - aDai.transferOnLiquidation(deployer.address, users[0].address, '1') - ).to.be.revertedWith(CT_CALLER_MUST_BE_POOL); - }); - - it('Tries to invoke transferUnderlyingTo not being the Pool', async () => { - const { deployer, aDai } = testEnv; - await expect(aDai.transferUnderlyingTo(deployer.address, '1')).to.be.revertedWith( - CT_CALLER_MUST_BE_POOL - ); - }); -}); diff --git a/test-suites/test-amm/atoken-transfer.spec.ts b/test-suites/test-amm/atoken-transfer.spec.ts deleted file mode 100644 index 38d98c22e..000000000 --- a/test-suites/test-amm/atoken-transfer.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { APPROVAL_AMOUNT_POOL, MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; -import { expect } from 'chai'; -import { ethers } from 'ethers'; -import { RateMode, ProtocolErrors } from '../../helpers/types'; -import { makeSuite, TestEnv } from './helpers/make-suite'; -import { CommonsConfig } from '../../markets/amm/commons'; - -const AAVE_REFERRAL = CommonsConfig.ProtocolGlobalParams.AaveReferral; - -makeSuite('AToken: Transfer', (testEnv: TestEnv) => { - const { - INVALID_FROM_BALANCE_AFTER_TRANSFER, - INVALID_TO_BALANCE_AFTER_TRANSFER, - VL_HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD, - } = ProtocolErrors; - - it('User 0 deposits 1000 DAI, transfers to user 1', async () => { - const { users, pool, dai, aDai } = testEnv; - - await dai.connect(users[0].signer).mint(await convertToCurrencyDecimals(dai.address, '1000')); - - await dai.connect(users[0].signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - //user 1 deposits 1000 DAI - const amountDAItoDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - await pool - .connect(users[0].signer) - .deposit(dai.address, amountDAItoDeposit, users[0].address, '0'); - - await aDai.connect(users[0].signer).transfer(users[1].address, amountDAItoDeposit); - - const name = await aDai.name(); - - expect(name).to.be.equal('Aave AMM Market DAI'); - - const fromBalance = await aDai.balanceOf(users[0].address); - const toBalance = await aDai.balanceOf(users[1].address); - - expect(fromBalance.toString()).to.be.equal('0', INVALID_FROM_BALANCE_AFTER_TRANSFER); - expect(toBalance.toString()).to.be.equal( - amountDAItoDeposit.toString(), - INVALID_TO_BALANCE_AFTER_TRANSFER - ); - }); - - it('User 0 deposits 1 WETH and user 1 tries to borrow the WETH variable with the received DAI as collateral', async () => { - const { users, pool, weth, helpersContract } = testEnv; - const userAddress = await pool.signer.getAddress(); - - await weth.connect(users[0].signer).mint(await convertToCurrencyDecimals(weth.address, '1')); - - await weth.connect(users[0].signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - await pool - .connect(users[0].signer) - .deposit(weth.address, ethers.utils.parseEther('1.0'), userAddress, '0'); - await pool - .connect(users[1].signer) - .borrow( - weth.address, - ethers.utils.parseEther('0.1'), - RateMode.Variable, - AAVE_REFERRAL, - users[1].address - ); - - const userReserveData = await helpersContract.getUserReserveData( - weth.address, - users[1].address - ); - - expect(userReserveData.currentVariableDebt.toString()).to.be.eq(ethers.utils.parseEther('0.1')); - }); - - it('User 1 tries to transfer all the DAI used as collateral back to user 0 (revert expected)', async () => { - const { users, pool, aDai, dai, weth } = testEnv; - - const aDAItoTransfer = await convertToCurrencyDecimals(dai.address, '1000'); - - await expect( - aDai.connect(users[1].signer).transfer(users[0].address, aDAItoTransfer), - VL_HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD - ).to.be.revertedWith(VL_HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD); - }); - - it('User 1 tries to transfer a small amount of DAI used as collateral back to user 0', async () => { - const { users, pool, aDai, dai, weth } = testEnv; - - const aDAItoTransfer = await convertToCurrencyDecimals(dai.address, '100'); - - await aDai.connect(users[1].signer).transfer(users[0].address, aDAItoTransfer); - - const user0Balance = await aDai.balanceOf(users[0].address); - - expect(user0Balance.toString()).to.be.eq(aDAItoTransfer.toString()); - }); -}); diff --git a/test-suites/test-amm/configurator.spec.ts b/test-suites/test-amm/configurator.spec.ts deleted file mode 100644 index 8d0ef8bef..000000000 --- a/test-suites/test-amm/configurator.spec.ts +++ /dev/null @@ -1,413 +0,0 @@ -import { TestEnv, makeSuite } from './helpers/make-suite'; -import { APPROVAL_AMOUNT_POOL, MAX_BORROW_CAP, RAY } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; -import { ProtocolErrors } from '../../helpers/types'; -import { strategyWETH } from '../../markets/amm/reservesConfigs'; - -const { expect } = require('chai'); - -makeSuite('PoolConfigurator', (testEnv: TestEnv) => { - const { - CALLER_NOT_POOL_ADMIN, - PC_RESERVE_LIQUIDITY_NOT_0, - RC_INVALID_LTV, - RC_INVALID_LIQ_THRESHOLD, - RC_INVALID_LIQ_BONUS, - RC_INVALID_DECIMALS, - RC_INVALID_RESERVE_FACTOR, - } = ProtocolErrors; - - it('Reverts trying to set an invalid reserve factor', async () => { - const { configurator, weth } = testEnv; - - const invalidReserveFactor = 65536; - - await expect( - configurator.setReserveFactor(weth.address, invalidReserveFactor) - ).to.be.revertedWith(RC_INVALID_RESERVE_FACTOR); - }); - - it('Deactivates the ETH reserve', async () => { - const { configurator, weth, helpersContract } = testEnv; - await configurator.deactivateReserve(weth.address); - const { isActive } = await helpersContract.getReserveConfigurationData(weth.address); - expect(isActive).to.be.equal(false); - }); - - it('Rectivates the ETH reserve', async () => { - const { configurator, weth, helpersContract } = testEnv; - await configurator.activateReserve(weth.address); - - const { isActive } = await helpersContract.getReserveConfigurationData(weth.address); - expect(isActive).to.be.equal(true); - }); - - it('Check the onlyAaveAdmin on deactivateReserve ', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator.connect(users[2].signer).deactivateReserve(weth.address), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Check the onlyAaveAdmin on activateReserve ', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator.connect(users[2].signer).activateReserve(weth.address), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Freezes the ETH reserve', async () => { - const { configurator, weth, helpersContract } = testEnv; - - await configurator.freezeReserve(weth.address); - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(true); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(true); - expect(decimals).to.be.equal(strategyWETH.reserveDecimals); - expect(ltv).to.be.equal(strategyWETH.baseLTVAsCollateral); - expect(liquidationThreshold).to.be.equal(strategyWETH.liquidationThreshold); - expect(liquidationBonus).to.be.equal(strategyWETH.liquidationBonus); - expect(stableBorrowRateEnabled).to.be.equal(strategyWETH.stableBorrowRateEnabled); - expect(reserveFactor).to.be.equal(strategyWETH.reserveFactor); - }); - - it('Unfreezes the ETH reserve', async () => { - const { configurator, helpersContract, weth } = testEnv; - await configurator.unfreezeReserve(weth.address); - - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(true); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(false); - expect(decimals).to.be.equal(strategyWETH.reserveDecimals); - expect(ltv).to.be.equal(strategyWETH.baseLTVAsCollateral); - expect(liquidationThreshold).to.be.equal(strategyWETH.liquidationThreshold); - expect(liquidationBonus).to.be.equal(strategyWETH.liquidationBonus); - expect(stableBorrowRateEnabled).to.be.equal(strategyWETH.stableBorrowRateEnabled); - expect(reserveFactor).to.be.equal(strategyWETH.reserveFactor); - }); - - it('Check the onlyAaveAdmin on freezeReserve ', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator.connect(users[2].signer).freezeReserve(weth.address), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Check the onlyAaveAdmin on unfreezeReserve ', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator.connect(users[2].signer).unfreezeReserve(weth.address), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Deactivates the ETH reserve for borrowing', async () => { - const { configurator, helpersContract, weth } = testEnv; - await configurator.disableBorrowingOnReserve(weth.address); - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(false); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(false); - expect(decimals).to.be.equal(strategyWETH.reserveDecimals); - expect(ltv).to.be.equal(strategyWETH.baseLTVAsCollateral); - expect(liquidationThreshold).to.be.equal(strategyWETH.liquidationThreshold); - expect(liquidationBonus).to.be.equal(strategyWETH.liquidationBonus); - expect(stableBorrowRateEnabled).to.be.equal(strategyWETH.stableBorrowRateEnabled); - expect(reserveFactor).to.be.equal(strategyWETH.reserveFactor); - }); - - it('Activates the ETH reserve for borrowing', async () => { - const { configurator, weth, helpersContract } = testEnv; - await configurator.enableBorrowingOnReserve(weth.address, '0', true); - const { variableBorrowIndex } = await helpersContract.getReserveData(weth.address); - - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(true); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(false); - expect(decimals).to.be.equal(strategyWETH.reserveDecimals); - expect(ltv).to.be.equal(strategyWETH.baseLTVAsCollateral); - expect(liquidationThreshold).to.be.equal(strategyWETH.liquidationThreshold); - expect(liquidationBonus).to.be.equal(strategyWETH.liquidationBonus); - expect(stableBorrowRateEnabled).to.be.equal(true /*strategyWETH.stableBorrowRateEnabled*/); - expect(reserveFactor).to.be.equal(strategyWETH.reserveFactor); - expect(variableBorrowIndex.toString()).to.be.equal(RAY); - }); - - it('Check the onlyAaveAdmin on disableBorrowingOnReserve ', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator.connect(users[2].signer).disableBorrowingOnReserve(weth.address), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Check the onlyAaveAdmin on enableBorrowingOnReserve ', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator - .connect(users[2].signer) - .enableBorrowingOnReserve(weth.address, MAX_BORROW_CAP, true), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Deactivates the ETH reserve as collateral', async () => { - const { configurator, helpersContract, weth } = testEnv; - await configurator.configureReserveAsCollateral(weth.address, 0, 0, 0); - - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(true); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(false); - expect(decimals).to.be.equal(18); - expect(ltv).to.be.equal(0); - expect(liquidationThreshold).to.be.equal(0); - expect(liquidationBonus).to.be.equal(0); - expect(stableBorrowRateEnabled).to.be.equal(true); - expect(reserveFactor).to.be.equal(strategyWETH.reserveFactor); - }); - - it('Activates the ETH reserve as collateral', async () => { - const { configurator, helpersContract, weth } = testEnv; - await configurator.configureReserveAsCollateral(weth.address, '8000', '8250', '10500'); - - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(true); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(false); - expect(decimals).to.be.equal(strategyWETH.reserveDecimals); - expect(ltv).to.be.equal(strategyWETH.baseLTVAsCollateral); - expect(liquidationThreshold).to.be.equal(strategyWETH.liquidationThreshold); - expect(liquidationBonus).to.be.equal(strategyWETH.liquidationBonus); - expect(stableBorrowRateEnabled).to.be.equal(true /*strategyWETH.stableBorrowRateEnabled*/); - expect(reserveFactor).to.be.equal(strategyWETH.reserveFactor); - }); - - it('Check the onlyAaveAdmin on configureReserveAsCollateral ', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator - .connect(users[2].signer) - .configureReserveAsCollateral(weth.address, '7500', '8000', '10500'), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Disable stable borrow rate on the ETH reserve', async () => { - const { configurator, helpersContract, weth } = testEnv; - await configurator.disableReserveStableRate(weth.address); - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(true); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(false); - expect(decimals).to.be.equal(strategyWETH.reserveDecimals); - expect(ltv).to.be.equal(strategyWETH.baseLTVAsCollateral); - expect(liquidationThreshold).to.be.equal(strategyWETH.liquidationThreshold); - expect(liquidationBonus).to.be.equal(strategyWETH.liquidationBonus); - expect(stableBorrowRateEnabled).to.be.equal(false); - expect(reserveFactor).to.be.equal(strategyWETH.reserveFactor); - }); - - it('Enables stable borrow rate on the ETH reserve', async () => { - const { configurator, helpersContract, weth } = testEnv; - await configurator.enableReserveStableRate(weth.address); - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(true); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(false); - expect(decimals).to.be.equal(strategyWETH.reserveDecimals); - expect(ltv).to.be.equal(strategyWETH.baseLTVAsCollateral); - expect(liquidationThreshold).to.be.equal(strategyWETH.liquidationThreshold); - expect(liquidationBonus).to.be.equal(strategyWETH.liquidationBonus); - expect(stableBorrowRateEnabled).to.be.equal(true); - expect(reserveFactor).to.be.equal(strategyWETH.reserveFactor); - }); - - it('Disable stable borrow rate to return to the original state on the ETH reserve', async () => { - const { configurator, helpersContract, weth } = testEnv; - await configurator.disableReserveStableRate(weth.address); - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(true); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(false); - expect(decimals).to.be.equal(strategyWETH.reserveDecimals); - expect(ltv).to.be.equal(strategyWETH.baseLTVAsCollateral); - expect(liquidationThreshold).to.be.equal(strategyWETH.liquidationThreshold); - expect(liquidationBonus).to.be.equal(strategyWETH.liquidationBonus); - expect(stableBorrowRateEnabled).to.be.equal(strategyWETH.stableBorrowRateEnabled); - expect(reserveFactor).to.be.equal(strategyWETH.reserveFactor); - }); - - it('Check the onlyAaveAdmin on disableReserveStableRate', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator.connect(users[2].signer).disableReserveStableRate(weth.address), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Check the onlyAaveAdmin on enableReserveStableRate', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator.connect(users[2].signer).enableReserveStableRate(weth.address), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Changes the reserve factor of WETH', async () => { - const { configurator, helpersContract, weth } = testEnv; - await configurator.setReserveFactor(weth.address, '1000'); - const { - decimals, - ltv, - liquidationBonus, - liquidationThreshold, - reserveFactor, - stableBorrowRateEnabled, - borrowingEnabled, - isActive, - isFrozen, - } = await helpersContract.getReserveConfigurationData(weth.address); - - expect(borrowingEnabled).to.be.equal(true); - expect(isActive).to.be.equal(true); - expect(isFrozen).to.be.equal(false); - expect(decimals).to.be.equal(strategyWETH.reserveDecimals); - expect(ltv).to.be.equal(strategyWETH.baseLTVAsCollateral); - expect(liquidationThreshold).to.be.equal(strategyWETH.liquidationThreshold); - expect(liquidationBonus).to.be.equal(strategyWETH.liquidationBonus); - expect(stableBorrowRateEnabled).to.be.equal(strategyWETH.stableBorrowRateEnabled); - expect(reserveFactor).to.be.equal(1000); - }); - - it('Check the onlyPoolManager on setReserveFactor', async () => { - const { configurator, users, weth } = testEnv; - await expect( - configurator.connect(users[2].signer).setReserveFactor(weth.address, '2000'), - CALLER_NOT_POOL_ADMIN - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Reverts when trying to disable the DAI reserve with liquidity on it', async () => { - const { dai, pool, configurator } = testEnv; - const userAddress = await pool.signer.getAddress(); - await dai.mint(await convertToCurrencyDecimals(dai.address, '1000')); - - //approve protocol to access depositor wallet - await dai.approve(pool.address, APPROVAL_AMOUNT_POOL); - const amountDAItoDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - //user 1 deposits 1000 DAI - await pool.deposit(dai.address, amountDAItoDeposit, userAddress, '0'); - - await expect( - configurator.deactivateReserve(dai.address), - PC_RESERVE_LIQUIDITY_NOT_0 - ).to.be.revertedWith(PC_RESERVE_LIQUIDITY_NOT_0); - }); -}); diff --git a/test-suites/test-amm/delegation-aware-atoken.spec.ts b/test-suites/test-amm/delegation-aware-atoken.spec.ts deleted file mode 100644 index 4bae866c6..000000000 --- a/test-suites/test-amm/delegation-aware-atoken.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { MAX_UINT_AMOUNT, ZERO_ADDRESS } from '../../helpers/constants'; -import { BUIDLEREVM_CHAINID } from '../../helpers/buidler-constants'; -import { buildPermitParams, getSignatureFromTypedData } from '../../helpers/contracts-helpers'; -import { expect } from 'chai'; -import { ethers } from 'ethers'; -import { eEthereumNetwork, ProtocolErrors } from '../../helpers/types'; -import { makeSuite, TestEnv } from './helpers/make-suite'; -import { DRE } from '../../helpers/misc-utils'; -import { - ConfigNames, - getATokenDomainSeparatorPerNetwork, - getTreasuryAddress, - loadPoolConfig, -} from '../../helpers/configuration'; -import { waitForTx } from '../../helpers/misc-utils'; -import { - deployDelegationAwareAToken, - deployMintableDelegationERC20, -} from '../../helpers/contracts-deployments'; -import { DelegationAwareATokenFactory } from '../../types'; -import { DelegationAwareAToken } from '../../types/DelegationAwareAToken'; -import { MintableDelegationERC20 } from '../../types/MintableDelegationERC20'; -import AmmConfig from '../../markets/amm'; - -const { parseEther } = ethers.utils; - -makeSuite('AToken: underlying delegation', (testEnv: TestEnv) => { - const poolConfig = loadPoolConfig(ConfigNames.Commons); - let delegationAToken = {}; - let delegationERC20 = {}; - - it('Deploys a new MintableDelegationERC20 and a DelegationAwareAToken', async () => { - const { pool } = testEnv; - - delegationERC20 = await deployMintableDelegationERC20(['DEL', 'DEL', '18']); - - delegationAToken = await deployDelegationAwareAToken( - [ - pool.address, - delegationERC20.address, - await getTreasuryAddress(AmmConfig), - ZERO_ADDRESS, - 'aDEL', - 'aDEL', - ], - false - ); - - //await delegationAToken.initialize(pool.address, ZERO_ADDRESS, delegationERC20.address, ZERO_ADDRESS, '18', 'aDEL', 'aDEL'); - - console.log((await delegationAToken.decimals()).toString()); - }); - - it('Tries to delegate with the caller not being the Aave admin', async () => { - const { users } = testEnv; - - await expect( - delegationAToken.connect(users[1].signer).delegateUnderlyingTo(users[2].address) - ).to.be.revertedWith(ProtocolErrors.CALLER_NOT_POOL_ADMIN); - }); - - it('Tries to delegate to user 2', async () => { - const { users } = testEnv; - - await delegationAToken.delegateUnderlyingTo(users[2].address); - - const delegateeAddress = await delegationERC20.delegatee(); - - expect(delegateeAddress).to.be.equal(users[2].address); - }); -}); diff --git a/test-suites/test-amm/flashloan.spec.ts b/test-suites/test-amm/flashloan.spec.ts deleted file mode 100644 index 3ef02b63c..000000000 --- a/test-suites/test-amm/flashloan.spec.ts +++ /dev/null @@ -1,616 +0,0 @@ -import BigNumber from 'bignumber.js'; - -import { TestEnv, makeSuite } from './helpers/make-suite'; -import { APPROVAL_AMOUNT_POOL, oneRay } from '../../helpers/constants'; -import { convertToCurrencyDecimals, getContract } from '../../helpers/contracts-helpers'; -import { ethers } from 'ethers'; -import { MockFlashLoanReceiver } from '../../types/MockFlashLoanReceiver'; -import { ProtocolErrors, eContractid } from '../../helpers/types'; -import { VariableDebtToken } from '../../types/VariableDebtToken'; -import { StableDebtToken } from '../../types/StableDebtToken'; -import { - getMockFlashLoanReceiver, - getStableDebtToken, - getVariableDebtToken, -} from '../../helpers/contracts-getters'; - -const { expect } = require('chai'); - -makeSuite('Pool FlashLoan function', (testEnv: TestEnv) => { - let _mockFlashLoanReceiver = {} as MockFlashLoanReceiver; - const { - VL_COLLATERAL_BALANCE_IS_0, - TRANSFER_AMOUNT_EXCEEDS_BALANCE, - P_INVALID_FLASHLOAN_MODE, - VL_STABLE_BORROWING_NOT_ENABLED, - SAFEERC20_LOWLEVEL_CALL, - P_INVALID_FLASH_LOAN_EXECUTOR_RETURN, - LP_BORROW_ALLOWANCE_NOT_ENOUGH, - } = ProtocolErrors; - - before(async () => { - _mockFlashLoanReceiver = await getMockFlashLoanReceiver(); - }); - - it('Deposits WETH into the reserve', async () => { - const { pool, weth } = testEnv; - const userAddress = await pool.signer.getAddress(); - const amountToDeposit = ethers.utils.parseEther('1'); - - await weth.mint(amountToDeposit); - - await weth.approve(pool.address, APPROVAL_AMOUNT_POOL); - - await pool.deposit(weth.address, amountToDeposit, userAddress, '0'); - }); - - it('Takes WETH flashloan with mode = 0, returns the funds correctly', async () => { - const { pool, helpersContract, weth } = testEnv; - - const borrowedAmount = ethers.utils.parseEther('0.8'); - - await pool.flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [borrowedAmount], - [0], - _mockFlashLoanReceiver.address, - '0x10', - '0' - ); - - ethers.utils.parseUnits('10000'); - - const reserveData = await helpersContract.getReserveData(weth.address); - - const currentLiquidityRate = reserveData.liquidityRate; - const currentLiquidityIndex = reserveData.liquidityIndex; - - const totalLiquidity = new BigNumber(reserveData.availableLiquidity.toString()) - .plus(reserveData.totalStableDebt.toString()) - .plus(reserveData.totalVariableDebt.toString()); - - expect(totalLiquidity.toString()).to.be.equal('1000720000000000000'); - expect(currentLiquidityRate.toString()).to.be.equal('0'); - expect(currentLiquidityIndex.toString()).to.be.equal('1000720000000000000000000000'); - }); - - it('Takes an ETH flashloan with mode = 0 as big as the available liquidity', async () => { - const { pool, helpersContract, weth } = testEnv; - - const reserveDataBefore = await helpersContract.getReserveData(weth.address); - const txResult = await pool.flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - ['1000720000000000000'], - [0], - _mockFlashLoanReceiver.address, - '0x10', - '0' - ); - - const reserveData = await helpersContract.getReserveData(weth.address); - - const currentLiqudityRate = reserveData.liquidityRate; - const currentLiquidityIndex = reserveData.liquidityIndex; - - const totalLiquidity = new BigNumber(reserveData.availableLiquidity.toString()) - .plus(reserveData.totalStableDebt.toString()) - .plus(reserveData.totalVariableDebt.toString()); - - expect(totalLiquidity.toString()).to.be.equal('1001620648000000000'); - expect(currentLiqudityRate.toString()).to.be.equal('0'); - expect(currentLiquidityIndex.toString()).to.be.equal('1001620648000000000000000000'); - }); - - it('Takes WETH flashloan, does not return the funds with mode = 0. (revert expected)', async () => { - const { pool, weth, users } = testEnv; - const caller = users[1]; - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [ethers.utils.parseEther('0.8')], - [0], - caller.address, - '0x10', - '0' - ) - ).to.be.revertedWith(SAFEERC20_LOWLEVEL_CALL); - }); - - it('Takes WETH flashloan, simulating a receiver as EOA (revert expected)', async () => { - const { pool, weth, users } = testEnv; - const caller = users[1]; - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - await _mockFlashLoanReceiver.setSimulateEOA(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [ethers.utils.parseEther('0.8')], - [0], - caller.address, - '0x10', - '0' - ) - ).to.be.revertedWith(P_INVALID_FLASH_LOAN_EXECUTOR_RETURN); - }); - - it('Takes a WETH flashloan with an invalid mode. (revert expected)', async () => { - const { pool, weth, users } = testEnv; - const caller = users[1]; - await _mockFlashLoanReceiver.setSimulateEOA(false); - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [ethers.utils.parseEther('0.8')], - [4], - caller.address, - '0x10', - '0' - ) - ).to.be.reverted; - }); - - it('Caller deposits 1000 DAI as collateral, Takes WETH flashloan with mode = 2, does not return the funds. A variable loan for caller is created', async () => { - const { dai, pool, weth, users, helpersContract } = testEnv; - - const caller = users[1]; - - await dai.connect(caller.signer).mint(await convertToCurrencyDecimals(dai.address, '1000')); - - await dai.connect(caller.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - const amountToDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - await pool.connect(caller.signer).deposit(dai.address, amountToDeposit, caller.address, '0'); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [ethers.utils.parseEther('0.8')], - [2], - caller.address, - '0x10', - '0' - ); - const { variableDebtTokenAddress } = await helpersContract.getReserveTokensAddresses( - weth.address - ); - - const wethDebtToken = await getVariableDebtToken(variableDebtTokenAddress); - - const callerDebt = await wethDebtToken.balanceOf(caller.address); - - expect(callerDebt.toString()).to.be.equal('800000000000000000', 'Invalid user debt'); - }); - - it('tries to take a flashloan that is bigger than the available liquidity (revert expected)', async () => { - const { pool, weth, users } = testEnv; - const caller = users[1]; - - await expect( - pool.connect(caller.signer).flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - ['1004415000000000000'], //slightly higher than the available liquidity - [2], - caller.address, - '0x10', - '0' - ), - TRANSFER_AMOUNT_EXCEEDS_BALANCE - ).to.be.revertedWith(SAFEERC20_LOWLEVEL_CALL); - }); - - it('tries to take a flashloan using a non contract address as receiver (revert expected)', async () => { - const { pool, deployer, weth, users } = testEnv; - const caller = users[1]; - - await expect( - pool.flashLoan( - deployer.address, - [weth.address], - ['1000000000000000000'], - [2], - caller.address, - '0x10', - '0' - ) - ).to.be.reverted; - }); - - it('Deposits USDC into the reserve', async () => { - const { usdc, pool } = testEnv; - const userAddress = await pool.signer.getAddress(); - - await usdc.mint(await convertToCurrencyDecimals(usdc.address, '1000')); - - await usdc.approve(pool.address, APPROVAL_AMOUNT_POOL); - - const amountToDeposit = await convertToCurrencyDecimals(usdc.address, '1000'); - - await pool.deposit(usdc.address, amountToDeposit, userAddress, '0'); - }); - - it('Takes out a 500 USDC flashloan, returns the funds correctly', async () => { - const { usdc, pool, helpersContract, deployer: depositor } = testEnv; - - await _mockFlashLoanReceiver.setFailExecutionTransfer(false); - - const reserveDataBefore = await helpersContract.getReserveData(usdc.address); - - const flashloanAmount = await convertToCurrencyDecimals(usdc.address, '500'); - - await pool.flashLoan( - _mockFlashLoanReceiver.address, - [usdc.address], - [flashloanAmount], - [0], - _mockFlashLoanReceiver.address, - '0x10', - '0' - ); - - const reserveDataAfter = helpersContract.getReserveData(usdc.address); - - const reserveData = await helpersContract.getReserveData(usdc.address); - const userData = await helpersContract.getUserReserveData(usdc.address, depositor.address); - - const totalLiquidity = reserveData.availableLiquidity - .add(reserveData.totalStableDebt) - .add(reserveData.totalVariableDebt) - .toString(); - const currentLiqudityRate = reserveData.liquidityRate.toString(); - const currentLiquidityIndex = reserveData.liquidityIndex.toString(); - const currentUserBalance = userData.currentATokenBalance.toString(); - - const expectedLiquidity = await convertToCurrencyDecimals(usdc.address, '1000.450'); - - 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.00045').multipliedBy(oneRay).toFixed(), - 'Invalid liquidity index' - ); - expect(currentUserBalance.toString()).to.be.equal(expectedLiquidity, 'Invalid user balance'); - }); - - it('Takes out a 500 USDC flashloan with mode = 0, does not return the funds. (revert expected)', async () => { - const { usdc, pool, users } = testEnv; - const caller = users[2]; - - const flashloanAmount = await convertToCurrencyDecimals(usdc.address, '500'); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [usdc.address], - [flashloanAmount], - [2], - caller.address, - '0x10', - '0' - ) - ).to.be.revertedWith(VL_COLLATERAL_BALANCE_IS_0); - }); - - it('Caller deposits 5 WETH as collateral, Takes a USDC flashloan with mode = 2, does not return the funds. A loan for caller is created', async () => { - const { usdc, pool, weth, users, helpersContract } = testEnv; - - const caller = users[2]; - - await weth.connect(caller.signer).mint(await convertToCurrencyDecimals(weth.address, '5')); - - await weth.connect(caller.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - const amountToDeposit = await convertToCurrencyDecimals(weth.address, '5'); - - await pool.connect(caller.signer).deposit(weth.address, amountToDeposit, caller.address, '0'); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - const flashloanAmount = await convertToCurrencyDecimals(usdc.address, '500'); - - await pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [usdc.address], - [flashloanAmount], - [2], - caller.address, - '0x10', - '0' - ); - const { variableDebtTokenAddress } = await helpersContract.getReserveTokensAddresses( - usdc.address - ); - - const usdcDebtToken = await getVariableDebtToken(variableDebtTokenAddress); - - const callerDebt = await usdcDebtToken.balanceOf(caller.address); - - expect(callerDebt.toString()).to.be.equal('500000000', 'Invalid user debt'); - }); - - it('Caller deposits 1000 DAI as collateral, Takes a WETH flashloan with mode = 0, does not approve the transfer of the funds', async () => { - const { dai, pool, weth, users } = testEnv; - const caller = users[3]; - - await dai.connect(caller.signer).mint(await convertToCurrencyDecimals(dai.address, '1000')); - - await dai.connect(caller.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - const amountToDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - await pool.connect(caller.signer).deposit(dai.address, amountToDeposit, caller.address, '0'); - - const flashAmount = ethers.utils.parseEther('0.8'); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(false); - await _mockFlashLoanReceiver.setAmountToApprove(flashAmount.div(2)); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [flashAmount], - [0], - caller.address, - '0x10', - '0' - ) - ).to.be.revertedWith(SAFEERC20_LOWLEVEL_CALL); - }); - - it('Caller takes a WETH flashloan with mode = 1, should revert since stable borrowing is disabled', async () => { - const { dai, pool, weth, users, helpersContract } = testEnv; - - const caller = users[3]; - - const flashAmount = ethers.utils.parseEther('0.8'); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [flashAmount], - [1], - caller.address, - '0x10', - '0' - ) - ).to.be.revertedWith(VL_STABLE_BORROWING_NOT_ENABLED); - - const { stableDebtTokenAddress } = await helpersContract.getReserveTokensAddresses( - weth.address - ); - - const wethDebtToken = await getStableDebtToken(stableDebtTokenAddress); - - const callerDebt = await wethDebtToken.balanceOf(caller.address); - - expect(callerDebt.toString()).to.be.equal('0', 'Invalid user debt'); - }); - - it('Caller takes a WETH flashloan with mode = 2', async () => { - const { dai, pool, weth, users, helpersContract } = testEnv; - - const caller = users[3]; - - const flashAmount = ethers.utils.parseEther('0.8'); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [flashAmount], - [2], - caller.address, - '0x10', - '0' - ); - - const { variableDebtTokenAddress } = await helpersContract.getReserveTokensAddresses( - weth.address - ); - - const wethDebtToken = await getStableDebtToken(variableDebtTokenAddress); - - const callerDebt = await wethDebtToken.balanceOf(caller.address); - - expect(callerDebt.toString()).to.be.equal(ethers.utils.parseEther('0.8'), 'Invalid user debt'); - }); - - it('Caller takes a WETH flashloan with mode = 1 onBehalfOf user without allowance, should revert since stable borrowing is disabled', async () => { - const { dai, pool, weth, users, helpersContract } = testEnv; - - const caller = users[5]; - const onBehalfOf = users[4]; - - // Deposit 1000 dai for onBehalfOf user - await dai.connect(onBehalfOf.signer).mint(await convertToCurrencyDecimals(dai.address, '1000')); - - await dai.connect(onBehalfOf.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - const amountToDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - await pool - .connect(onBehalfOf.signer) - .deposit(dai.address, amountToDeposit, onBehalfOf.address, '0'); - - const flashAmount = ethers.utils.parseEther('0.8'); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [flashAmount], - [1], - onBehalfOf.address, - '0x10', - '0' - ) - ).to.be.revertedWith(VL_STABLE_BORROWING_NOT_ENABLED); - }); - - it('Caller takes a WETH flashloan with mode = 2 onBehalfOf user without allowance, should revert since allowance is 0', async () => { - const { dai, pool, weth, users, helpersContract } = testEnv; - - const caller = users[5]; - const onBehalfOf = users[4]; - - // Deposit 1000 dai for onBehalfOf user - await dai.connect(onBehalfOf.signer).mint(await convertToCurrencyDecimals(dai.address, '1000')); - - await dai.connect(onBehalfOf.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - const amountToDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - await pool - .connect(onBehalfOf.signer) - .deposit(dai.address, amountToDeposit, onBehalfOf.address, '0'); - - const flashAmount = ethers.utils.parseEther('0.8'); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [flashAmount], - [2], - onBehalfOf.address, - '0x10', - '0' - ) - ).to.be.revertedWith(LP_BORROW_ALLOWANCE_NOT_ENOUGH); - }); - - it('Caller takes a WETH flashloan with mode = 1 onBehalfOf user with allowance. Should revert since stable borrowing is disabled.', async () => { - const { dai, pool, weth, users, helpersContract } = testEnv; - - const caller = users[5]; - const onBehalfOf = users[4]; - - const flashAmount = ethers.utils.parseEther('0.8'); - - const reserveData = await pool.getReserveData(weth.address); - - const stableDebtToken = await getStableDebtToken(reserveData.stableDebtTokenAddress); - - // Deposited for onBehalfOf user already, delegate borrow allowance - await stableDebtToken.connect(onBehalfOf.signer).approveDelegation(caller.address, flashAmount); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [flashAmount], - [1], - onBehalfOf.address, - '0x10', - '0' - ) - ).to.be.revertedWith(VL_STABLE_BORROWING_NOT_ENABLED); - - const { stableDebtTokenAddress } = await helpersContract.getReserveTokensAddresses( - weth.address - ); - - const wethDebtToken = await getStableDebtToken(stableDebtTokenAddress); - - const onBehalfOfDebt = await wethDebtToken.balanceOf(onBehalfOf.address); - - expect(onBehalfOfDebt.toString()).to.be.equal('0', 'Invalid onBehalfOf user debt'); - }); - - it('Caller takes a WETH flashloan with mode = 2 onBehalfOf user with allowance. A loan for onBehalfOf is created.', async () => { - const { dai, pool, weth, users, helpersContract } = testEnv; - - const caller = users[5]; - const onBehalfOf = users[4]; - - const flashAmount = ethers.utils.parseEther('0.8'); - - const reserveData = await pool.getReserveData(weth.address); - - const variableDebtToken = await getVariableDebtToken(reserveData.variableDebtTokenAddress); - - // Deposited for onBehalfOf user already, delegate borrow allowance - await variableDebtToken - .connect(onBehalfOf.signer) - .approveDelegation(caller.address, flashAmount); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [flashAmount], - [2], - onBehalfOf.address, - '0x10', - '0' - ) - ).to.not.be.reverted; - - const { variableDebtTokenAddress } = await helpersContract.getReserveTokensAddresses( - weth.address - ); - - const wethDebtToken = await getVariableDebtToken(variableDebtTokenAddress); - - const onBehalfOfDebt = await wethDebtToken.balanceOf(onBehalfOf.address); - - expect(onBehalfOfDebt.toString()).to.be.equal( - ethers.utils.parseEther('0.8'), - 'Invalid onBehalfOf user debt' - ); - }); -}); diff --git a/test-suites/test-amm/helpers/actions.ts b/test-suites/test-amm/helpers/actions.ts deleted file mode 100644 index 62f9f8e34..000000000 --- a/test-suites/test-amm/helpers/actions.ts +++ /dev/null @@ -1,770 +0,0 @@ -import BigNumber from 'bignumber.js'; - -import { - calcExpectedReserveDataAfterBorrow, - calcExpectedReserveDataAfterDeposit, - calcExpectedReserveDataAfterRepay, - calcExpectedReserveDataAfterStableRateRebalance, - calcExpectedReserveDataAfterSwapRateMode, - calcExpectedReserveDataAfterWithdraw, - calcExpectedUserDataAfterBorrow, - calcExpectedUserDataAfterDeposit, - calcExpectedUserDataAfterRepay, - calcExpectedUserDataAfterSetUseAsCollateral, - calcExpectedUserDataAfterStableRateRebalance, - calcExpectedUserDataAfterSwapRateMode, - calcExpectedUserDataAfterWithdraw, -} from './utils/calculations'; -import { getReserveAddressFromSymbol, getReserveData, getUserData } from './utils/helpers'; - -import { convertToCurrencyDecimals } from '../../../helpers/contracts-helpers'; -import { - getAToken, - getMintableERC20, - getStableDebtToken, - getVariableDebtToken, -} from '../../../helpers/contracts-getters'; -import { MAX_UINT_AMOUNT, ONE_YEAR } from '../../../helpers/constants'; -import { SignerWithAddress, TestEnv } from './make-suite'; -import { advanceTimeAndBlock, DRE, timeLatest, waitForTx } from '../../../helpers/misc-utils'; - -import chai from 'chai'; -import { ReserveData, UserReserveData } from './utils/interfaces'; -import { ContractReceipt } from 'ethers'; -import { AToken } from '../../../types/AToken'; -import { RateMode, tEthereumAddress } from '../../../helpers/types'; - -const { expect } = chai; - -const almostEqualOrEqual = function ( - this: any, - expected: ReserveData | UserReserveData, - actual: ReserveData | UserReserveData -) { - const keys = Object.keys(actual); - - keys.forEach((key) => { - if ( - key === 'lastUpdateTimestamp' || - key === 'marketStableRate' || - key === 'symbol' || - key === 'aTokenAddress' || - key === 'decimals' || - key === 'totalStableDebtLastUpdated' - ) { - // skipping consistency check on accessory data - return; - } - - 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`); - - if (expected[key] == null || actual[key] == null) { - console.log('Found a undefined value for Key ', key, ' value ', expected[key], actual[key]); - } - - if (actual[key] instanceof BigNumber) { - const actualValue = (actual[key]).decimalPlaces(0, BigNumber.ROUND_DOWN); - const expectedValue = (expected[key]).decimalPlaces(0, BigNumber.ROUND_DOWN); - - 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] - ); - } - }); -}; - -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) - ? this._obj - : this._obj; - - almostEqualOrEqual.apply(this, [expected, actual]); - }; - }); -}); - -interface ActionsConfig { - skipIntegrityCheck: boolean; -} - -export const configuration: ActionsConfig = {}; - -export const mint = async (reserveSymbol: string, amount: string, user: SignerWithAddress) => { - const reserve = await getReserveAddressFromSymbol(reserveSymbol); - - const token = await getMintableERC20(reserve); - - await waitForTx( - await token.connect(user.signer).mint(await convertToCurrencyDecimals(reserve, amount)) - ); -}; - -export const approve = async (reserveSymbol: string, user: SignerWithAddress, testEnv: TestEnv) => { - const { pool } = testEnv; - const reserve = await getReserveAddressFromSymbol(reserveSymbol); - - const token = await getMintableERC20(reserve); - - await waitForTx( - await token.connect(user.signer).approve(pool.address, '100000000000000000000000000000') - ); -}; - -export const deposit = async ( - reserveSymbol: string, - amount: string, - sender: SignerWithAddress, - onBehalfOf: tEthereumAddress, - sendValue: string, - expectedResult: string, - testEnv: TestEnv, - revertMessage?: string -) => { - const { pool } = testEnv; - - const reserve = await getReserveAddressFromSymbol(reserveSymbol); - - const amountToDeposit = await convertToCurrencyDecimals(reserve, amount); - - const txOptions: any = {}; - - const { reserveData: reserveDataBefore, userData: userDataBefore } = await getContractsData( - reserve, - onBehalfOf, - testEnv, - sender.address - ); - - if (sendValue) { - txOptions.value = await convertToCurrencyDecimals(reserve, sendValue); - } - - if (expectedResult === 'success') { - const txResult = await waitForTx( - await pool - .connect(sender.signer) - .deposit(reserve, amountToDeposit, onBehalfOf, '0', txOptions) - ); - - const { - reserveData: reserveDataAfter, - userData: userDataAfter, - timestamp, - } = await getContractsData(reserve, onBehalfOf, testEnv, sender.address); - - const { txCost, txTimestamp } = await getTxCostAndTimestamp(txResult); - - const expectedReserveData = calcExpectedReserveDataAfterDeposit( - amountToDeposit.toString(), - reserveDataBefore, - txTimestamp - ); - - const expectedUserReserveData = calcExpectedUserDataAfterDeposit( - amountToDeposit.toString(), - 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 expect( - pool.connect(sender.signer).deposit(reserve, amountToDeposit, onBehalfOf, '0', txOptions), - revertMessage - ).to.be.reverted; - } -}; - -export const withdraw = async ( - reserveSymbol: string, - amount: string, - user: SignerWithAddress, - expectedResult: string, - testEnv: TestEnv, - revertMessage?: string -) => { - const { pool } = testEnv; - - const { - aTokenInstance, - reserve, - userData: userDataBefore, - reserveData: reserveDataBefore, - } = await getDataBeforeAction(reserveSymbol, user.address, testEnv); - - let amountToWithdraw = '0'; - - if (amount !== '-1') { - amountToWithdraw = (await convertToCurrencyDecimals(reserve, amount)).toString(); - } else { - amountToWithdraw = MAX_UINT_AMOUNT; - } - - if (expectedResult === 'success') { - const txResult = await waitForTx( - await pool.connect(user.signer).withdraw(reserve, amountToWithdraw, user.address) - ); - - const { - reserveData: reserveDataAfter, - userData: userDataAfter, - timestamp, - } = await getContractsData(reserve, user.address, testEnv); - - const { txCost, txTimestamp } = await getTxCostAndTimestamp(txResult); - - const expectedReserveData = calcExpectedReserveDataAfterWithdraw( - amountToWithdraw, - reserveDataBefore, - userDataBefore, - txTimestamp - ); - - const expectedUserData = calcExpectedUserDataAfterWithdraw( - amountToWithdraw, - reserveDataBefore, - expectedReserveData, - userDataBefore, - txTimestamp, - timestamp, - txCost - ); - - expectEqual(reserveDataAfter, expectedReserveData); - expectEqual(userDataAfter, expectedUserData); - - // truffleAssert.eventEmitted(txResult, "Redeem", (ev: any) => { - // const {_from, _value} = ev; - // return ( - // _from === user && new BigNumber(_value).isEqualTo(actualAmountRedeemed) - // ); - // }); - } else if (expectedResult === 'revert') { - await expect( - pool.connect(user.signer).withdraw(reserve, amountToWithdraw, user.address), - revertMessage - ).to.be.reverted; - } -}; - -export const delegateBorrowAllowance = async ( - reserve: string, - amount: string, - interestRateMode: string, - user: SignerWithAddress, - receiver: tEthereumAddress, - expectedResult: string, - testEnv: TestEnv, - revertMessage?: string -) => { - const { pool } = testEnv; - - const reserveAddress: tEthereumAddress = await getReserveAddressFromSymbol(reserve); - - const amountToDelegate: string = await ( - await convertToCurrencyDecimals(reserveAddress, amount) - ).toString(); - - const reserveData = await pool.getReserveData(reserveAddress); - - const debtToken = - interestRateMode === '1' - ? await getStableDebtToken(reserveData.stableDebtTokenAddress) - : await getVariableDebtToken(reserveData.variableDebtTokenAddress); - - const delegateAllowancePromise = debtToken - .connect(user.signer) - .approveDelegation(receiver, amountToDelegate); - - if (expectedResult === 'revert' && revertMessage) { - await expect(delegateAllowancePromise, revertMessage).to.be.revertedWith(revertMessage); - return; - } else { - await waitForTx(await delegateAllowancePromise); - const allowance = await debtToken.borrowAllowance(user.address, receiver); - expect(allowance.toString()).to.be.equal( - amountToDelegate, - 'borrowAllowance is set incorrectly' - ); - } -}; - -export const borrow = async ( - reserveSymbol: string, - amount: string, - interestRateMode: string, - user: SignerWithAddress, - onBehalfOf: tEthereumAddress, - timeTravel: string, - expectedResult: string, - testEnv: TestEnv, - revertMessage?: string -) => { - const { pool } = testEnv; - - const reserve = await getReserveAddressFromSymbol(reserveSymbol); - - const { reserveData: reserveDataBefore, userData: userDataBefore } = await getContractsData( - reserve, - onBehalfOf, - testEnv, - user.address - ); - - const amountToBorrow = await convertToCurrencyDecimals(reserve, amount); - - if (expectedResult === 'success') { - const txResult = await waitForTx( - await pool - .connect(user.signer) - .borrow(reserve, amountToBorrow, interestRateMode, '0', onBehalfOf) - ); - - const { txCost, txTimestamp } = await getTxCostAndTimestamp(txResult); - - if (timeTravel) { - const secondsToTravel = new BigNumber(timeTravel).multipliedBy(ONE_YEAR).div(365).toNumber(); - - await advanceTimeAndBlock(secondsToTravel); - } - - const { - reserveData: reserveDataAfter, - userData: userDataAfter, - timestamp, - } = await getContractsData(reserve, onBehalfOf, testEnv, user.address); - - const expectedReserveData = calcExpectedReserveDataAfterBorrow( - amountToBorrow.toString(), - interestRateMode, - reserveDataBefore, - userDataBefore, - txTimestamp, - timestamp - ); - - const expectedUserData = calcExpectedUserDataAfterBorrow( - amountToBorrow.toString(), - interestRateMode, - reserveDataBefore, - expectedReserveData, - userDataBefore, - txTimestamp, - timestamp - ); - - expectEqual(reserveDataAfter, expectedReserveData); - expectEqual(userDataAfter, expectedUserData); - - // truffleAssert.eventEmitted(txResult, "Borrow", (ev: any) => { - // const { - // _reserve, - // _user, - // _amount, - // _borrowRateMode, - // _borrowRate, - // _originationFee, - // } = ev; - // return ( - // _reserve.toLowerCase() === reserve.toLowerCase() && - // _user.toLowerCase() === user.toLowerCase() && - // new BigNumber(_amount).eq(amountToBorrow) && - // new BigNumber(_borrowRateMode).eq(expectedUserData.borrowRateMode) && - // new BigNumber(_borrowRate).eq(expectedUserData.borrowRate) && - // new BigNumber(_originationFee).eq( - // expectedUserData.originationFee.minus(userDataBefore.originationFee) - // ) - // ); - // }); - } else if (expectedResult === 'revert') { - await expect( - pool.connect(user.signer).borrow(reserve, amountToBorrow, interestRateMode, '0', onBehalfOf), - revertMessage - ).to.be.reverted; - } -}; - -export const repay = async ( - reserveSymbol: string, - amount: string, - rateMode: string, - user: SignerWithAddress, - onBehalfOf: SignerWithAddress, - sendValue: string, - expectedResult: string, - testEnv: TestEnv, - revertMessage?: string -) => { - const { pool } = testEnv; - const reserve = await getReserveAddressFromSymbol(reserveSymbol); - - const { reserveData: reserveDataBefore, userData: userDataBefore } = await getContractsData( - reserve, - onBehalfOf.address, - testEnv - ); - - let amountToRepay = '0'; - - if (amount !== '-1') { - amountToRepay = (await convertToCurrencyDecimals(reserve, amount)).toString(); - } else { - amountToRepay = MAX_UINT_AMOUNT; - } - amountToRepay = '0x' + new BigNumber(amountToRepay).toString(16); - - const txOptions: any = {}; - - if (sendValue) { - const valueToSend = await convertToCurrencyDecimals(reserve, sendValue); - txOptions.value = '0x' + new BigNumber(valueToSend.toString()).toString(16); - } - - if (expectedResult === 'success') { - const txResult = await waitForTx( - await pool - .connect(user.signer) - .repay(reserve, amountToRepay, rateMode, onBehalfOf.address, txOptions) - ); - - const { txCost, txTimestamp } = await getTxCostAndTimestamp(txResult); - - const { - reserveData: reserveDataAfter, - userData: userDataAfter, - timestamp, - } = await getContractsData(reserve, onBehalfOf.address, testEnv); - - const expectedReserveData = calcExpectedReserveDataAfterRepay( - amountToRepay, - rateMode, - reserveDataBefore, - userDataBefore, - txTimestamp, - timestamp - ); - - const expectedUserData = calcExpectedUserDataAfterRepay( - amountToRepay, - rateMode, - reserveDataBefore, - expectedReserveData, - userDataBefore, - user.address, - onBehalfOf.address, - txTimestamp, - timestamp - ); - - expectEqual(reserveDataAfter, expectedReserveData); - expectEqual(userDataAfter, expectedUserData); - - // truffleAssert.eventEmitted(txResult, "Repay", (ev: any) => { - // const {_reserve, _user, _repayer} = ev; - - // return ( - // _reserve.toLowerCase() === reserve.toLowerCase() && - // _user.toLowerCase() === onBehalfOf.toLowerCase() && - // _repayer.toLowerCase() === user.toLowerCase() - // ); - // }); - } else if (expectedResult === 'revert') { - await expect( - pool - .connect(user.signer) - .repay(reserve, amountToRepay, rateMode, onBehalfOf.address, txOptions), - revertMessage - ).to.be.reverted; - } -}; - -export const setUseAsCollateral = async ( - reserveSymbol: string, - user: SignerWithAddress, - useAsCollateral: string, - expectedResult: string, - testEnv: TestEnv, - revertMessage?: string -) => { - const { pool } = testEnv; - - const reserve = await getReserveAddressFromSymbol(reserveSymbol); - - const { reserveData: reserveDataBefore, userData: userDataBefore } = await getContractsData( - reserve, - user.address, - testEnv - ); - - const useAsCollateralBool = useAsCollateral.toLowerCase() === 'true'; - - if (expectedResult === 'success') { - const txResult = await waitForTx( - await pool.connect(user.signer).setUserUseReserveAsCollateral(reserve, useAsCollateralBool) - ); - - const { txCost } = await getTxCostAndTimestamp(txResult); - - const { userData: userDataAfter } = await getContractsData(reserve, user.address, testEnv); - - const expectedUserData = calcExpectedUserDataAfterSetUseAsCollateral( - useAsCollateral.toLocaleLowerCase() === 'true', - reserveDataBefore, - userDataBefore, - txCost - ); - - expectEqual(userDataAfter, expectedUserData); - // if (useAsCollateralBool) { - // truffleAssert.eventEmitted(txResult, 'ReserveUsedAsCollateralEnabled', (ev: any) => { - // const {_reserve, _user} = ev; - // return _reserve === reserve && _user === user; - // }); - // } else { - // truffleAssert.eventEmitted(txResult, 'ReserveUsedAsCollateralDisabled', (ev: any) => { - // const {_reserve, _user} = ev; - // return _reserve === reserve && _user === user; - // }); - // } - } else if (expectedResult === 'revert') { - await expect( - pool.connect(user.signer).setUserUseReserveAsCollateral(reserve, useAsCollateralBool), - revertMessage - ).to.be.reverted; - } -}; - -export const swapBorrowRateMode = async ( - reserveSymbol: string, - user: SignerWithAddress, - rateMode: string, - expectedResult: string, - testEnv: TestEnv, - revertMessage?: string -) => { - const { pool } = testEnv; - - const reserve = await getReserveAddressFromSymbol(reserveSymbol); - - const { reserveData: reserveDataBefore, userData: userDataBefore } = await getContractsData( - reserve, - user.address, - testEnv - ); - - if (expectedResult === 'success') { - const txResult = await waitForTx( - await pool.connect(user.signer).swapBorrowRateMode(reserve, rateMode) - ); - - const { txCost, txTimestamp } = await getTxCostAndTimestamp(txResult); - - const { reserveData: reserveDataAfter, userData: userDataAfter } = await getContractsData( - reserve, - user.address, - testEnv - ); - - const expectedReserveData = calcExpectedReserveDataAfterSwapRateMode( - reserveDataBefore, - userDataBefore, - rateMode, - txTimestamp - ); - - const expectedUserData = calcExpectedUserDataAfterSwapRateMode( - reserveDataBefore, - expectedReserveData, - userDataBefore, - rateMode, - txCost, - txTimestamp - ); - - expectEqual(reserveDataAfter, expectedReserveData); - expectEqual(userDataAfter, expectedUserData); - - // truffleAssert.eventEmitted(txResult, "Swap", (ev: any) => { - // const {_user, _reserve, _newRateMode, _newRate} = ev; - // return ( - // _user === user && - // _reserve == reserve && - // new BigNumber(_newRateMode).eq(expectedUserData.borrowRateMode) && - // new BigNumber(_newRate).eq(expectedUserData.borrowRate) - // ); - // }); - } else if (expectedResult === 'revert') { - await expect(pool.connect(user.signer).swapBorrowRateMode(reserve, rateMode), revertMessage).to - .be.reverted; - } -}; - -export const rebalanceStableBorrowRate = async ( - reserveSymbol: string, - user: SignerWithAddress, - target: SignerWithAddress, - expectedResult: string, - testEnv: TestEnv, - revertMessage?: string -) => { - const { pool } = testEnv; - - const reserve = await getReserveAddressFromSymbol(reserveSymbol); - - const { reserveData: reserveDataBefore, userData: userDataBefore } = await getContractsData( - reserve, - target.address, - testEnv - ); - - if (expectedResult === 'success') { - const txResult = await waitForTx( - await pool.connect(user.signer).rebalanceStableBorrowRate(reserve, target.address) - ); - - const { txCost, txTimestamp } = await getTxCostAndTimestamp(txResult); - - const { reserveData: reserveDataAfter, userData: userDataAfter } = await getContractsData( - reserve, - target.address, - testEnv - ); - - const expectedReserveData = calcExpectedReserveDataAfterStableRateRebalance( - reserveDataBefore, - userDataBefore, - txTimestamp - ); - - const expectedUserData = calcExpectedUserDataAfterStableRateRebalance( - reserveDataBefore, - expectedReserveData, - userDataBefore, - txCost, - txTimestamp - ); - - expectEqual(reserveDataAfter, expectedReserveData); - expectEqual(userDataAfter, expectedUserData); - - // truffleAssert.eventEmitted(txResult, 'RebalanceStableBorrowRate', (ev: any) => { - // const {_user, _reserve, _newStableRate} = ev; - // return ( - // _user.toLowerCase() === target.toLowerCase() && - // _reserve.toLowerCase() === reserve.toLowerCase() && - // new BigNumber(_newStableRate).eq(expectedUserData.borrowRate) - // ); - // }); - } else if (expectedResult === 'revert') { - await expect( - pool.connect(user.signer).rebalanceStableBorrowRate(reserve, target.address), - revertMessage - ).to.be.reverted; - } -}; - -const expectEqual = ( - actual: UserReserveData | ReserveData, - expected: UserReserveData | ReserveData -) => { - if (!configuration.skipIntegrityCheck) { - // @ts-ignore - expect(actual).to.be.almostEqualOrEqual(expected); - } -}; - -interface ActionData { - reserve: string; - reserveData: ReserveData; - userData: UserReserveData; - aTokenInstance: AToken; -} - -const getDataBeforeAction = async ( - reserveSymbol: string, - user: tEthereumAddress, - testEnv: TestEnv -): Promise => { - const reserve = await getReserveAddressFromSymbol(reserveSymbol); - - const { reserveData, userData } = await getContractsData(reserve, user, testEnv); - const aTokenInstance = await getAToken(reserveData.aTokenAddress); - return { - reserve, - reserveData, - userData, - aTokenInstance, - }; -}; - -export const getTxCostAndTimestamp = async (tx: ContractReceipt) => { - if (!tx.blockNumber || !tx.transactionHash || !tx.cumulativeGasUsed) { - throw new Error('No tx blocknumber'); - } - const txTimestamp = new BigNumber((await DRE.ethers.provider.getBlock(tx.blockNumber)).timestamp); - - const txInfo = await DRE.ethers.provider.getTransaction(tx.transactionHash); - const txCost = new BigNumber(tx.cumulativeGasUsed.toString()).multipliedBy( - txInfo.gasPrice.toString() - ); - - return { txCost, txTimestamp }; -}; - -export const getContractsData = async ( - reserve: string, - user: string, - testEnv: TestEnv, - sender?: string -) => { - const { pool, helpersContract } = testEnv; - - const [userData, reserveData, timestamp] = await Promise.all([ - getUserData(pool, helpersContract, reserve, user, sender || user), - getReserveData(helpersContract, reserve), - timeLatest(), - ]); - - return { - reserveData, - userData, - timestamp: new BigNumber(timestamp), - }; -}; diff --git a/test-suites/test-amm/helpers/almost-equal.ts b/test-suites/test-amm/helpers/almost-equal.ts deleted file mode 100644 index e00170564..000000000 --- a/test-suites/test-amm/helpers/almost-equal.ts +++ /dev/null @@ -1,31 +0,0 @@ -import BigNumber from 'bignumber.js'; - -function almostEqualAssertion(this: any, expected: any, actual: any, message: string): any { - this.assert( - expected.plus(new BigNumber(1)).eq(actual) || - expected.plus(new BigNumber(2)).eq(actual) || - actual.plus(new BigNumber(1)).eq(expected) || - actual.plus(new BigNumber(2)).eq(expected) || - expected.eq(actual), - `${message} expected #{act} to be almost equal #{exp}`, - `${message} expected #{act} to be different from #{exp}`, - expected.toString(), - actual.toString() - ); -} - -export function almostEqual() { - return function (chai: any, utils: any) { - chai.Assertion.overwriteMethod('almostEqual', function (original: any) { - return function (this: any, value: any, message: string) { - if (utils.flag(this, 'bignumber')) { - var expected = new BigNumber(value); - var actual = new BigNumber(this._obj); - almostEqualAssertion.apply(this, [expected, actual, message]); - } else { - original.apply(this, arguments); - } - }; - }); - }; -} diff --git a/test-suites/test-amm/helpers/make-suite.ts b/test-suites/test-amm/helpers/make-suite.ts deleted file mode 100644 index 39b6309a0..000000000 --- a/test-suites/test-amm/helpers/make-suite.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { evmRevert, evmSnapshot, DRE } from '../../../helpers/misc-utils'; -import { Signer } from 'ethers'; -import { - getPool, - getPoolAddressesProvider, - getAaveProtocolDataProvider, - getAToken, - getMintableERC20, - getPoolConfiguratorProxy, - getPriceOracle, - getPoolAddressesProviderRegistry, - getWETHMocked, -} from '../../../helpers/contracts-getters'; -import { eEthereumNetwork, eNetwork, tEthereumAddress } from '../../../helpers/types'; -import { Pool } from '../../../types/Pool'; -import { AaveProtocolDataProvider } from '../../../types/AaveProtocolDataProvider'; -import { MintableERC20 } from '../../../types/MintableERC20'; -import { AToken } from '../../../types/AToken'; -import { PoolConfigurator } from '../../../types/PoolConfigurator'; - -import chai from 'chai'; -// @ts-ignore -import bignumberChai from 'chai-bignumber'; -import { almostEqual } from './almost-equal'; -import { PriceOracle } from '../../../types/PriceOracle'; -import { PoolAddressesProvider } from '../../../types/PoolAddressesProvider'; -import { PoolAddressesProviderRegistry } from '../../../types/PoolAddressesProviderRegistry'; -import { getEthersSigners } from '../../../helpers/contracts-helpers'; -import { getParamPerNetwork } from '../../../helpers/contracts-helpers'; -import { WETH9Mocked } from '../../../types/WETH9Mocked'; -import { solidity } from 'ethereum-waffle'; -import { AmmConfig } from '../../../markets/amm'; -import { HardhatRuntimeEnvironment } from 'hardhat/types'; -import { usingTenderly } from '../../../helpers/tenderly-utils'; - -chai.use(bignumberChai()); -chai.use(almostEqual()); -chai.use(solidity); - -export interface SignerWithAddress { - signer: Signer; - address: tEthereumAddress; -} -export interface TestEnv { - deployer: SignerWithAddress; - users: SignerWithAddress[]; - pool: Pool; - configurator: PoolConfigurator; - oracle: PriceOracle; - helpersContract: AaveProtocolDataProvider; - weth: WETH9Mocked; - aWETH: AToken; - dai: MintableERC20; - aDai: AToken; - usdc: MintableERC20; - aave: MintableERC20; - addressesProvider: PoolAddressesProvider; - registry: PoolAddressesProviderRegistry; -} - -let buidlerevmSnapshotId: string = '0x1'; -const setBuidlerevmSnapshotId = (id: string) => { - buidlerevmSnapshotId = id; -}; - -const testEnv: TestEnv = { - deployer: {} as SignerWithAddress, - users: [] as SignerWithAddress[], - pool: {} as Pool, - configurator: {} as PoolConfigurator, - helpersContract: {} as AaveProtocolDataProvider, - oracle: {} as PriceOracle, - weth: {} as WETH9Mocked, - aWETH: {} as AToken, - dai: {} as MintableERC20, - aDai: {} as AToken, - usdc: {} as MintableERC20, - aave: {} as MintableERC20, - addressesProvider: {} as PoolAddressesProvider, - registry: {} as PoolAddressesProviderRegistry, -} as TestEnv; - -export async function initializeMakeSuite() { - const [_deployer, ...restSigners] = await getEthersSigners(); - const deployer: SignerWithAddress = { - address: await _deployer.getAddress(), - signer: _deployer, - }; - - for (const signer of restSigners) { - testEnv.users.push({ - signer, - address: await signer.getAddress(), - }); - } - testEnv.deployer = deployer; - testEnv.pool = await getPool(); - - testEnv.configurator = await getPoolConfiguratorProxy(); - - testEnv.addressesProvider = await getPoolAddressesProvider(); - - if (process.env.FORK) { - testEnv.registry = await getPoolAddressesProviderRegistry( - getParamPerNetwork(AmmConfig.ProviderRegistry, process.env.FORK as eNetwork) - ); - } else { - testEnv.registry = await getPoolAddressesProviderRegistry(); - testEnv.oracle = await getPriceOracle(); - } - - testEnv.helpersContract = await getAaveProtocolDataProvider(); - - const allTokens = await testEnv.helpersContract.getAllATokens(); - const aDaiAddress = allTokens.find((aToken) => aToken.symbol === 'aAmmDAI')?.tokenAddress; - - const aWEthAddress = allTokens.find((aToken) => aToken.symbol === 'aAmmWETH')?.tokenAddress; - - const reservesTokens = await testEnv.helpersContract.getAllReservesTokens(); - - const daiAddress = reservesTokens.find((token) => token.symbol === 'DAI')?.tokenAddress; - const usdcAddress = reservesTokens.find((token) => token.symbol === 'USDC')?.tokenAddress; - const aaveAddress = reservesTokens.find((token) => token.symbol === 'UniAAVEWETH')?.tokenAddress; - const wethAddress = reservesTokens.find((token) => token.symbol === 'WETH')?.tokenAddress; - - if (!aDaiAddress || !aWEthAddress) { - process.exit(1); - } - if (!daiAddress || !usdcAddress || !aaveAddress || !wethAddress) { - process.exit(1); - } - - testEnv.aDai = await getAToken(aDaiAddress); - testEnv.aWETH = await getAToken(aWEthAddress); - - testEnv.dai = await getMintableERC20(daiAddress); - testEnv.usdc = await getMintableERC20(usdcAddress); - testEnv.aave = await getMintableERC20(aaveAddress); - testEnv.weth = await getWETHMocked(wethAddress); -} - -const setSnapshot = async () => { - const hre = DRE as HardhatRuntimeEnvironment; - if (usingTenderly()) { - setBuidlerevmSnapshotId((await hre.tenderlyNetwork.getHead()) || '0x1'); - return; - } - setBuidlerevmSnapshotId(await evmSnapshot()); -}; - -const revertHead = async () => { - const hre = DRE as HardhatRuntimeEnvironment; - if (usingTenderly()) { - await hre.tenderlyNetwork.setHead(buidlerevmSnapshotId); - return; - } - await evmRevert(buidlerevmSnapshotId); -}; - -export function makeSuite(name: string, tests: (testEnv: TestEnv) => void) { - describe(name, () => { - before(async () => { - await setSnapshot(); - }); - tests(testEnv); - after(async () => { - await revertHead(); - }); - }); -} diff --git a/test-suites/test-amm/helpers/scenario-engine.ts b/test-suites/test-amm/helpers/scenario-engine.ts deleted file mode 100644 index 492fa8b29..000000000 --- a/test-suites/test-amm/helpers/scenario-engine.ts +++ /dev/null @@ -1,237 +0,0 @@ -import { TestEnv, SignerWithAddress } from './make-suite'; -import { - mint, - approve, - deposit, - borrow, - withdraw, - repay, - setUseAsCollateral, - swapBorrowRateMode, - rebalanceStableBorrowRate, - delegateBorrowAllowance, -} from './actions'; -import { RateMode } from '../../../helpers/types'; - -export interface Action { - name: string; - args?: any; - expected: string; - revertMessage?: string; -} - -export interface Story { - description: string; - actions: Action[]; -} - -export interface Scenario { - title: string; - description: string; - stories: Story[]; -} - -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: SignerWithAddress[], testEnv: TestEnv) => { - const { reserve, user: userIndex, borrowRateMode } = 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 (!userIndex || userIndex === '') { - throw `Invalid user selected to deposit into the ${reserve} reserve`; - } - - if (!expected || expected === '') { - throw `An expected resut for action ${name} is required`; - } - - let rateMode: string = RateMode.None; - - if (borrowRateMode) { - if (borrowRateMode === 'none') { - rateMode = 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'; - } - } - - const user = users[parseInt(userIndex)]; - - switch (name) { - case 'mint': - const { amount } = action.args; - - if (!amount || amount === '') { - throw `Invalid amount of ${reserve} to mint`; - } - - await mint(reserve, amount, user); - break; - - case 'approve': - await approve(reserve, user, testEnv); - break; - - case 'deposit': - { - const { amount, sendValue, onBehalfOf: onBehalfOfIndex } = action.args; - const onBehalfOf = onBehalfOfIndex - ? users[parseInt(onBehalfOfIndex)].address - : user.address; - - if (!amount || amount === '') { - throw `Invalid amount to deposit into the ${reserve} reserve`; - } - - await deposit( - reserve, - amount, - user, - onBehalfOf, - sendValue, - expected, - testEnv, - revertMessage - ); - } - break; - - case 'delegateBorrowAllowance': - { - const { amount, toUser: toUserIndex } = action.args; - const toUser = users[parseInt(toUserIndex, 10)].address; - if (!amount || amount === '') { - throw `Invalid amount to deposit into the ${reserve} reserve`; - } - - await delegateBorrowAllowance( - reserve, - amount, - rateMode, - user, - toUser, - expected, - testEnv, - revertMessage - ); - } - break; - - case 'withdraw': - { - const { amount } = action.args; - - if (!amount || amount === '') { - throw `Invalid amount to withdraw from the ${reserve} reserve`; - } - - await withdraw(reserve, amount, user, expected, testEnv, revertMessage); - } - break; - case 'borrow': - { - const { amount, timeTravel, onBehalfOf: onBehalfOfIndex } = action.args; - - const onBehalfOf = onBehalfOfIndex - ? users[parseInt(onBehalfOfIndex)].address - : user.address; - - if (!amount || amount === '') { - throw `Invalid amount to borrow from the ${reserve} reserve`; - } - - await borrow( - reserve, - amount, - rateMode, - user, - onBehalfOf, - timeTravel, - expected, - testEnv, - revertMessage - ); - } - break; - - case 'repay': - { - const { amount, borrowRateMode, sendValue } = action.args; - let { onBehalfOf: onBehalfOfIndex } = action.args; - - if (!amount || amount === '') { - throw `Invalid amount to repay into the ${reserve} reserve`; - } - - let userToRepayOnBehalf: SignerWithAddress; - if (!onBehalfOfIndex || onBehalfOfIndex === '') { - console.log( - 'WARNING: No onBehalfOf specified for a repay action. Defaulting to the repayer address' - ); - userToRepayOnBehalf = user; - } else { - userToRepayOnBehalf = users[parseInt(onBehalfOfIndex)]; - } - - await repay( - reserve, - amount, - rateMode, - user, - userToRepayOnBehalf, - sendValue, - expected, - testEnv, - revertMessage - ); - } - break; - - 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, user, useAsCollateral, expected, testEnv, revertMessage); - } - break; - - case 'swapBorrowRateMode': - await swapBorrowRateMode(reserve, user, rateMode, expected, testEnv, revertMessage); - break; - - case 'rebalanceStableBorrowRate': - { - const { target: targetIndex } = action.args; - - if (!targetIndex || targetIndex === '') { - throw `A target must be selected when trying to rebalance a stable rate`; - } - const target = users[parseInt(targetIndex)]; - - await rebalanceStableBorrowRate(reserve, user, target, expected, testEnv, revertMessage); - } - break; - - default: - throw `Invalid action requested: ${name}`; - } -}; diff --git a/test-suites/test-amm/helpers/scenarios/borrow-negatives.json b/test-suites/test-amm/helpers/scenarios/borrow-negatives.json deleted file mode 100644 index b7782db38..000000000 --- a/test-suites/test-amm/helpers/scenarios/borrow-negatives.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "title": "Pool: Borrow negatives (reverts)", - "description": "Test cases for the deposit function.", - "stories": [ - { - "description": "User 0 deposits 1000 DAI, user 1 deposits 1 WETH as collateral and tries to borrow 100 DAI with rate mode NONE (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "none", - "user": "1" - }, - "expected": "revert", - "revertMessage": "Invalid interest rate mode selected" - } - ] - }, - { - "description": "User 0 deposits 1000 DAI, user 1 deposits 1 WETH as collateral and tries to borrow 100 DAI with an invalid rate mode (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "invalid", - "user": "1" - }, - "expected": "revert", - "revertMessage": "Invalid interest rate mode selected" - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/scenarios/borrow-repay-stable.json b/test-suites/test-amm/helpers/scenarios/borrow-repay-stable.json deleted file mode 100644 index 0e03af71e..000000000 --- a/test-suites/test-amm/helpers/scenarios/borrow-repay-stable.json +++ /dev/null @@ -1,730 +0,0 @@ -{ - "title": "Pool: Borrow/repay (stable rate)", - "description": "Test cases for the borrow function, stable mode.", - "stories": [ - { - "description": "User 0 deposits 1000 DAI, user 1 deposits 1 WETH as collateral and tries to borrow 100 DAI at stable rate (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "stable", - "user": "1", - "timeTravel": "365" - }, - "expected": "revert" - } - ] - }, - { - "description": "User 1 tries to borrow the rest of the DAI liquidity (revert expected)", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "900", - "borrowRateMode": "stable", - "user": "1" - }, - "expected": "revert", - "revertMessage": "12" - } - ] - }, - { - "description": "User 1 tries to borrow 100 DAI at variable", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 tries to borrow the rest of the DAI liquidity at stable (revert expected)", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "900", - "borrowRateMode": "stable", - "user": "1" - }, - "expected": "revert", - "revertMessage": "12" - } - ] - }, - { - "description": "User 1 repays half of the DAI borrow at stable after one year (revert expected)", - "actions": [ - { - "name": "mint", - "description": "Mint 10 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "10", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "50", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "stable" - }, - "expected": "revert" - } - ] - }, - { - "description": "User 1 repays half of the variable DAI borrow after one year", - "actions": [ - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "50", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 repays the rest of the DAI borrow at stable after one year (revert expected)", - "actions": [ - { - "name": "mint", - "description": "Mint 15 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "15", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "stable" - }, - "expected": "revert" - } - ] - }, - { - "description": "User 1 repays the rest of the DAI borrow after one year at variable", - "actions": [ - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws the deposited DAI plus interest", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 deposits 1000 DAI, user 2 tries to borrow 1000 DAI at a stable rate without any collateral (revert expected) User 1 withdrawws", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "1000", - "borrowRateMode": "stable", - "user": "2" - }, - "expected": "revert", - "revertMessage": "The collateral balance is 0" - }, - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 deposits 1000 DAI, user 1,2,3,4 deposit 1 WETH each and borrow 100 DAI at stable rate (revert expected) user 0 withdraws", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "stable", - "user": "1", - "timeTravel": "365" - }, - "expected": "revert" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "2" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "2" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "2" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "stable", - "user": "2", - "timeTravel": "365" - }, - "expected": "revert" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "3" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "3" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "3" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "stable", - "user": "3", - "timeTravel": "365" - }, - "expected": "revert" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "4" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "4" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "4" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "stable", - "user": "4", - "timeTravel": "365" - }, - "expected": "revert" - }, - { - "name": "mint", - "description": "Mint 15 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "15", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "mint", - "description": "Mint 20 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "20", - "user": "2" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "2" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "2", - "onBehalfOf": "2", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "mint", - "description": "Mint 30 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "30", - "user": "3" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "3" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "3", - "onBehalfOf": "3", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "mint", - "description": "Mint 30 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "30", - "user": "4" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "4" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "4", - "onBehalfOf": "4", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 deposits 1000 DAI, user 1 deposits 2 WETH and borrow 100 DAI at stable rate first (revert expected), then 100 DAI at variable rate twice, repays everything. User 0 withdraws", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "2", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "2", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "stable", - "user": "1", - "timeTravel": "365" - }, - "expected": "revert" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "variable", - "user": "1", - "timeTravel": "365" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "variable", - "user": "1", - "timeTravel": "365" - }, - "expected": "success" - }, - { - "name": "mint", - "description": "Mint 50 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "50", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - }, - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/scenarios/borrow-repay-variable.json b/test-suites/test-amm/helpers/scenarios/borrow-repay-variable.json deleted file mode 100644 index c9b31b6c9..000000000 --- a/test-suites/test-amm/helpers/scenarios/borrow-repay-variable.json +++ /dev/null @@ -1,956 +0,0 @@ -{ - "title": "Pool: Borrow/repay (variable rate)", - "description": "Test cases for the borrow function, variable mode.", - "stories": [ - { - "description": "User 2 deposits 1 DAI to account for rounding errors", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1", - "user": "2" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "2" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1", - "user": "2" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 deposits 1000 DAI, user 1 deposits 1 WETH as collateral and borrows 100 DAI at variable rate", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "variable", - "user": "1", - "timeTravel": "365" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 tries to borrow the rest of the DAI liquidity (revert expected)", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "900", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "revert", - "revertMessage": "There is not enough collateral to cover a new borrow" - } - ] - }, - { - "description": "User 1 tries to repay 0 DAI (revert expected)", - "actions": [ - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "0", - "user": "1", - "onBehalfOf": "1" - }, - "expected": "revert", - "revertMessage": "Amount must be greater than 0" - } - ] - }, - { - "description": "User 1 repays a small amount of DAI, enough to cover a small part of the interest", - "actions": [ - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "1.25", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 repays the DAI borrow after one year", - "actions": [ - { - "name": "mint", - "description": "Mint 10 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "10", - "user": "1" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws the deposited DAI plus interest", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 withdraws the collateral", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "-1", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 2 deposits a small amount of WETH to account for rounding errors", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "0.001", - "user": "2" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "2" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "0.001", - "user": "2" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 deposits 1 WETH, user 1 deposits 100 UNILINKWETH as collateral and borrows 0.5 WETH at variable rate", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "UNILINKWETH", - "amount": "100", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "UNILINKWETH", - "user": "1" - }, - "expected": "success" - }, - - { - "name": "deposit", - "args": { - "reserve": "UNILINKWETH", - "amount": "100", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "WETH", - "amount": "0.5", - "borrowRateMode": "variable", - "user": "1", - "timeTravel": "365" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 tries to repay 0 WETH", - "actions": [ - { - "name": "repay", - "args": { - "reserve": "WETH", - "amount": "0", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "variable" - }, - "expected": "revert", - "revertMessage": "Amount must be greater than 0" - } - ] - }, - { - "description": "User 2 tries to repay everything on behalf of user 1 using uint(-1) (revert expected)", - "actions": [ - { - "name": "repay", - "args": { - "reserve": "WETH", - "amount": "-1", - "user": "2", - "borrowRateMode": "variable", - "onBehalfOf": "1" - }, - "expected": "revert", - "revertMessage": "To repay on behalf of an user an explicit amount to repay is needed" - } - ] - }, - { - "description": "User 3 repays a small amount of WETH on behalf of user 1", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "3" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "3" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "WETH", - "amount": "0.2", - "user": "3", - "borrowRateMode": "variable", - "onBehalfOf": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 repays the WETH borrow after one year", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "2" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "2" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "WETH", - "amount": "-1", - "borrowRateMode": "variable", - "user": "1", - "onBehalfOf": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws the deposited WETH plus interest", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 withdraws the collateral", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "UNILINKWETH", - "amount": "-1", - "user": "1" - }, - "expected": "success" - } - ] - }, - - { - "description": "User 2 deposits 1 USDC to account for rounding errors", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "USDC", - "amount": "1", - "user": "2" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "2" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "USDC", - "amount": "1", - "user": "2" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 deposits 1000 USDC, user 1 deposits 1 WETH as collateral and borrows 100 USDC at variable rate", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "USDC", - "amount": "100", - "borrowRateMode": "variable", - "user": "1", - "timeTravel": "365" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 tries to borrow the rest of the USDC liquidity (revert expected)", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "USDC", - "amount": "900", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "revert", - "revertMessage": "There is not enough collateral to cover a new borrow" - } - ] - }, - { - "description": "User 1 repays the USDC borrow after one year", - "actions": [ - { - "name": "mint", - "description": "Mint 10 USDC to cover the interest", - "args": { - "reserve": "USDC", - "amount": "10", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "1" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "USDC", - "amount": "-1", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws the deposited USDC plus interest", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "USDC", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 withdraws the collateral", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "-1", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 deposits 1000 DAI, user 3 tries to borrow 1000 DAI without any collateral (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "1000", - "borrowRateMode": "variable", - "user": "3" - }, - "expected": "revert", - "revertMessage": "The collateral balance is 0" - } - ] - }, - { - "description": "user 3 deposits 0.1 WETH collateral to borrow 100 DAI; 0.1 WETH is not enough to borrow 100 DAI (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "0.1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "0.1", - "user": "3" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "variable", - "user": "3" - }, - "expected": "revert", - "revertMessage": "There is not enough collateral to cover a new borrow" - } - ] - }, - { - "description": "user 3 withdraws the 0.1 WETH", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "-1", - "user": "3" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 deposits 1000 USDC, user 3 tries to borrow 1000 USDC without any collateral (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "USDC", - "amount": "1000", - "borrowRateMode": "variable", - "user": "3" - }, - "expected": "revert", - "revertMessage": "The collateral balance is 0" - } - ] - }, - { - "description": "user 3 deposits 0.1 WETH collateral to borrow 100 USDC; 0.1 WETH is not enough to borrow 100 USDC (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "3" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "0.1", - "user": "3" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "USDC", - "amount": "100", - "borrowRateMode": "variable", - "user": "3" - }, - "expected": "revert", - "revertMessage": "There is not enough collateral to cover a new borrow" - } - ] - }, - { - "description": "user 3 withdraws the 0.1 WETH", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "-1", - "user": "3" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 deposits 1000 DAI, user 6 deposits 2 WETH and borrow 100 DAI at variable rate first, then 100 DAI at stable rate (revert expected), then 100 DAI at variable again, repays everything. User 0 withdraws", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "2", - "user": "6" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "6" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "2", - "user": "6" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "variable", - "user": "6", - "timeTravel": "365" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "stable", - "user": "6", - "timeTravel": "365" - }, - "expected": "revert" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "variable", - "user": "6", - "timeTravel": "365" - }, - "expected": "success" - }, - { - "name": "mint", - "description": "Mint 50 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "50", - "user": "6" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "6" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "6", - "onBehalfOf": "6", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "6", - "onBehalfOf": "6", - "borrowRateMode": "variable" - }, - "expected": "success" - }, - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/scenarios/credit-delegation.json b/test-suites/test-amm/helpers/scenarios/credit-delegation.json deleted file mode 100644 index 4da8d96e7..000000000 --- a/test-suites/test-amm/helpers/scenarios/credit-delegation.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "title": "Pool: credit delegation", - "description": "Test cases for the credit delegation related functions.", - "stories": [ - { - "description": "User 3 deposits 1000 WETH. User 0 deposits 1000 DAI, user 0 delegates borrowing of 1 WETH on variable to user 4, user 4 borrows 1 WETH variable on behalf of user 0", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1000", - "user": "3" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "3" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1000", - "user": "3" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "delegateBorrowAllowance", - "args": { - "reserve": "WETH", - "amount": "2", - "user": "0", - "borrowRateMode": "variable", - "toUser": "4" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "4", - "onBehalfOf": "0", - "borrowRateMode": "variable" - }, - "expected": "success" - } - ] - }, - { - "description": "User 4 trying to borrow 1 WETH stable on behalf of user 0, (revert expected)", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "4", - "onBehalfOf": "0", - "borrowRateMode": "stable" - }, - "expected": "revert", - "revertMessage": "59" - } - ] - }, - { - "description": "User 0 delegates borrowing of 1 WETH to user 4, user 4 borrows 3 WETH variable on behalf of user 0, (revert expected)", - "actions": [ - { - "name": "delegateBorrowAllowance", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0", - "borrowRateMode": "variable", - "toUser": "4" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "WETH", - "amount": "3", - "user": "4", - "onBehalfOf": "0", - "borrowRateMode": "variable" - }, - "expected": "revert", - "revertMessage": "59" - } - ] - }, - { - "description": "User 0 delegates borrowing of 1 WETH on stable to user 2, user 2 borrows 1 WETH stable on behalf of user 0 (revert expected)", - "actions": [ - { - "name": "delegateBorrowAllowance", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0", - "borrowRateMode": "stable", - "toUser": "2" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "2", - "onBehalfOf": "0", - "borrowRateMode": "stable" - }, - "expected": "revert" - } - ] - }, - { - "description": "User 0 delegates borrowing of 1 WETH on variable to user 2, user 2 borrows 1 WETH variable on behalf of user 0", - "actions": [ - { - "name": "delegateBorrowAllowance", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0", - "borrowRateMode": "variable", - "toUser": "2" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "2", - "onBehalfOf": "0", - "borrowRateMode": "variable" - }, - "expected": "success" - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/scenarios/deposit.json b/test-suites/test-amm/helpers/scenarios/deposit.json deleted file mode 100644 index 37024be84..000000000 --- a/test-suites/test-amm/helpers/scenarios/deposit.json +++ /dev/null @@ -1,266 +0,0 @@ -{ - "title": "Pool: Deposit", - "description": "Test cases for the deposit function.", - "stories": [ - { - "description": "User 0 Deposits 1000 DAI in an empty reserve", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 deposits 1000 DAI after user 0", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 deposits 1000 USDC in an empty reserve", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 deposits 1000 USDC after user 0", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 deposits 1 WETH in an empty reserve", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 deposits 1 WETH after user 0", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 deposits 0 WETH (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "0", - "user": "1" - }, - "expected": "revert", - "revertMessage": "Amount must be greater than 0" - } - ] - }, - { - "description": "User 1 deposits 0 DAI", - "actions": [ - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "0", - "user": "1" - }, - "expected": "revert", - "revertMessage": "Amount must be greater than 0" - } - ] - }, - { - "description": "User 1 deposits 100 DAI on behalf of user 2, user 2 tries to borrow 0.1 WETH", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "100", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "100", - "user": "1", - "onBehalfOf": "2" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "WETH", - "amount": "0.1", - "borrowRateMode": "variable", - "user": "2" - }, - "expected": "success" - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/scenarios/rebalance-stable-rate.json b/test-suites/test-amm/helpers/scenarios/rebalance-stable-rate.json deleted file mode 100644 index 1840890af..000000000 --- a/test-suites/test-amm/helpers/scenarios/rebalance-stable-rate.json +++ /dev/null @@ -1,198 +0,0 @@ -{ - "title": "Pool: Rebalance stable rate", - "description": "Test cases for the rebalanceStableBorrowRate() function.", - "stories": [ - { - "description": "User 0 tries to rebalance user 1 who has no borrows in progress (revert expected)", - "actions": [ - { - "name": "rebalanceStableBorrowRate", - "args": { - "reserve": "USDC", - "user": "0", - "target": "1" - }, - "expected": "revert", - "revertMessage": "User does not have any stable rate loan for this reserve" - } - ] - }, - { - "description": "User 0 deposits 1000 USDC, user 1 deposits 7 WETH, borrows 250 USDC at a variable rate, user 0 rebalances user 1 (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "7", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "7", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "USDC", - "amount": "250", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "success" - }, - { - "name": "rebalanceStableBorrowRate", - "args": { - "reserve": "USDC", - "user": "0", - "target": "1" - }, - "expected": "revert", - "revertMessage": "The user borrow is variable and cannot be rebalanced" - } - ] - }, - { - "description": "User 1 borrows another 200 at variable, user 0 tries to rebalance but the conditions are not met (revert expected)", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "USDC", - "amount": "200", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "success" - }, - { - "name": "rebalanceStableBorrowRate", - "args": { - "reserve": "USDC", - "user": "0", - "target": "1" - }, - "expected": "revert", - "revertMessage": "Interest rate rebalance conditions were not met" - } - ] - }, - { - "description": "User 1 borrows another 200 at variable, user 0 tries to rebalance but the conditions are not met (revert expected)", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "USDC", - "amount": "200", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "success" - }, - { - "name": "rebalanceStableBorrowRate", - "args": { - "reserve": "USDC", - "user": "0", - "target": "1" - }, - "expected": "revert", - "revertMessage": "Interest rate rebalance conditions were not met" - } - ] - }, - { - "description": "User 1 borrows another 100 at variable, user 0 tries to rebalance but the conditions are not met (revert expected)", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "USDC", - "amount": "280", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "success" - }, - { - "name": "rebalanceStableBorrowRate", - "args": { - "reserve": "USDC", - "user": "0", - "target": "1" - }, - "expected": "revert", - "revertMessage": "Interest rate rebalance conditions were not met" - } - ] - }, - - { - "description": "User 1 borrows the remaining USDC (usage ratio = 100%) at variable. User 0 rebalances user 1, fails since there are no stable borrows (revert expected)", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "USDC", - "amount": "20", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "success" - }, - { - "name": "rebalanceStableBorrowRate", - "args": { - "reserve": "USDC", - "user": "0", - "target": "1" - }, - "expected": "revert" - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/scenarios/set-use-as-collateral.json b/test-suites/test-amm/helpers/scenarios/set-use-as-collateral.json deleted file mode 100644 index dcf7e78e5..000000000 --- a/test-suites/test-amm/helpers/scenarios/set-use-as-collateral.json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "title": "Pool: Usage as collateral", - "description": "Test cases for the setUserUseReserveAsCollateral() function.", - "stories": [ - { - "description": "User 0 Deposits 1000 DAI, disables DAI as collateral", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "setUseAsCollateral", - "args": { - "reserve": "DAI", - "user": "0", - "useAsCollateral": "false" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 Deposits 2 WETH, disables WETH as collateral, borrows 400 DAI (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "2", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "2", - "user": "1" - }, - "expected": "success" - }, - { - "name": "setUseAsCollateral", - "args": { - "reserve": "WETH", - "user": "1", - "useAsCollateral": "false" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "400", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "revert", - "revertMessage": "The collateral balance is 0" - } - ] - }, - { - "description": "User 1 enables WETH as collateral, borrows 400 DAI", - "actions": [ - { - "name": "setUseAsCollateral", - "args": { - "reserve": "WETH", - "user": "1", - "useAsCollateral": "true" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "400", - "borrowRateMode": "variable", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 disables WETH as collateral (revert expected)", - "actions": [ - { - "name": "setUseAsCollateral", - "args": { - "reserve": "WETH", - "user": "1", - "useAsCollateral": "false" - }, - "expected": "revert", - "revertMessage": "User deposit is already being used as collateral" - } - ] - }, - { - "description": "User 1 Deposits 10 UNILINKWETH, disables WETH as collateral. Should revert as 10 UNILINKWETH are not enough to cover the debt (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "UNILINKWETH", - "amount": "10", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "UNILINKWETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "UNILINKWETH", - "amount": "10", - "user": "1" - }, - "expected": "success" - }, - { - "name": "setUseAsCollateral", - "args": { - "reserve": "WETH", - "user": "1", - "useAsCollateral": "false" - }, - "expected": "revert" - } - ] - }, - { - "description": "User 1 Deposits 640 more UNILINKWETH (enough to cover the DAI debt), disables WETH as collateral", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "UNILINKWETH", - "amount": "640", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "UNILINKWETH", - "amount": "640", - "user": "1" - }, - "expected": "success" - }, - { - "name": "setUseAsCollateral", - "args": { - "reserve": "WETH", - "user": "1", - "useAsCollateral": "false" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 disables UNILINKWETH as collateral (revert expected)", - "actions": [ - { - "name": "setUseAsCollateral", - "args": { - "reserve": "UNILINKWETH", - "user": "1", - "useAsCollateral": "false" - }, - "expected": "revert" - } - ] - }, - { - "description": "User 1 reenables WETH as collateral", - "actions": [ - { - "name": "setUseAsCollateral", - "args": { - "reserve": "WETH", - "user": "1", - "useAsCollateral": "true" - }, - "expected": "success" - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/scenarios/swap-rate-mode.json b/test-suites/test-amm/helpers/scenarios/swap-rate-mode.json deleted file mode 100644 index 90575770f..000000000 --- a/test-suites/test-amm/helpers/scenarios/swap-rate-mode.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "title": "Pool: Swap rate mode", - "description": "Test cases for the swapBorrowRateMode() function.", - "stories": [ - { - "description": "User 0 tries to swap rate mode without any variable rate loan in progress (revert expected)", - "actions": [ - { - "name": "swapBorrowRateMode", - "args": { - "reserve": "DAI", - "user": "1", - "borrowRateMode": "variable" - }, - "expected": "revert", - "revertMessage": "User does not have a variable rate loan in progress on this reserve" - } - ] - }, - { - "description": "User 0 tries to swap rate mode without any stable rate loan in progress (revert expected)", - "actions": [ - { - "name": "swapBorrowRateMode", - "args": { - "reserve": "DAI", - "user": "1", - "borrowRateMode": "stable" - }, - "expected": "revert", - "revertMessage": "User does not have a stable rate loan in progress on this reserve" - } - ] - }, - { - "description": "User 0 deposits 1000 DAI, user 1 deposits 2 WETH as collateral, borrows 100 DAI at variable rate and swaps to stable after one year, fails because stable borrowing is disabled (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "2", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "2", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "variable", - "user": "1", - "timeTravel": "365" - }, - "expected": "success" - }, - { - "name": "swapBorrowRateMode", - "args": { - "reserve": "DAI", - "user": "1", - "borrowRateMode": "variable" - }, - "expected": "revert" - } - ] - }, - { - "description": "User 1 borrows another 100 DAI at stable (revert expected), and swaps back to variable after one year (revert expected), repays the loan", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "stable", - "user": "1", - "timeTravel": "365" - }, - "expected": "revert" - }, - { - "name": "swapBorrowRateMode", - "args": { - "reserve": "DAI", - "user": "1", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "mint", - "description": "Mint 50 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "50", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - } - ] - }, - { - "description": "User 1 borrows another 100 DAI at variable, and tries to swap to stable after one year (revert expected), repays the loan", - "actions": [ - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "borrowRateMode": "variable", - "user": "1", - "timeTravel": "365" - }, - "expected": "success" - }, - { - "name": "swapBorrowRateMode", - "args": { - "reserve": "DAI", - "user": "1", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "mint", - "description": "Mint 50 DAI to cover the interest", - "args": { - "reserve": "DAI", - "amount": "50", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "repay", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "1", - "onBehalfOf": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/scenarios/withdraw-negatives.json b/test-suites/test-amm/helpers/scenarios/withdraw-negatives.json deleted file mode 100644 index 80c914918..000000000 --- a/test-suites/test-amm/helpers/scenarios/withdraw-negatives.json +++ /dev/null @@ -1,164 +0,0 @@ -{ - "title": "Pool: Redeem negative test cases", - "description": "Redeem function.", - "stories": [ - { - "description": "Users 0 Deposits 1000 DAI and tries to redeem 0 DAI (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "0", - "user": "0" - }, - "expected": "revert", - "revertMessage": "Amount to redeem needs to be > 0" - } - ] - }, - { - "description": "Users 0 tries to redeem 1100 DAI from the 1000 DAI deposited (revert expected)", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "1100", - "user": "0" - }, - "expected": "revert", - "revertMessage": "User cannot redeem more than the available balance" - } - ] - }, - { - "description": "Users 1 deposits 1 WETH, borrows 100 DAI stable (revert expected), redeems the 1 WETH deposited", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "user": "1", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "-1", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "Users 1 deposits 1 WETH, borrows 100 DAI at variable rate, tries to redeem the 1 WETH deposited (revert expected)", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "user": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - }, - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "-1", - "user": "1" - }, - "expected": "revert", - "revertMessage": "Transfer cannot be allowed." - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/scenarios/withdraw.json b/test-suites/test-amm/helpers/scenarios/withdraw.json deleted file mode 100644 index 11a0ad678..000000000 --- a/test-suites/test-amm/helpers/scenarios/withdraw.json +++ /dev/null @@ -1,434 +0,0 @@ -{ - "title": "Pool: withdraw", - "description": "withdraw function.", - "stories": [ - { - "description": "User 0 Deposits 1000 DAI in an empty reserve", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws half of the deposited DAI", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "500", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws remaining half of the deposited DAI", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 Deposits 1000 USDC in an empty reserve", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws half of the deposited USDC", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "USDC", - "amount": "500", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws remaining half of the deposited USDC", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "USDC", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 Deposits 1 WETH in an empty reserve", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws half of the deposited WETH", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "0.5", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "User 0 withdraws remaining half of the deposited WETH", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "-1", - "user": "0" - }, - "expected": "success" - } - ] - }, - { - "description": "Users 0 and 1 Deposit 1000 DAI, both withdraw", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "DAI", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "0" - }, - "expected": "success" - }, - { - "name": "withdraw", - "args": { - "reserve": "DAI", - "amount": "-1", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "Users 0 deposits 1000 DAI, user 1 Deposit 1000 USDC and 1 WETH, borrows 100 DAI at stable rate (revert expected). User 1 tries to withdraw all the USDC", - "actions": [ - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "user": "1", - "borrowRateMode": "stable" - }, - "expected": "revert" - }, - { - "name": "withdraw", - "args": { - "reserve": "USDC", - "amount": "-1", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "Users 0 deposits 1000 DAI, user 1 Deposit 1000 USDC and 1 WETH, borrows 100 DAI at variable rate. User 1 tries to withdraw all the USDC", - "actions": [ - { - "name": "mint", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "DAI", - "amount": "1000", - "user": "0" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "USDC", - "amount": "10000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "USDC", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "USDC", - "amount": "1000", - "user": "1" - }, - "expected": "success" - }, - { - "name": "mint", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "approve", - "args": { - "reserve": "WETH", - "user": "1" - }, - "expected": "success" - }, - { - "name": "deposit", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "1" - }, - "expected": "success" - }, - { - "name": "borrow", - "args": { - "reserve": "DAI", - "amount": "100", - "user": "1", - "borrowRateMode": "variable" - }, - "expected": "success" - }, - { - "name": "withdraw", - "args": { - "reserve": "USDC", - "amount": "-1", - "user": "1" - }, - "expected": "success" - } - ] - }, - { - "description": "Users 1 tries to withdraw 0.05 WETH, which does not bring the HF below 1", - "actions": [ - { - "name": "withdraw", - "args": { - "reserve": "WETH", - "amount": "0.05", - "user": "1" - }, - "expected": "success" - } - ] - } - ] -} diff --git a/test-suites/test-amm/helpers/utils/calculations.ts b/test-suites/test-amm/helpers/utils/calculations.ts deleted file mode 100644 index 23b6803b1..000000000 --- a/test-suites/test-amm/helpers/utils/calculations.ts +++ /dev/null @@ -1,1443 +0,0 @@ -import BigNumber from 'bignumber.js'; -import { ONE_YEAR, RAY, MAX_UINT_AMOUNT, PERCENTAGE_FACTOR } from '../../../../helpers/constants'; -import { - IReserveParams, - iLpPoolAssets, - RateMode, - tEthereumAddress, -} from '../../../../helpers/types'; -import './math'; -import { ReserveData, UserReserveData } from './interfaces'; - -export const strToBN = (amount: string): BigNumber => new BigNumber(amount); - -interface Configuration { - reservesParams: iLpPoolAssets; -} - -export const configuration: Configuration = {}; - -export const calcExpectedUserDataAfterDeposit = ( - amountDeposited: string, - reserveDataBeforeAction: ReserveData, - reserveDataAfterAction: ReserveData, - userDataBeforeAction: UserReserveData, - txTimestamp: BigNumber, - currentTimestamp: BigNumber, - txCost: BigNumber -): UserReserveData => { - const expectedUserData = {}; - - expectedUserData.currentStableDebt = calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - txTimestamp - ); - - expectedUserData.currentVariableDebt = calcExpectedVariableDebtTokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - expectedUserData.principalStableDebt = userDataBeforeAction.principalStableDebt; - expectedUserData.scaledVariableDebt = userDataBeforeAction.scaledVariableDebt; - expectedUserData.variableBorrowIndex = userDataBeforeAction.variableBorrowIndex; - expectedUserData.stableBorrowRate = userDataBeforeAction.stableBorrowRate; - expectedUserData.stableRateLastUpdated = userDataBeforeAction.stableRateLastUpdated; - - expectedUserData.liquidityRate = reserveDataAfterAction.liquidityRate; - - expectedUserData.scaledATokenBalance = calcExpectedScaledATokenBalance( - userDataBeforeAction, - reserveDataAfterAction.liquidityIndex, - new BigNumber(amountDeposited), - new BigNumber(0) - ); - expectedUserData.currentATokenBalance = calcExpectedATokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ).plus(amountDeposited); - - if (userDataBeforeAction.currentATokenBalance.eq(0)) { - expectedUserData.usageAsCollateralEnabled = true; - } else { - expectedUserData.usageAsCollateralEnabled = userDataBeforeAction.usageAsCollateralEnabled; - } - - expectedUserData.variableBorrowIndex = userDataBeforeAction.variableBorrowIndex; - expectedUserData.walletBalance = userDataBeforeAction.walletBalance.minus(amountDeposited); - - expectedUserData.currentStableDebt = expectedUserData.principalStableDebt = - calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - txTimestamp - ); - - expectedUserData.currentVariableDebt = expectedUserData.principalStableDebt = - calcExpectedVariableDebtTokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - return expectedUserData; -}; - -export const calcExpectedUserDataAfterWithdraw = ( - amountWithdrawn: string, - reserveDataBeforeAction: ReserveData, - reserveDataAfterAction: ReserveData, - userDataBeforeAction: UserReserveData, - txTimestamp: BigNumber, - currentTimestamp: BigNumber, - txCost: BigNumber -): UserReserveData => { - const expectedUserData = {}; - - const aTokenBalance = calcExpectedATokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - if (amountWithdrawn == MAX_UINT_AMOUNT) { - amountWithdrawn = aTokenBalance.toFixed(0); - } - - expectedUserData.scaledATokenBalance = calcExpectedScaledATokenBalance( - userDataBeforeAction, - reserveDataAfterAction.liquidityIndex, - new BigNumber(0), - new BigNumber(amountWithdrawn) - ); - - expectedUserData.currentATokenBalance = aTokenBalance.minus(amountWithdrawn); - - expectedUserData.principalStableDebt = userDataBeforeAction.principalStableDebt; - expectedUserData.scaledVariableDebt = userDataBeforeAction.scaledVariableDebt; - - expectedUserData.currentStableDebt = calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - txTimestamp - ); - - expectedUserData.currentVariableDebt = calcExpectedVariableDebtTokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - expectedUserData.variableBorrowIndex = userDataBeforeAction.variableBorrowIndex; - expectedUserData.stableBorrowRate = userDataBeforeAction.stableBorrowRate; - expectedUserData.stableRateLastUpdated = userDataBeforeAction.stableRateLastUpdated; - - expectedUserData.liquidityRate = reserveDataAfterAction.liquidityRate; - - if (userDataBeforeAction.currentATokenBalance.eq(0)) { - expectedUserData.usageAsCollateralEnabled = true; - } else { - //if the user is withdrawing everything, usageAsCollateralEnabled must be false - if (expectedUserData.currentATokenBalance.eq(0)) { - expectedUserData.usageAsCollateralEnabled = false; - } else { - expectedUserData.usageAsCollateralEnabled = userDataBeforeAction.usageAsCollateralEnabled; - } - } - - expectedUserData.walletBalance = userDataBeforeAction.walletBalance.plus(amountWithdrawn); - - return expectedUserData; -}; - -export const calcExpectedReserveDataAfterDeposit = ( - amountDeposited: string, - reserveDataBeforeAction: ReserveData, - txTimestamp: BigNumber -): ReserveData => { - const expectedReserveData: ReserveData = {}; - - expectedReserveData.address = reserveDataBeforeAction.address; - - expectedReserveData.totalLiquidity = new BigNumber(reserveDataBeforeAction.totalLiquidity).plus( - amountDeposited - ); - expectedReserveData.availableLiquidity = new BigNumber( - reserveDataBeforeAction.availableLiquidity - ).plus(amountDeposited); - - expectedReserveData.averageStableBorrowRate = reserveDataBeforeAction.averageStableBorrowRate; - expectedReserveData.liquidityIndex = calcExpectedLiquidityIndex( - reserveDataBeforeAction, - txTimestamp - ); - expectedReserveData.variableBorrowIndex = calcExpectedVariableBorrowIndex( - reserveDataBeforeAction, - txTimestamp - ); - - expectedReserveData.totalStableDebt = calcExpectedTotalStableDebt( - reserveDataBeforeAction.principalStableDebt, - reserveDataBeforeAction.averageStableBorrowRate, - reserveDataBeforeAction.totalStableDebtLastUpdated, - txTimestamp - ); - expectedReserveData.totalVariableDebt = calcExpectedTotalVariableDebt( - reserveDataBeforeAction, - expectedReserveData.variableBorrowIndex - ); - - expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt; - expectedReserveData.principalStableDebt = reserveDataBeforeAction.principalStableDebt; - - expectedReserveData.utilizationRate = calcExpectedUtilizationRate( - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.totalLiquidity - ); - const rates = calcExpectedInterestRates( - reserveDataBeforeAction.symbol, - reserveDataBeforeAction.marketStableRate, - expectedReserveData.utilizationRate, - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.averageStableBorrowRate - ); - expectedReserveData.liquidityRate = rates[0]; - expectedReserveData.stableBorrowRate = rates[1]; - expectedReserveData.variableBorrowRate = rates[2]; - - return expectedReserveData; -}; - -export const calcExpectedReserveDataAfterWithdraw = ( - amountWithdrawn: string, - reserveDataBeforeAction: ReserveData, - userDataBeforeAction: UserReserveData, - txTimestamp: BigNumber -): ReserveData => { - const expectedReserveData: ReserveData = {}; - - expectedReserveData.address = reserveDataBeforeAction.address; - - if (amountWithdrawn == MAX_UINT_AMOUNT) { - amountWithdrawn = calcExpectedATokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ).toFixed(); - } - - expectedReserveData.availableLiquidity = new BigNumber( - reserveDataBeforeAction.availableLiquidity - ).minus(amountWithdrawn); - - expectedReserveData.principalStableDebt = reserveDataBeforeAction.principalStableDebt; - expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt; - - expectedReserveData.liquidityIndex = calcExpectedLiquidityIndex( - reserveDataBeforeAction, - txTimestamp - ); - expectedReserveData.variableBorrowIndex = calcExpectedVariableBorrowIndex( - reserveDataBeforeAction, - txTimestamp - ); - - expectedReserveData.totalStableDebt = calcExpectedTotalStableDebt( - reserveDataBeforeAction.principalStableDebt, - reserveDataBeforeAction.averageStableBorrowRate, - reserveDataBeforeAction.totalStableDebtLastUpdated, - txTimestamp - ); - expectedReserveData.totalVariableDebt = expectedReserveData.scaledVariableDebt.rayMul( - expectedReserveData.variableBorrowIndex - ); - - expectedReserveData.averageStableBorrowRate = reserveDataBeforeAction.averageStableBorrowRate; - - expectedReserveData.totalLiquidity = new BigNumber(reserveDataBeforeAction.availableLiquidity) - .minus(amountWithdrawn) - .plus(expectedReserveData.totalVariableDebt) - .plus(expectedReserveData.totalStableDebt); - - expectedReserveData.utilizationRate = calcExpectedUtilizationRate( - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.totalLiquidity - ); - const rates = calcExpectedInterestRates( - reserveDataBeforeAction.symbol, - reserveDataBeforeAction.marketStableRate, - expectedReserveData.utilizationRate, - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.averageStableBorrowRate - ); - expectedReserveData.liquidityRate = rates[0]; - expectedReserveData.stableBorrowRate = rates[1]; - expectedReserveData.variableBorrowRate = rates[2]; - - return expectedReserveData; -}; - -export const calcExpectedReserveDataAfterBorrow = ( - amountBorrowed: string, - borrowRateMode: string, - reserveDataBeforeAction: ReserveData, - userDataBeforeAction: UserReserveData, - txTimestamp: BigNumber, - currentTimestamp: BigNumber -): ReserveData => { - const expectedReserveData = {}; - - expectedReserveData.address = reserveDataBeforeAction.address; - - const amountBorrowedBN = new BigNumber(amountBorrowed); - - expectedReserveData.liquidityIndex = calcExpectedLiquidityIndex( - reserveDataBeforeAction, - txTimestamp - ); - - expectedReserveData.variableBorrowIndex = calcExpectedVariableBorrowIndex( - reserveDataBeforeAction, - txTimestamp - ); - - expectedReserveData.availableLiquidity = - reserveDataBeforeAction.availableLiquidity.minus(amountBorrowedBN); - - expectedReserveData.lastUpdateTimestamp = txTimestamp; - - if (borrowRateMode == RateMode.Stable) { - expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt; - - const expectedVariableDebtAfterTx = expectedReserveData.scaledVariableDebt.rayMul( - expectedReserveData.variableBorrowIndex - ); - - const expectedStableDebtUntilTx = calcExpectedTotalStableDebt( - reserveDataBeforeAction.principalStableDebt, - reserveDataBeforeAction.averageStableBorrowRate, - reserveDataBeforeAction.totalStableDebtLastUpdated, - txTimestamp - ); - - expectedReserveData.principalStableDebt = expectedStableDebtUntilTx.plus(amountBorrowedBN); - - expectedReserveData.averageStableBorrowRate = calcExpectedAverageStableBorrowRate( - reserveDataBeforeAction.averageStableBorrowRate, - expectedStableDebtUntilTx, - amountBorrowedBN, - reserveDataBeforeAction.stableBorrowRate - ); - - const totalLiquidityAfterTx = expectedReserveData.availableLiquidity - .plus(expectedReserveData.principalStableDebt) - .plus(expectedVariableDebtAfterTx); - - const utilizationRateAfterTx = calcExpectedUtilizationRate( - expectedReserveData.principalStableDebt, //the expected principal debt is the total debt immediately after the tx - expectedVariableDebtAfterTx, - totalLiquidityAfterTx - ); - - const ratesAfterTx = calcExpectedInterestRates( - reserveDataBeforeAction.symbol, - reserveDataBeforeAction.marketStableRate, - utilizationRateAfterTx, - expectedReserveData.principalStableDebt, - expectedVariableDebtAfterTx, - expectedReserveData.averageStableBorrowRate - ); - - expectedReserveData.liquidityRate = ratesAfterTx[0]; - - expectedReserveData.stableBorrowRate = ratesAfterTx[1]; - - expectedReserveData.variableBorrowRate = ratesAfterTx[2]; - - expectedReserveData.totalStableDebt = calcExpectedTotalStableDebt( - expectedReserveData.principalStableDebt, - expectedReserveData.averageStableBorrowRate, - txTimestamp, - currentTimestamp - ); - - expectedReserveData.totalVariableDebt = reserveDataBeforeAction.scaledVariableDebt.rayMul( - calcExpectedReserveNormalizedDebt( - expectedReserveData.variableBorrowRate, - expectedReserveData.variableBorrowIndex, - txTimestamp, - currentTimestamp - ) - ); - - expectedReserveData.totalLiquidity = expectedReserveData.availableLiquidity - .plus(expectedReserveData.totalVariableDebt) - .plus(expectedReserveData.totalStableDebt); - - expectedReserveData.utilizationRate = calcExpectedUtilizationRate( - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.totalLiquidity - ); - } else { - expectedReserveData.principalStableDebt = reserveDataBeforeAction.principalStableDebt; - - const totalStableDebtAfterTx = calcExpectedStableDebtTokenBalance( - reserveDataBeforeAction.principalStableDebt, - reserveDataBeforeAction.averageStableBorrowRate, - reserveDataBeforeAction.totalStableDebtLastUpdated, - txTimestamp - ); - - expectedReserveData.totalStableDebt = calcExpectedTotalStableDebt( - reserveDataBeforeAction.principalStableDebt, - reserveDataBeforeAction.averageStableBorrowRate, - reserveDataBeforeAction.totalStableDebtLastUpdated, - currentTimestamp - ); - - expectedReserveData.averageStableBorrowRate = reserveDataBeforeAction.averageStableBorrowRate; - - expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt.plus( - amountBorrowedBN.rayDiv(expectedReserveData.variableBorrowIndex) - ); - - const totalVariableDebtAfterTx = expectedReserveData.scaledVariableDebt.rayMul( - expectedReserveData.variableBorrowIndex - ); - - const utilizationRateAfterTx = calcExpectedUtilizationRate( - totalStableDebtAfterTx, - totalVariableDebtAfterTx, - expectedReserveData.availableLiquidity - .plus(totalStableDebtAfterTx) - .plus(totalVariableDebtAfterTx) - ); - - const rates = calcExpectedInterestRates( - reserveDataBeforeAction.symbol, - reserveDataBeforeAction.marketStableRate, - utilizationRateAfterTx, - totalStableDebtAfterTx, - totalVariableDebtAfterTx, - expectedReserveData.averageStableBorrowRate - ); - - expectedReserveData.liquidityRate = rates[0]; - - expectedReserveData.stableBorrowRate = rates[1]; - - expectedReserveData.variableBorrowRate = rates[2]; - - expectedReserveData.totalVariableDebt = expectedReserveData.scaledVariableDebt.rayMul( - calcExpectedReserveNormalizedDebt( - expectedReserveData.variableBorrowRate, - expectedReserveData.variableBorrowIndex, - txTimestamp, - currentTimestamp - ) - ); - - expectedReserveData.totalLiquidity = expectedReserveData.availableLiquidity - .plus(expectedReserveData.totalStableDebt) - .plus(expectedReserveData.totalVariableDebt); - - expectedReserveData.utilizationRate = calcExpectedUtilizationRate( - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.totalLiquidity - ); - } - - return expectedReserveData; -}; - -export const calcExpectedReserveDataAfterRepay = ( - amountRepaid: string, - borrowRateMode: RateMode, - reserveDataBeforeAction: ReserveData, - userDataBeforeAction: UserReserveData, - txTimestamp: BigNumber, - currentTimestamp: BigNumber -): ReserveData => { - const expectedReserveData: ReserveData = {}; - - expectedReserveData.address = reserveDataBeforeAction.address; - - let amountRepaidBN = new BigNumber(amountRepaid); - - const userStableDebt = calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - txTimestamp - ); - - const userVariableDebt = calcExpectedVariableDebtTokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - //if amount repaid == MAX_UINT_AMOUNT, user is repaying everything - if (amountRepaidBN.abs().eq(MAX_UINT_AMOUNT)) { - if (borrowRateMode == RateMode.Stable) { - amountRepaidBN = userStableDebt; - } else { - amountRepaidBN = userVariableDebt; - } - } - - expectedReserveData.liquidityIndex = calcExpectedLiquidityIndex( - reserveDataBeforeAction, - txTimestamp - ); - expectedReserveData.variableBorrowIndex = calcExpectedVariableBorrowIndex( - reserveDataBeforeAction, - txTimestamp - ); - - if (borrowRateMode == RateMode.Stable) { - const expectedDebt = calcExpectedTotalStableDebt( - reserveDataBeforeAction.principalStableDebt, - reserveDataBeforeAction.averageStableBorrowRate, - reserveDataBeforeAction.totalStableDebtLastUpdated, - txTimestamp - ); - - expectedReserveData.principalStableDebt = expectedReserveData.totalStableDebt = - expectedDebt.minus(amountRepaidBN); - - //due to accumulation errors, the total stable debt might be smaller than the last user debt. - //in this case we simply set the total supply and avg stable rate to 0. - if (expectedReserveData.totalStableDebt.lt(0)) { - expectedReserveData.principalStableDebt = - expectedReserveData.totalStableDebt = - expectedReserveData.averageStableBorrowRate = - new BigNumber(0); - } else { - expectedReserveData.averageStableBorrowRate = calcExpectedAverageStableBorrowRate( - reserveDataBeforeAction.averageStableBorrowRate, - expectedDebt, - amountRepaidBN.negated(), - userDataBeforeAction.stableBorrowRate - ); - - //also due to accumulation errors, the final avg stable rate when the last user repays might be negative. - //if that is the case, it means a small leftover of total stable debt is left, which can be erased. - - if (expectedReserveData.averageStableBorrowRate.lt(0)) { - expectedReserveData.principalStableDebt = - expectedReserveData.totalStableDebt = - expectedReserveData.averageStableBorrowRate = - new BigNumber(0); - } - } - - expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt; - - expectedReserveData.totalVariableDebt = expectedReserveData.scaledVariableDebt.rayMul( - expectedReserveData.variableBorrowIndex - ); - } else { - expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt.minus( - amountRepaidBN.rayDiv(expectedReserveData.variableBorrowIndex) - ); - - expectedReserveData.totalVariableDebt = expectedReserveData.scaledVariableDebt.rayMul( - expectedReserveData.variableBorrowIndex - ); - - expectedReserveData.principalStableDebt = reserveDataBeforeAction.principalStableDebt; - expectedReserveData.totalStableDebt = reserveDataBeforeAction.totalStableDebt; - - expectedReserveData.averageStableBorrowRate = reserveDataBeforeAction.averageStableBorrowRate; - } - - expectedReserveData.availableLiquidity = - reserveDataBeforeAction.availableLiquidity.plus(amountRepaidBN); - - expectedReserveData.totalLiquidity = expectedReserveData.availableLiquidity - .plus(expectedReserveData.totalStableDebt) - .plus(expectedReserveData.totalVariableDebt); - - expectedReserveData.utilizationRate = calcExpectedUtilizationRate( - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.totalLiquidity - ); - - const rates = calcExpectedInterestRates( - reserveDataBeforeAction.symbol, - reserveDataBeforeAction.marketStableRate, - expectedReserveData.utilizationRate, - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.averageStableBorrowRate - ); - expectedReserveData.liquidityRate = rates[0]; - - expectedReserveData.stableBorrowRate = rates[1]; - - expectedReserveData.variableBorrowRate = rates[2]; - - expectedReserveData.lastUpdateTimestamp = txTimestamp; - - return expectedReserveData; -}; - -export const calcExpectedUserDataAfterBorrow = ( - amountBorrowed: string, - interestRateMode: string, - reserveDataBeforeAction: ReserveData, - expectedDataAfterAction: ReserveData, - userDataBeforeAction: UserReserveData, - txTimestamp: BigNumber, - currentTimestamp: BigNumber -): UserReserveData => { - const expectedUserData = {}; - - const amountBorrowedBN = new BigNumber(amountBorrowed); - - if (interestRateMode == RateMode.Stable) { - const stableDebtUntilTx = calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - txTimestamp - ); - - expectedUserData.principalStableDebt = stableDebtUntilTx.plus(amountBorrowed); - expectedUserData.stableRateLastUpdated = txTimestamp; - - expectedUserData.stableBorrowRate = calcExpectedUserStableRate( - stableDebtUntilTx, - userDataBeforeAction.stableBorrowRate, - amountBorrowedBN, - reserveDataBeforeAction.stableBorrowRate - ); - - expectedUserData.currentStableDebt = calcExpectedStableDebtTokenBalance( - expectedUserData.principalStableDebt, - expectedUserData.stableBorrowRate, - txTimestamp, - currentTimestamp - ); - - expectedUserData.scaledVariableDebt = userDataBeforeAction.scaledVariableDebt; - } else { - expectedUserData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt.plus( - amountBorrowedBN.rayDiv(expectedDataAfterAction.variableBorrowIndex) - ); - - expectedUserData.principalStableDebt = userDataBeforeAction.principalStableDebt; - - expectedUserData.stableBorrowRate = userDataBeforeAction.stableBorrowRate; - - expectedUserData.stableRateLastUpdated = userDataBeforeAction.stableRateLastUpdated; - - expectedUserData.currentStableDebt = calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - currentTimestamp - ); - } - - expectedUserData.currentVariableDebt = calcExpectedVariableDebtTokenBalance( - expectedDataAfterAction, - expectedUserData, - currentTimestamp - ); - - expectedUserData.liquidityRate = expectedDataAfterAction.liquidityRate; - - expectedUserData.usageAsCollateralEnabled = userDataBeforeAction.usageAsCollateralEnabled; - - expectedUserData.currentATokenBalance = calcExpectedATokenBalance( - expectedDataAfterAction, - userDataBeforeAction, - currentTimestamp - ); - - expectedUserData.scaledATokenBalance = userDataBeforeAction.scaledATokenBalance; - - expectedUserData.walletBalance = userDataBeforeAction.walletBalance.plus(amountBorrowed); - - return expectedUserData; -}; - -export const calcExpectedUserDataAfterRepay = ( - totalRepaid: string, - rateMode: RateMode, - reserveDataBeforeAction: ReserveData, - expectedDataAfterAction: ReserveData, - userDataBeforeAction: UserReserveData, - user: string, - onBehalfOf: string, - txTimestamp: BigNumber, - currentTimestamp: BigNumber -): UserReserveData => { - const expectedUserData = {}; - - const variableDebt = calcExpectedVariableDebtTokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - currentTimestamp - ); - - const stableDebt = calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - currentTimestamp - ); - - let totalRepaidBN = new BigNumber(totalRepaid); - if (totalRepaidBN.abs().eq(MAX_UINT_AMOUNT)) { - totalRepaidBN = rateMode == RateMode.Stable ? stableDebt : variableDebt; - } - - if (rateMode == RateMode.Stable) { - expectedUserData.scaledVariableDebt = userDataBeforeAction.scaledVariableDebt; - expectedUserData.currentVariableDebt = variableDebt; - - expectedUserData.principalStableDebt = expectedUserData.currentStableDebt = - stableDebt.minus(totalRepaidBN); - - if (expectedUserData.currentStableDebt.eq('0')) { - //user repaid everything - expectedUserData.stableBorrowRate = expectedUserData.stableRateLastUpdated = new BigNumber( - '0' - ); - } else { - expectedUserData.stableBorrowRate = userDataBeforeAction.stableBorrowRate; - expectedUserData.stableRateLastUpdated = txTimestamp; - } - } else { - expectedUserData.currentStableDebt = userDataBeforeAction.principalStableDebt; - expectedUserData.principalStableDebt = stableDebt; - expectedUserData.stableBorrowRate = userDataBeforeAction.stableBorrowRate; - expectedUserData.stableRateLastUpdated = userDataBeforeAction.stableRateLastUpdated; - - expectedUserData.scaledVariableDebt = userDataBeforeAction.scaledVariableDebt.minus( - totalRepaidBN.rayDiv(expectedDataAfterAction.variableBorrowIndex) - ); - expectedUserData.currentVariableDebt = expectedUserData.scaledVariableDebt.rayMul( - expectedDataAfterAction.variableBorrowIndex - ); - } - - expectedUserData.liquidityRate = expectedDataAfterAction.liquidityRate; - - expectedUserData.usageAsCollateralEnabled = userDataBeforeAction.usageAsCollateralEnabled; - - expectedUserData.currentATokenBalance = calcExpectedATokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - expectedUserData.scaledATokenBalance = userDataBeforeAction.scaledATokenBalance; - - if (user === onBehalfOf) { - expectedUserData.walletBalance = userDataBeforeAction.walletBalance.minus(totalRepaidBN); - } else { - //wallet balance didn't change - expectedUserData.walletBalance = userDataBeforeAction.walletBalance; - } - - return expectedUserData; -}; - -export const calcExpectedUserDataAfterSetUseAsCollateral = ( - useAsCollateral: boolean, - reserveDataBeforeAction: ReserveData, - userDataBeforeAction: UserReserveData, - txCost: BigNumber -): UserReserveData => { - const expectedUserData = { ...userDataBeforeAction }; - - expectedUserData.usageAsCollateralEnabled = useAsCollateral; - - return expectedUserData; -}; - -export const calcExpectedReserveDataAfterSwapRateMode = ( - reserveDataBeforeAction: ReserveData, - userDataBeforeAction: UserReserveData, - rateMode: string, - txTimestamp: BigNumber -): ReserveData => { - const expectedReserveData: ReserveData = {}; - - expectedReserveData.address = reserveDataBeforeAction.address; - - const variableDebt = calcExpectedVariableDebtTokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - const stableDebt = calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - txTimestamp - ); - - expectedReserveData.liquidityIndex = calcExpectedLiquidityIndex( - reserveDataBeforeAction, - txTimestamp - ); - - expectedReserveData.variableBorrowIndex = calcExpectedVariableBorrowIndex( - reserveDataBeforeAction, - txTimestamp - ); - - expectedReserveData.availableLiquidity = reserveDataBeforeAction.availableLiquidity; - - const totalStableDebtUntilTx = calcExpectedTotalStableDebt( - reserveDataBeforeAction.principalStableDebt, - reserveDataBeforeAction.averageStableBorrowRate, - reserveDataBeforeAction.totalStableDebtLastUpdated, - txTimestamp - ); - - if (rateMode === RateMode.Stable) { - //swap user stable debt to variable - expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt.plus( - stableDebt.rayDiv(expectedReserveData.variableBorrowIndex) - ); - - expectedReserveData.totalVariableDebt = expectedReserveData.scaledVariableDebt.rayMul( - expectedReserveData.variableBorrowIndex - ); - - expectedReserveData.principalStableDebt = expectedReserveData.totalStableDebt = - totalStableDebtUntilTx.minus(stableDebt); - - expectedReserveData.averageStableBorrowRate = calcExpectedAverageStableBorrowRate( - reserveDataBeforeAction.averageStableBorrowRate, - expectedReserveData.principalStableDebt.plus(stableDebt), - stableDebt.negated(), - userDataBeforeAction.stableBorrowRate - ); - } else { - //swap variable to stable - - expectedReserveData.principalStableDebt = expectedReserveData.totalStableDebt = - totalStableDebtUntilTx.plus(variableDebt); - - expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt.minus( - variableDebt.rayDiv(expectedReserveData.variableBorrowIndex) - ); - - expectedReserveData.totalVariableDebt = expectedReserveData.scaledVariableDebt.rayMul( - expectedReserveData.variableBorrowIndex - ); - - expectedReserveData.averageStableBorrowRate = calcExpectedAverageStableBorrowRate( - reserveDataBeforeAction.averageStableBorrowRate, - reserveDataBeforeAction.totalStableDebt, - variableDebt, - reserveDataBeforeAction.stableBorrowRate - ); - } - - expectedReserveData.totalLiquidity = reserveDataBeforeAction.availableLiquidity - .plus(expectedReserveData.totalStableDebt) - .plus(expectedReserveData.totalVariableDebt); - - expectedReserveData.utilizationRate = calcExpectedUtilizationRate( - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.totalLiquidity - ); - - const rates = calcExpectedInterestRates( - reserveDataBeforeAction.symbol, - reserveDataBeforeAction.marketStableRate, - expectedReserveData.utilizationRate, - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.averageStableBorrowRate - ); - expectedReserveData.liquidityRate = rates[0]; - - expectedReserveData.stableBorrowRate = rates[1]; - - expectedReserveData.variableBorrowRate = rates[2]; - - return expectedReserveData; -}; - -export const calcExpectedUserDataAfterSwapRateMode = ( - reserveDataBeforeAction: ReserveData, - expectedDataAfterAction: ReserveData, - userDataBeforeAction: UserReserveData, - rateMode: string, - txCost: BigNumber, - txTimestamp: BigNumber -): UserReserveData => { - const expectedUserData = { ...userDataBeforeAction }; - - const stableDebtBalance = calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - txTimestamp - ); - - const variableDebtBalance = calcExpectedVariableDebtTokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - expectedUserData.currentATokenBalance = calcExpectedATokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - if (rateMode === RateMode.Stable) { - // swap to variable - expectedUserData.currentStableDebt = expectedUserData.principalStableDebt = new BigNumber(0); - - expectedUserData.stableBorrowRate = new BigNumber(0); - - expectedUserData.scaledVariableDebt = userDataBeforeAction.scaledVariableDebt.plus( - stableDebtBalance.rayDiv(expectedDataAfterAction.variableBorrowIndex) - ); - expectedUserData.currentVariableDebt = expectedUserData.scaledVariableDebt.rayMul( - expectedDataAfterAction.variableBorrowIndex - ); - - expectedUserData.stableRateLastUpdated = new BigNumber(0); - } else { - expectedUserData.principalStableDebt = expectedUserData.currentStableDebt = - userDataBeforeAction.currentStableDebt.plus(variableDebtBalance); - - //weighted average of the previous and the current - expectedUserData.stableBorrowRate = calcExpectedUserStableRate( - stableDebtBalance, - userDataBeforeAction.stableBorrowRate, - variableDebtBalance, - reserveDataBeforeAction.stableBorrowRate - ); - - expectedUserData.stableRateLastUpdated = txTimestamp; - - expectedUserData.currentVariableDebt = expectedUserData.scaledVariableDebt = new BigNumber(0); - } - - expectedUserData.liquidityRate = expectedDataAfterAction.liquidityRate; - - return expectedUserData; -}; - -export const calcExpectedReserveDataAfterStableRateRebalance = ( - reserveDataBeforeAction: ReserveData, - userDataBeforeAction: UserReserveData, - txTimestamp: BigNumber -): ReserveData => { - const expectedReserveData: ReserveData = {}; - - expectedReserveData.address = reserveDataBeforeAction.address; - - const userStableDebt = calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - txTimestamp - ); - - expectedReserveData.liquidityIndex = calcExpectedLiquidityIndex( - reserveDataBeforeAction, - txTimestamp - ); - - expectedReserveData.variableBorrowIndex = calcExpectedVariableBorrowIndex( - reserveDataBeforeAction, - txTimestamp - ); - - expectedReserveData.scaledVariableDebt = reserveDataBeforeAction.scaledVariableDebt; - expectedReserveData.totalVariableDebt = expectedReserveData.scaledVariableDebt.rayMul( - expectedReserveData.variableBorrowIndex - ); - - expectedReserveData.principalStableDebt = expectedReserveData.totalStableDebt = - calcExpectedTotalStableDebt( - reserveDataBeforeAction.principalStableDebt, - reserveDataBeforeAction.averageStableBorrowRate, - reserveDataBeforeAction.totalStableDebtLastUpdated, - txTimestamp - ); - - expectedReserveData.availableLiquidity = reserveDataBeforeAction.availableLiquidity; - - expectedReserveData.totalLiquidity = expectedReserveData.availableLiquidity - .plus(expectedReserveData.totalStableDebt) - .plus(expectedReserveData.totalVariableDebt); - - //removing the stable liquidity at the old rate - - const avgRateBefore = calcExpectedAverageStableBorrowRateRebalance( - reserveDataBeforeAction.averageStableBorrowRate, - expectedReserveData.totalStableDebt, - userStableDebt.negated(), - userDataBeforeAction.stableBorrowRate - ); - // adding it again at the new rate - - expectedReserveData.averageStableBorrowRate = calcExpectedAverageStableBorrowRateRebalance( - avgRateBefore, - expectedReserveData.totalStableDebt.minus(userStableDebt), - userStableDebt, - reserveDataBeforeAction.stableBorrowRate - ); - - expectedReserveData.utilizationRate = calcExpectedUtilizationRate( - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.totalLiquidity - ); - - const rates = calcExpectedInterestRates( - reserveDataBeforeAction.symbol, - reserveDataBeforeAction.marketStableRate, - expectedReserveData.utilizationRate, - expectedReserveData.totalStableDebt, - expectedReserveData.totalVariableDebt, - expectedReserveData.averageStableBorrowRate - ); - - expectedReserveData.liquidityRate = rates[0]; - - expectedReserveData.stableBorrowRate = rates[1]; - - expectedReserveData.variableBorrowRate = rates[2]; - - return expectedReserveData; -}; - -export const calcExpectedUserDataAfterStableRateRebalance = ( - reserveDataBeforeAction: ReserveData, - expectedDataAfterAction: ReserveData, - userDataBeforeAction: UserReserveData, - txCost: BigNumber, - txTimestamp: BigNumber -): UserReserveData => { - const expectedUserData = { ...userDataBeforeAction }; - - expectedUserData.principalStableDebt = userDataBeforeAction.principalStableDebt; - - expectedUserData.principalVariableDebt = calcExpectedVariableDebtTokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - expectedUserData.currentStableDebt = expectedUserData.principalStableDebt = - calcExpectedStableDebtTokenBalance( - userDataBeforeAction.principalStableDebt, - userDataBeforeAction.stableBorrowRate, - userDataBeforeAction.stableRateLastUpdated, - txTimestamp - ); - - expectedUserData.currentVariableDebt = calcExpectedVariableDebtTokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - expectedUserData.stableRateLastUpdated = txTimestamp; - - expectedUserData.principalVariableDebt = userDataBeforeAction.principalVariableDebt; - - // Stable rate after burn - expectedUserData.stableBorrowRate = expectedDataAfterAction.averageStableBorrowRate; - expectedUserData.liquidityRate = expectedDataAfterAction.liquidityRate; - - expectedUserData.currentATokenBalance = calcExpectedATokenBalance( - reserveDataBeforeAction, - userDataBeforeAction, - txTimestamp - ); - - return expectedUserData; -}; - -const calcExpectedScaledATokenBalance = ( - userDataBeforeAction: UserReserveData, - index: BigNumber, - amountAdded: BigNumber, - amountTaken: BigNumber -) => { - return userDataBeforeAction.scaledATokenBalance - .plus(amountAdded.rayDiv(index)) - .minus(amountTaken.rayDiv(index)); -}; - -export const calcExpectedATokenBalance = ( - reserveData: ReserveData, - userData: UserReserveData, - currentTimestamp: BigNumber -) => { - const index = calcExpectedReserveNormalizedIncome(reserveData, currentTimestamp); - - const { scaledATokenBalance: scaledBalanceBeforeAction } = userData; - - return scaledBalanceBeforeAction.rayMul(index); -}; - -const calcExpectedAverageStableBorrowRate = ( - avgStableRateBefore: BigNumber, - totalStableDebtBefore: BigNumber, - amountChanged: string | BigNumber, - rate: BigNumber -) => { - const weightedTotalBorrows = avgStableRateBefore.multipliedBy(totalStableDebtBefore); - const weightedAmountBorrowed = rate.multipliedBy(amountChanged); - const totalBorrowedStable = totalStableDebtBefore.plus(amountChanged); - - if (totalBorrowedStable.eq(0)) return new BigNumber('0'); - - return weightedTotalBorrows - .plus(weightedAmountBorrowed) - .div(totalBorrowedStable) - .decimalPlaces(0, BigNumber.ROUND_DOWN); -}; - -const calcExpectedAverageStableBorrowRateRebalance = ( - avgStableRateBefore: BigNumber, - totalStableDebtBefore: BigNumber, - amountChanged: BigNumber, - rate: BigNumber -) => { - const weightedTotalBorrows = avgStableRateBefore.rayMul(totalStableDebtBefore); - const weightedAmountBorrowed = rate.rayMul(amountChanged.wadToRay()); - const totalBorrowedStable = totalStableDebtBefore.plus(amountChanged.wadToRay()); - - if (totalBorrowedStable.eq(0)) return new BigNumber('0'); - - return weightedTotalBorrows - .plus(weightedAmountBorrowed) - .rayDiv(totalBorrowedStable) - .decimalPlaces(0, BigNumber.ROUND_DOWN); -}; - -export const calcExpectedVariableDebtTokenBalance = ( - reserveData: ReserveData, - userData: UserReserveData, - currentTimestamp: BigNumber -) => { - const normalizedDebt = calcExpectedReserveNormalizedDebt( - reserveData.variableBorrowRate, - reserveData.variableBorrowIndex, - reserveData.lastUpdateTimestamp, - currentTimestamp - ); - - const { scaledVariableDebt } = userData; - - return scaledVariableDebt.rayMul(normalizedDebt); -}; - -export const calcExpectedStableDebtTokenBalance = ( - principalStableDebt: BigNumber, - stableBorrowRate: BigNumber, - stableRateLastUpdated: BigNumber, - currentTimestamp: BigNumber -) => { - if ( - stableBorrowRate.eq(0) || - currentTimestamp.eq(stableRateLastUpdated) || - stableRateLastUpdated.eq(0) - ) { - return principalStableDebt; - } - - const cumulatedInterest = calcCompoundedInterest( - stableBorrowRate, - currentTimestamp, - stableRateLastUpdated - ); - - return principalStableDebt.rayMul(cumulatedInterest); -}; - -const calcLinearInterest = ( - rate: BigNumber, - currentTimestamp: BigNumber, - lastUpdateTimestamp: BigNumber -) => { - const timeDifference = currentTimestamp.minus(lastUpdateTimestamp); - - const cumulatedInterest = rate - .multipliedBy(timeDifference) - .dividedBy(new BigNumber(ONE_YEAR)) - .plus(RAY); - - return cumulatedInterest; -}; - -export const calcCompoundedInterest = ( - rate: BigNumber, - currentTimestamp: BigNumber, - lastUpdateTimestamp: BigNumber -) => { - const timeDifference = currentTimestamp.minus(lastUpdateTimestamp); - - if (timeDifference.eq(0)) { - return new BigNumber(RAY); - } - - const expMinusOne = timeDifference.minus(1); - const expMinusTwo = timeDifference.gt(2) ? timeDifference.minus(2) : 0; - - const ratePerSecond = rate.div(ONE_YEAR); - - const basePowerTwo = ratePerSecond.rayMul(ratePerSecond); - const basePowerThree = basePowerTwo.rayMul(ratePerSecond); - - const secondTerm = timeDifference.times(expMinusOne).times(basePowerTwo).div(2); - const thirdTerm = timeDifference - .times(expMinusOne) - .times(expMinusTwo) - .times(basePowerThree) - .div(6); - - return new BigNumber(RAY) - .plus(ratePerSecond.times(timeDifference)) - .plus(secondTerm) - .plus(thirdTerm); -}; - -export const calcExpectedInterestRates = ( - reserveSymbol: string, - marketStableRate: BigNumber, - utilizationRate: BigNumber, - totalStableDebt: BigNumber, - totalVariableDebt: BigNumber, - averageStableBorrowRate: BigNumber -): BigNumber[] => { - const { reservesParams } = configuration; - - // Fixes WETH - LpWETH mock token symbol mismatch - // if(reserveSymbol === 'WETH') { - // reserveSymbol = 'LpWETH'; - // } - const reserveIndex = Object.keys(reservesParams).findIndex((value) => value === reserveSymbol); - const [, reserveConfiguration] = (Object.entries(reservesParams) as [string, IReserveParams][])[ - reserveIndex - ]; - - let stableBorrowRate: BigNumber = marketStableRate; - let variableBorrowRate: BigNumber = new BigNumber( - reserveConfiguration.strategy.baseVariableBorrowRate - ); - - const optimalRate = new BigNumber(reserveConfiguration.strategy.optimalUtilizationRate); - const excessRate = new BigNumber(RAY).minus(optimalRate); - if (utilizationRate.gt(optimalRate)) { - const excessUtilizationRateRatio = utilizationRate - .minus(reserveConfiguration.strategy.optimalUtilizationRate) - .rayDiv(excessRate); - - stableBorrowRate = stableBorrowRate - .plus(reserveConfiguration.strategy.stableRateSlope1) - .plus( - new BigNumber(reserveConfiguration.strategy.stableRateSlope2).rayMul( - excessUtilizationRateRatio - ) - ); - - variableBorrowRate = variableBorrowRate - .plus(reserveConfiguration.strategy.variableRateSlope1) - .plus( - new BigNumber(reserveConfiguration.strategy.variableRateSlope2).rayMul( - excessUtilizationRateRatio - ) - ); - } else { - stableBorrowRate = stableBorrowRate.plus( - new BigNumber(reserveConfiguration.strategy.stableRateSlope1).rayMul( - utilizationRate.rayDiv(new BigNumber(optimalRate)) - ) - ); - - variableBorrowRate = variableBorrowRate.plus( - utilizationRate - .rayDiv(optimalRate) - .rayMul(new BigNumber(reserveConfiguration.strategy.variableRateSlope1)) - ); - } - - const expectedOverallRate = calcExpectedOverallBorrowRate( - totalStableDebt, - totalVariableDebt, - variableBorrowRate, - averageStableBorrowRate - ); - const liquidityRate = expectedOverallRate - .rayMul(utilizationRate) - .percentMul(new BigNumber(PERCENTAGE_FACTOR).minus(reserveConfiguration.reserveFactor)); - - return [liquidityRate, stableBorrowRate, variableBorrowRate]; -}; - -export const calcExpectedOverallBorrowRate = ( - totalStableDebt: BigNumber, - totalVariableDebt: BigNumber, - currentVariableBorrowRate: BigNumber, - currentAverageStableBorrowRate: BigNumber -): BigNumber => { - const totalBorrows = totalStableDebt.plus(totalVariableDebt); - - if (totalBorrows.eq(0)) return strToBN('0'); - - const weightedVariableRate = totalVariableDebt.wadToRay().rayMul(currentVariableBorrowRate); - - const weightedStableRate = totalStableDebt.wadToRay().rayMul(currentAverageStableBorrowRate); - - const overallBorrowRate = weightedVariableRate - .plus(weightedStableRate) - .rayDiv(totalBorrows.wadToRay()); - - return overallBorrowRate; -}; - -export const calcExpectedUtilizationRate = ( - totalStableDebt: BigNumber, - totalVariableDebt: BigNumber, - totalLiquidity: BigNumber -): BigNumber => { - if (totalStableDebt.eq('0') && totalVariableDebt.eq('0')) { - return strToBN('0'); - } - - const utilization = totalStableDebt.plus(totalVariableDebt).rayDiv(totalLiquidity); - - return utilization; -}; - -const calcExpectedReserveNormalizedIncome = ( - reserveData: ReserveData, - currentTimestamp: BigNumber -) => { - const { liquidityRate, liquidityIndex, lastUpdateTimestamp } = reserveData; - - //if utilization rate is 0, nothing to compound - if (liquidityRate.eq('0')) { - return liquidityIndex; - } - - const cumulatedInterest = calcLinearInterest( - liquidityRate, - currentTimestamp, - lastUpdateTimestamp - ); - - const income = cumulatedInterest.rayMul(liquidityIndex); - - return income; -}; - -const calcExpectedReserveNormalizedDebt = ( - variableBorrowRate: BigNumber, - variableBorrowIndex: BigNumber, - lastUpdateTimestamp: BigNumber, - currentTimestamp: BigNumber -) => { - //if utilization rate is 0, nothing to compound - if (variableBorrowRate.eq('0')) { - return variableBorrowIndex; - } - - const cumulatedInterest = calcCompoundedInterest( - variableBorrowRate, - currentTimestamp, - lastUpdateTimestamp - ); - - const debt = cumulatedInterest.rayMul(variableBorrowIndex); - - return debt; -}; - -const calcExpectedUserStableRate = ( - balanceBefore: BigNumber, - rateBefore: BigNumber, - amount: BigNumber, - rateNew: BigNumber -) => { - return balanceBefore - .times(rateBefore) - .plus(amount.times(rateNew)) - .div(balanceBefore.plus(amount)); -}; - -const calcExpectedLiquidityIndex = (reserveData: ReserveData, timestamp: BigNumber) => { - //if utilization rate is 0, nothing to compound - if (reserveData.utilizationRate.eq('0')) { - return reserveData.liquidityIndex; - } - - const cumulatedInterest = calcLinearInterest( - reserveData.liquidityRate, - timestamp, - reserveData.lastUpdateTimestamp - ); - - return cumulatedInterest.rayMul(reserveData.liquidityIndex); -}; - -const calcExpectedVariableBorrowIndex = (reserveData: ReserveData, timestamp: BigNumber) => { - //if totalVariableDebt is 0, nothing to compound - if (reserveData.totalVariableDebt.eq('0')) { - return reserveData.variableBorrowIndex; - } - - const cumulatedInterest = calcCompoundedInterest( - reserveData.variableBorrowRate, - timestamp, - reserveData.lastUpdateTimestamp - ); - - return cumulatedInterest.rayMul(reserveData.variableBorrowIndex); -}; - -const calcExpectedTotalStableDebt = ( - principalStableDebt: BigNumber, - averageStableBorrowRate: BigNumber, - lastUpdateTimestamp: BigNumber, - currentTimestamp: BigNumber -) => { - const cumulatedInterest = calcCompoundedInterest( - averageStableBorrowRate, - currentTimestamp, - lastUpdateTimestamp - ); - - return cumulatedInterest.rayMul(principalStableDebt); -}; - -const calcExpectedTotalVariableDebt = ( - reserveData: ReserveData, - expectedVariableDebtIndex: BigNumber -) => { - return reserveData.scaledVariableDebt.rayMul(expectedVariableDebtIndex); -}; diff --git a/test-suites/test-amm/helpers/utils/interfaces/index.ts b/test-suites/test-amm/helpers/utils/interfaces/index.ts deleted file mode 100644 index 17660fcce..000000000 --- a/test-suites/test-amm/helpers/utils/interfaces/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -import BigNumber from 'bignumber.js'; - -export interface UserReserveData { - scaledATokenBalance: BigNumber; - currentATokenBalance: BigNumber; - currentStableDebt: BigNumber; - currentVariableDebt: BigNumber; - principalStableDebt: BigNumber; - scaledVariableDebt: BigNumber; - liquidityRate: BigNumber; - stableBorrowRate: BigNumber; - stableRateLastUpdated: BigNumber; - usageAsCollateralEnabled: Boolean; - walletBalance: BigNumber; - [key: string]: BigNumber | string | Boolean; -} - -export interface ReserveData { - address: string; - symbol: string; - decimals: BigNumber; - totalLiquidity: BigNumber; - availableLiquidity: BigNumber; - totalStableDebt: BigNumber; - totalVariableDebt: BigNumber; - principalStableDebt: BigNumber; - scaledVariableDebt: BigNumber; - averageStableBorrowRate: BigNumber; - variableBorrowRate: BigNumber; - stableBorrowRate: BigNumber; - utilizationRate: BigNumber; - liquidityIndex: BigNumber; - variableBorrowIndex: BigNumber; - aTokenAddress: string; - marketStableRate: BigNumber; - lastUpdateTimestamp: BigNumber; - totalStableDebtLastUpdated: BigNumber; - liquidityRate: BigNumber; - [key: string]: BigNumber | string; -} diff --git a/test-suites/test-amm/helpers/utils/math.ts b/test-suites/test-amm/helpers/utils/math.ts deleted file mode 100644 index 27ea0531e..000000000 --- a/test-suites/test-amm/helpers/utils/math.ts +++ /dev/null @@ -1,97 +0,0 @@ -import BigNumber from 'bignumber.js'; -import { - RAY, - WAD, - HALF_RAY, - HALF_WAD, - WAD_RAY_RATIO, - HALF_PERCENTAGE, - PERCENTAGE_FACTOR, -} from '../../../../helpers/constants'; - -declare module 'bignumber.js' { - interface BigNumber { - ray: () => BigNumber; - wad: () => BigNumber; - halfRay: () => BigNumber; - halfWad: () => BigNumber; - halfPercentage: () => BigNumber; - wadMul: (a: BigNumber) => BigNumber; - wadDiv: (a: BigNumber) => BigNumber; - rayMul: (a: BigNumber) => BigNumber; - rayDiv: (a: BigNumber) => BigNumber; - percentMul: (a: BigNumber) => BigNumber; - percentDiv: (a: BigNumber) => BigNumber; - rayToWad: () => BigNumber; - wadToRay: () => BigNumber; - } -} - -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.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.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); -}; - -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); - - 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); - - 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.halfPercentage = (): BigNumber => { - return new BigNumber(HALF_PERCENTAGE).decimalPlaces(0, BigNumber.ROUND_DOWN); -}; - -BigNumber.prototype.percentMul = function (b: BigNumber): BigNumber { - return this.halfPercentage() - .plus(this.multipliedBy(b)) - .div(PERCENTAGE_FACTOR) - .decimalPlaces(0, BigNumber.ROUND_DOWN); -}; - -BigNumber.prototype.percentDiv = function (a: BigNumber): BigNumber { - const halfA = a.div(2).decimalPlaces(0, BigNumber.ROUND_DOWN); - - return halfA - .plus(this.multipliedBy(PERCENTAGE_FACTOR)) - .div(a) - .decimalPlaces(0, BigNumber.ROUND_DOWN); -}; diff --git a/test-suites/test-amm/liquidation-atoken.spec.ts b/test-suites/test-amm/liquidation-atoken.spec.ts deleted file mode 100644 index 908a3228d..000000000 --- a/test-suites/test-amm/liquidation-atoken.spec.ts +++ /dev/null @@ -1,378 +0,0 @@ -import BigNumber from 'bignumber.js'; - -import { DRE } from '../../helpers/misc-utils'; -import { APPROVAL_AMOUNT_POOL, oneEther } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; -import { makeSuite } from './helpers/make-suite'; -import { ProtocolErrors, RateMode } from '../../helpers/types'; -import { calcExpectedVariableDebtTokenBalance } from './helpers/utils/calculations'; -import { getUserData, getReserveData } from './helpers/utils/helpers'; - -const chai = require('chai'); -const { expect } = chai; - -makeSuite('Pool liquidation - liquidator receiving aToken', (testEnv) => { - const { - PCM_HEALTH_FACTOR_NOT_BELOW_THRESHOLD, - INVALID_HF, - PCM_SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER, - PCM_COLLATERAL_CANNOT_BE_LIQUIDATED, - } = ProtocolErrors; - - it('Deposits WETH, borrows DAI/Check liquidation fails because health factor is above 1', async () => { - const { dai, weth, users, pool, oracle } = testEnv; - const depositor = users[0]; - const borrower = users[1]; - - //mints DAI to depositor - await dai.connect(depositor.signer).mint(await convertToCurrencyDecimals(dai.address, '1000')); - - //approve protocol to access depositor wallet - await dai.connect(depositor.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - //user 1 deposits 1000 DAI - const amountDAItoDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - await pool - .connect(depositor.signer) - .deposit(dai.address, amountDAItoDeposit, depositor.address, '0'); - - const amountETHtoDeposit = await convertToCurrencyDecimals(weth.address, '1'); - - //mints WETH to borrower - await weth.connect(borrower.signer).mint(amountETHtoDeposit); - - //approve protocol to access borrower wallet - await weth.connect(borrower.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - //user 2 deposits 1 WETH - await pool - .connect(borrower.signer) - .deposit(weth.address, amountETHtoDeposit, borrower.address, '0'); - - //user 2 borrows - const userGlobalData = await pool.getUserAccountData(borrower.address); - const daiPrice = await oracle.getAssetPrice(dai.address); - - const amountDAIToBorrow = await convertToCurrencyDecimals( - dai.address, - new BigNumber(userGlobalData.availableBorrowsBase.toString()) - .div(daiPrice.toString()) - .multipliedBy(0.95) - .toFixed(0) - ); - - await pool - .connect(borrower.signer) - .borrow(dai.address, amountDAIToBorrow, RateMode.Variable, '0', borrower.address); - - const userGlobalDataAfter = await pool.getUserAccountData(borrower.address); - - expect(userGlobalDataAfter.currentLiquidationThreshold.toString()).to.be.bignumber.equal( - '8250', - 'Invalid liquidation threshold' - ); - - //someone tries to liquidate user 2 - await expect( - pool.liquidationCall(weth.address, dai.address, borrower.address, 1, true) - ).to.be.revertedWith(PCM_HEALTH_FACTOR_NOT_BELOW_THRESHOLD); - }); - - it('Drop the health factor below 1', async () => { - const { dai, users, pool, oracle } = testEnv; - const borrower = users[1]; - - const daiPrice = await oracle.getAssetPrice(dai.address); - - await oracle.setAssetPrice( - dai.address, - new BigNumber(daiPrice.toString()).multipliedBy(1.15).toFixed(0) - ); - - const userGlobalData = await pool.getUserAccountData(borrower.address); - - expect(userGlobalData.healthFactor.toString()).to.be.bignumber.lt( - oneEther.toString(), - INVALID_HF - ); - }); - - it('Tries to liquidate a different currency than the loan principal', async () => { - const { pool, users, weth } = testEnv; - const borrower = users[1]; - //user 2 tries to borrow - await expect( - pool.liquidationCall(weth.address, weth.address, borrower.address, oneEther.toString(), true) - ).revertedWith(PCM_SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER); - }); - - it('Tries to liquidate a different collateral than the borrower collateral', async () => { - const { pool, dai, users } = testEnv; - const borrower = users[1]; - - await expect( - pool.liquidationCall(dai.address, dai.address, borrower.address, oneEther.toString(), true) - ).revertedWith(PCM_COLLATERAL_CANNOT_BE_LIQUIDATED); - }); - - it('Liquidates the borrow', async () => { - const { pool, dai, weth, aWETH, aDai, users, oracle, helpersContract, deployer } = testEnv; - const borrower = users[1]; - - //mints dai to the caller - - await dai.mint(await convertToCurrencyDecimals(dai.address, '1000')); - - //approve protocol to access depositor wallet - await dai.approve(pool.address, APPROVAL_AMOUNT_POOL); - - const daiReserveDataBefore = await getReserveData(helpersContract, dai.address); - const ethReserveDataBefore = await helpersContract.getReserveData(weth.address); - - const userReserveDataBefore = await getUserData( - pool, - helpersContract, - dai.address, - borrower.address - ); - - const amountToLiquidate = new BigNumber(userReserveDataBefore.currentVariableDebt.toString()) - .div(2) - .toFixed(0); - - const tx = await pool.liquidationCall( - weth.address, - dai.address, - borrower.address, - amountToLiquidate, - true - ); - - const userReserveDataAfter = await helpersContract.getUserReserveData( - dai.address, - borrower.address - ); - - const userGlobalDataAfter = await pool.getUserAccountData(borrower.address); - - const daiReserveDataAfter = await helpersContract.getReserveData(dai.address); - const ethReserveDataAfter = await helpersContract.getReserveData(weth.address); - - const collateralPrice = (await oracle.getAssetPrice(weth.address)).toString(); - const principalPrice = (await oracle.getAssetPrice(dai.address)).toString(); - - const collateralDecimals = ( - await helpersContract.getReserveConfigurationData(weth.address) - ).decimals.toString(); - const principalDecimals = ( - await helpersContract.getReserveConfigurationData(dai.address) - ).decimals.toString(); - - const expectedCollateralLiquidated = new BigNumber(principalPrice) - .times(new BigNumber(amountToLiquidate).times(105)) - .times(new BigNumber(10).pow(collateralDecimals)) - .div(new BigNumber(collateralPrice).times(new BigNumber(10).pow(principalDecimals))) - .decimalPlaces(0, BigNumber.ROUND_DOWN); - - if (!tx.blockNumber) { - expect(false, 'Invalid block number'); - return; - } - - const txTimestamp = new BigNumber( - (await DRE.ethers.provider.getBlock(tx.blockNumber)).timestamp - ); - - const variableDebtBeforeTx = calcExpectedVariableDebtTokenBalance( - daiReserveDataBefore, - userReserveDataBefore, - txTimestamp - ); - - expect(userGlobalDataAfter.healthFactor.toString()).to.be.bignumber.gt( - oneEther.toFixed(0), - 'Invalid health factor' - ); - - expect(userReserveDataAfter.currentVariableDebt.toString()).to.be.bignumber.almostEqual( - new BigNumber(variableDebtBeforeTx).minus(amountToLiquidate).toFixed(0), - 'Invalid user borrow balance after liquidation' - ); - - expect(daiReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(daiReserveDataBefore.availableLiquidity.toString()) - .plus(amountToLiquidate) - .toFixed(0), - 'Invalid principal available liquidity' - ); - - //the liquidity index of the principal reserve needs to be bigger than the index before - expect(daiReserveDataAfter.liquidityIndex.toString()).to.be.bignumber.gte( - daiReserveDataBefore.liquidityIndex.toString(), - 'Invalid liquidity index' - ); - - //the principal APY after a liquidation needs to be lower than the APY before - expect(daiReserveDataAfter.liquidityRate.toString()).to.be.bignumber.lt( - daiReserveDataBefore.liquidityRate.toString(), - 'Invalid liquidity APY' - ); - - expect(ethReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(ethReserveDataBefore.availableLiquidity.toString()).toFixed(0), - 'Invalid collateral available liquidity' - ); - - expect( - (await helpersContract.getUserReserveData(weth.address, deployer.address)) - .usageAsCollateralEnabled - ).to.be.true; - }); - - it('User 3 deposits 1000 USDC, user 4 1 WETH, user 4 borrows at variable - drops HF, liquidates the borrow', async () => { - const { users, pool, usdc, oracle, weth, helpersContract } = testEnv; - const depositor = users[3]; - const borrower = users[4]; - - //mints USDC to depositor - await usdc - .connect(depositor.signer) - .mint(await convertToCurrencyDecimals(usdc.address, '1000')); - - //approve protocol to access depositor wallet - await usdc.connect(depositor.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - //user 3 deposits 1000 USDC - const amountUSDCtoDeposit = await convertToCurrencyDecimals(usdc.address, '1000'); - - await pool - .connect(depositor.signer) - .deposit(usdc.address, amountUSDCtoDeposit, depositor.address, '0'); - - //user 4 deposits 1 ETH - const amountETHtoDeposit = await convertToCurrencyDecimals(weth.address, '1'); - - //mints WETH to borrower - await weth.connect(borrower.signer).mint(amountETHtoDeposit); - - //approve protocol to access borrower wallet - await weth.connect(borrower.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - await pool - .connect(borrower.signer) - .deposit(weth.address, amountETHtoDeposit, borrower.address, '0'); - - //user 4 borrows - const userGlobalData = await pool.getUserAccountData(borrower.address); - - const usdcPrice = await oracle.getAssetPrice(usdc.address); - - const amountUSDCToBorrow = await convertToCurrencyDecimals( - usdc.address, - new BigNumber(userGlobalData.availableBorrowsBase.toString()) - .div(usdcPrice.toString()) - .multipliedBy(0.9502) - .toFixed(0) - ); - - await pool - .connect(borrower.signer) - .borrow(usdc.address, amountUSDCToBorrow, RateMode.Variable, '0', borrower.address); - - //drops HF below 1 - - await oracle.setAssetPrice( - usdc.address, - new BigNumber(usdcPrice.toString()).multipliedBy(1.12).toFixed(0) - ); - - //mints dai to the liquidator - - await usdc.mint(await convertToCurrencyDecimals(usdc.address, '1000')); - - //approve protocol to access depositor wallet - await usdc.approve(pool.address, APPROVAL_AMOUNT_POOL); - - const userReserveDataBefore = await helpersContract.getUserReserveData( - usdc.address, - borrower.address - ); - - const usdcReserveDataBefore = await helpersContract.getReserveData(usdc.address); - const ethReserveDataBefore = await helpersContract.getReserveData(weth.address); - - const amountToLiquidate = new BigNumber(userReserveDataBefore.currentVariableDebt.toString()) - .multipliedBy(0.5) - .toFixed(0); - - await pool.liquidationCall( - weth.address, - usdc.address, - borrower.address, - amountToLiquidate, - true - ); - - const userReserveDataAfter = await helpersContract.getUserReserveData( - usdc.address, - borrower.address - ); - - const userGlobalDataAfter = await pool.getUserAccountData(borrower.address); - - const usdcReserveDataAfter = await helpersContract.getReserveData(usdc.address); - const ethReserveDataAfter = await helpersContract.getReserveData(weth.address); - - const collateralPrice = (await oracle.getAssetPrice(weth.address)).toString(); - const principalPrice = (await oracle.getAssetPrice(usdc.address)).toString(); - - const collateralDecimals = ( - await helpersContract.getReserveConfigurationData(weth.address) - ).decimals.toString(); - const principalDecimals = ( - await helpersContract.getReserveConfigurationData(usdc.address) - ).decimals.toString(); - - const expectedCollateralLiquidated = new BigNumber(principalPrice) - .times(new BigNumber(amountToLiquidate).times(105)) - .times(new BigNumber(10).pow(collateralDecimals)) - .div(new BigNumber(collateralPrice).times(new BigNumber(10).pow(principalDecimals))) - .decimalPlaces(0, BigNumber.ROUND_DOWN); - - expect(userGlobalDataAfter.healthFactor.toString()).to.be.bignumber.gt( - oneEther.toFixed(0), - 'Invalid health factor' - ); - - expect(userReserveDataAfter.currentVariableDebt.toString()).to.be.bignumber.almostEqual( - new BigNumber(userReserveDataBefore.currentVariableDebt.toString()) - .minus(amountToLiquidate) - .toFixed(0), - 'Invalid user borrow balance after liquidation' - ); - - expect(usdcReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(usdcReserveDataBefore.availableLiquidity.toString()) - .plus(amountToLiquidate) - .toFixed(0), - 'Invalid principal available liquidity' - ); - - //the liquidity index of the principal reserve needs to be bigger than the index before - expect(usdcReserveDataAfter.liquidityIndex.toString()).to.be.bignumber.gte( - usdcReserveDataBefore.liquidityIndex.toString(), - 'Invalid liquidity index' - ); - - //the principal APY after a liquidation needs to be lower than the APY before - expect(usdcReserveDataAfter.liquidityRate.toString()).to.be.bignumber.lt( - usdcReserveDataBefore.liquidityRate.toString(), - 'Invalid liquidity APY' - ); - - expect(ethReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(ethReserveDataBefore.availableLiquidity.toString()).toFixed(0), - 'Invalid collateral available liquidity' - ); - }); -}); diff --git a/test-suites/test-amm/liquidation-underlying.spec.ts b/test-suites/test-amm/liquidation-underlying.spec.ts deleted file mode 100644 index 03d1a77a6..000000000 --- a/test-suites/test-amm/liquidation-underlying.spec.ts +++ /dev/null @@ -1,492 +0,0 @@ -import BigNumber from 'bignumber.js'; - -import { DRE, increaseTime } from '../../helpers/misc-utils'; -import { APPROVAL_AMOUNT_POOL, oneEther } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; -import { makeSuite } from './helpers/make-suite'; -import { ProtocolErrors, RateMode } from '../../helpers/types'; -import { calcExpectedVariableDebtTokenBalance } from './helpers/utils/calculations'; -import { getReserveData, getUserData } from './helpers/utils/helpers'; -import { CommonsConfig } from '../../markets/amm/commons'; - -import { parseEther } from 'ethers/lib/utils'; - -const chai = require('chai'); - -const { expect } = chai; - -makeSuite('Pool liquidation - liquidator receiving the underlying asset', (testEnv) => { - const { INVALID_HF } = ProtocolErrors; - - before('Before Pool liquidation: set config', () => { - BigNumber.config({ DECIMAL_PLACES: 0, ROUNDING_MODE: BigNumber.ROUND_DOWN }); - }); - - after('After Pool liquidation: reset config', () => { - BigNumber.config({ DECIMAL_PLACES: 20, ROUNDING_MODE: BigNumber.ROUND_HALF_UP }); - }); - - it("It's not possible to liquidate on a non-active collateral or a non active principal", async () => { - const { configurator, weth, pool, users, dai } = testEnv; - const user = users[1]; - await configurator.deactivateReserve(weth.address); - - await expect( - pool.liquidationCall(weth.address, dai.address, user.address, parseEther('1000'), false) - ).to.be.revertedWith('2'); - - await configurator.activateReserve(weth.address); - - await configurator.deactivateReserve(dai.address); - - await expect( - pool.liquidationCall(weth.address, dai.address, user.address, parseEther('1000'), false) - ).to.be.revertedWith('2'); - - await configurator.activateReserve(dai.address); - }); - - it('Deposits WETH, borrows DAI', async () => { - const { dai, weth, users, pool, oracle } = testEnv; - const depositor = users[0]; - const borrower = users[1]; - - //mints DAI to depositor - await dai.connect(depositor.signer).mint(await convertToCurrencyDecimals(dai.address, '1000')); - - //approve protocol to access depositor wallet - await dai.connect(depositor.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - //user 1 deposits 1000 DAI - const amountDAItoDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - await pool - .connect(depositor.signer) - .deposit(dai.address, amountDAItoDeposit, depositor.address, '0'); - //user 2 deposits 1 ETH - const amountETHtoDeposit = await convertToCurrencyDecimals(weth.address, '1'); - - //mints WETH to borrower - await weth.connect(borrower.signer).mint(await convertToCurrencyDecimals(weth.address, '1000')); - - //approve protocol to access the borrower wallet - await weth.connect(borrower.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - await pool - .connect(borrower.signer) - .deposit(weth.address, amountETHtoDeposit, borrower.address, '0'); - - //user 2 borrows - - const userGlobalData = await pool.getUserAccountData(borrower.address); - const daiPrice = await oracle.getAssetPrice(dai.address); - - const amountDAIToBorrow = await convertToCurrencyDecimals( - dai.address, - new BigNumber(userGlobalData.availableBorrowsBase.toString()) - .div(daiPrice.toString()) - .multipliedBy(0.95) - .toFixed(0) - ); - - await pool - .connect(borrower.signer) - .borrow(dai.address, amountDAIToBorrow, RateMode.Variable, '0', borrower.address); - - const userGlobalDataAfter = await pool.getUserAccountData(borrower.address); - - expect(userGlobalDataAfter.currentLiquidationThreshold.toString()).to.be.bignumber.equal( - '8250', - INVALID_HF - ); - }); - - it('Drop the health factor below 1', async () => { - const { dai, weth, users, pool, oracle } = testEnv; - const borrower = users[1]; - - const daiPrice = await oracle.getAssetPrice(dai.address); - - await oracle.setAssetPrice( - dai.address, - new BigNumber(daiPrice.toString()).multipliedBy(1.18).toFixed(0) - ); - - const userGlobalData = await pool.getUserAccountData(borrower.address); - - expect(userGlobalData.healthFactor.toString()).to.be.bignumber.lt( - oneEther.toFixed(0), - INVALID_HF - ); - }); - - it('Liquidates the borrow', async () => { - const { dai, weth, users, pool, oracle, helpersContract } = testEnv; - const liquidator = users[3]; - const borrower = users[1]; - - //mints dai to the liquidator - await dai.connect(liquidator.signer).mint(await convertToCurrencyDecimals(dai.address, '1000')); - - //approve protocol to access the liquidator wallet - await dai.connect(liquidator.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - const daiReserveBefore = await getReserveData(helpersContract, dai.address); - const daiReserveDataBefore = await helpersContract.getReserveData(dai.address); - const ethReserveDataBefore = await helpersContract.getReserveData(weth.address); - - const userReserveDataBefore = await getUserData( - pool, - helpersContract, - dai.address, - borrower.address - ); - - const amountToLiquidate = userReserveDataBefore.currentVariableDebt.div(2).toFixed(0); - - await increaseTime(100); - - const tx = await pool - .connect(liquidator.signer) - .liquidationCall(weth.address, dai.address, borrower.address, amountToLiquidate, false); - - const userReserveDataAfter = await getUserData( - pool, - helpersContract, - dai.address, - borrower.address - ); - - const daiReserveDataAfter = await helpersContract.getReserveData(dai.address); - const ethReserveDataAfter = await helpersContract.getReserveData(weth.address); - - const collateralPrice = await oracle.getAssetPrice(weth.address); - const principalPrice = await oracle.getAssetPrice(dai.address); - - const collateralDecimals = ( - await helpersContract.getReserveConfigurationData(weth.address) - ).decimals.toString(); - const principalDecimals = ( - await helpersContract.getReserveConfigurationData(dai.address) - ).decimals.toString(); - - const expectedCollateralLiquidated = new BigNumber(principalPrice.toString()) - .times(new BigNumber(amountToLiquidate).times(105)) - .times(new BigNumber(10).pow(collateralDecimals)) - .div( - new BigNumber(collateralPrice.toString()).times(new BigNumber(10).pow(principalDecimals)) - ) - .div(100) - .decimalPlaces(0, BigNumber.ROUND_DOWN); - - if (!tx.blockNumber) { - expect(false, 'Invalid block number'); - return; - } - const txTimestamp = new BigNumber( - (await DRE.ethers.provider.getBlock(tx.blockNumber)).timestamp - ); - const reserve = await getReserveData; - const variableDebtBeforeTx = calcExpectedVariableDebtTokenBalance( - daiReserveBefore, - userReserveDataBefore, - txTimestamp - ); - - expect(userReserveDataAfter.currentVariableDebt.toString()).to.be.bignumber.almostEqual( - variableDebtBeforeTx.minus(amountToLiquidate).toFixed(0), - 'Invalid user debt after liquidation' - ); - - //the liquidity index of the principal reserve needs to be bigger than the index before - expect(daiReserveDataAfter.liquidityIndex.toString()).to.be.bignumber.gte( - daiReserveDataBefore.liquidityIndex.toString(), - 'Invalid liquidity index' - ); - - //the principal APY after a liquidation needs to be lower than the APY before - expect(daiReserveDataAfter.liquidityRate.toString()).to.be.bignumber.lt( - daiReserveDataBefore.liquidityRate.toString(), - 'Invalid liquidity APY' - ); - - expect(daiReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(daiReserveDataBefore.availableLiquidity.toString()) - .plus(amountToLiquidate) - .toFixed(0), - 'Invalid principal available liquidity' - ); - - expect(ethReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(ethReserveDataBefore.availableLiquidity.toString()) - .minus(expectedCollateralLiquidated) - .toFixed(0), - 'Invalid collateral available liquidity' - ); - }); - - it('User 3 deposits 1000 USDC, user 4 1 WETH, user 4 borrows - drops HF, liquidates the borrow', async () => { - const { usdc, users, pool, oracle, weth, helpersContract } = testEnv; - - const depositor = users[3]; - const borrower = users[4]; - const liquidator = users[5]; - - //mints USDC to depositor - await usdc - .connect(depositor.signer) - .mint(await convertToCurrencyDecimals(usdc.address, '1000')); - - //approve protocol to access depositor wallet - await usdc.connect(depositor.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - //depositor deposits 1000 USDC - const amountUSDCtoDeposit = await convertToCurrencyDecimals(usdc.address, '1000'); - - await pool - .connect(depositor.signer) - .deposit(usdc.address, amountUSDCtoDeposit, depositor.address, '0'); - - //borrower deposits 1 ETH - const amountETHtoDeposit = await convertToCurrencyDecimals(weth.address, '1'); - - //mints WETH to borrower - await weth.connect(borrower.signer).mint(await convertToCurrencyDecimals(weth.address, '1000')); - - //approve protocol to access the borrower wallet - await weth.connect(borrower.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - await pool - .connect(borrower.signer) - .deposit(weth.address, amountETHtoDeposit, borrower.address, '0'); - - //borrower borrows - const userGlobalData = await pool.getUserAccountData(borrower.address); - - const usdcPrice = await oracle.getAssetPrice(usdc.address); - - const amountUSDCToBorrow = await convertToCurrencyDecimals( - usdc.address, - new BigNumber(userGlobalData.availableBorrowsBase.toString()) - .div(usdcPrice.toString()) - .multipliedBy(0.9502) - .toFixed(0) - ); - - await pool - .connect(borrower.signer) - .borrow(usdc.address, amountUSDCToBorrow, RateMode.Variable, '0', borrower.address); - - //drops HF below 1 - await oracle.setAssetPrice( - usdc.address, - new BigNumber(usdcPrice.toString()).multipliedBy(1.12).toFixed(0) - ); - - //mints dai to the liquidator - - await usdc - .connect(liquidator.signer) - .mint(await convertToCurrencyDecimals(usdc.address, '1000')); - - //approve protocol to access depositor wallet - await usdc.connect(liquidator.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - const userReserveDataBefore = await helpersContract.getUserReserveData( - usdc.address, - borrower.address - ); - - const usdcReserveDataBefore = await helpersContract.getReserveData(usdc.address); - const ethReserveDataBefore = await helpersContract.getReserveData(weth.address); - - const amountToLiquidate = DRE.ethers.BigNumber.from( - userReserveDataBefore.currentVariableDebt.toString() - ) - .div(2) - .toString(); - - await pool - .connect(liquidator.signer) - .liquidationCall(weth.address, usdc.address, borrower.address, amountToLiquidate, false); - - const userReserveDataAfter = await helpersContract.getUserReserveData( - usdc.address, - borrower.address - ); - - const userGlobalDataAfter = await pool.getUserAccountData(borrower.address); - - const usdcReserveDataAfter = await helpersContract.getReserveData(usdc.address); - const ethReserveDataAfter = await helpersContract.getReserveData(weth.address); - - const collateralPrice = await oracle.getAssetPrice(weth.address); - const principalPrice = await oracle.getAssetPrice(usdc.address); - - const collateralDecimals = ( - await helpersContract.getReserveConfigurationData(weth.address) - ).decimals.toString(); - const principalDecimals = ( - await helpersContract.getReserveConfigurationData(usdc.address) - ).decimals.toString(); - - const expectedCollateralLiquidated = new BigNumber(principalPrice.toString()) - .times(new BigNumber(amountToLiquidate).times(105)) - .times(new BigNumber(10).pow(collateralDecimals)) - .div( - new BigNumber(collateralPrice.toString()).times(new BigNumber(10).pow(principalDecimals)) - ) - .div(100) - .decimalPlaces(0, BigNumber.ROUND_DOWN); - - expect(userGlobalDataAfter.healthFactor.toString()).to.be.bignumber.gt( - oneEther.toFixed(0), - 'Invalid health factor' - ); - - expect(userReserveDataAfter.currentVariableDebt.toString()).to.be.bignumber.almostEqual( - new BigNumber(userReserveDataBefore.currentVariableDebt.toString()) - .minus(amountToLiquidate) - .toFixed(0), - 'Invalid user borrow balance after liquidation' - ); - - //the liquidity index of the principal reserve needs to be bigger than the index before - expect(usdcReserveDataAfter.liquidityIndex.toString()).to.be.bignumber.gte( - usdcReserveDataBefore.liquidityIndex.toString(), - 'Invalid liquidity index' - ); - - //the principal APY after a liquidation needs to be lower than the APY before - expect(usdcReserveDataAfter.liquidityRate.toString()).to.be.bignumber.lt( - usdcReserveDataBefore.liquidityRate.toString(), - 'Invalid liquidity APY' - ); - - expect(usdcReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(usdcReserveDataBefore.availableLiquidity.toString()) - .plus(amountToLiquidate) - .toFixed(0), - 'Invalid principal available liquidity' - ); - - expect(ethReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(ethReserveDataBefore.availableLiquidity.toString()) - .minus(expectedCollateralLiquidated) - .toFixed(0), - 'Invalid collateral available liquidity' - ); - }); - - it('User 4 deposits 10 AAVE - drops HF, liquidates the AAVE, which results on a lower amount being liquidated', async () => { - const { aave, usdc, users, pool, oracle, helpersContract } = testEnv; - - const depositor = users[3]; - const borrower = users[4]; - const liquidator = users[5]; - - //mints AAVE to borrower - await aave.connect(borrower.signer).mint(await convertToCurrencyDecimals(aave.address, '10')); - - //approve protocol to access the borrower wallet - await aave.connect(borrower.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - //borrower deposits 10 AAVE - const amountToDeposit = await convertToCurrencyDecimals(aave.address, '10'); - - await pool - .connect(borrower.signer) - .deposit(aave.address, amountToDeposit, borrower.address, '0'); - const usdcPrice = await oracle.getAssetPrice(usdc.address); - - //drops HF below 1 - await oracle.setAssetPrice( - usdc.address, - new BigNumber(usdcPrice.toString()).multipliedBy(1.14).toFixed(0) - ); - - //mints usdc to the liquidator - await usdc - .connect(liquidator.signer) - .mint(await convertToCurrencyDecimals(usdc.address, '1000')); - - //approve protocol to access depositor wallet - await usdc.connect(liquidator.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - const userReserveDataBefore = await helpersContract.getUserReserveData( - usdc.address, - borrower.address - ); - - const usdcReserveDataBefore = await helpersContract.getReserveData(usdc.address); - const aaveReserveDataBefore = await helpersContract.getReserveData(aave.address); - - const amountToLiquidate = new BigNumber(userReserveDataBefore.currentVariableDebt.toString()) - .div(2) - .decimalPlaces(0, BigNumber.ROUND_DOWN) - .toFixed(0); - - const collateralPrice = await oracle.getAssetPrice(aave.address); - const principalPrice = await oracle.getAssetPrice(usdc.address); - - await pool - .connect(liquidator.signer) - .liquidationCall(aave.address, usdc.address, borrower.address, amountToLiquidate, false); - - const userReserveDataAfter = await helpersContract.getUserReserveData( - usdc.address, - borrower.address - ); - - const userGlobalDataAfter = await pool.getUserAccountData(borrower.address); - - const usdcReserveDataAfter = await helpersContract.getReserveData(usdc.address); - const aaveReserveDataAfter = await helpersContract.getReserveData(aave.address); - - const aaveConfiguration = await helpersContract.getReserveConfigurationData(aave.address); - const collateralDecimals = aaveConfiguration.decimals.toString(); - const liquidationBonus = aaveConfiguration.liquidationBonus.toString(); - - const principalDecimals = ( - await helpersContract.getReserveConfigurationData(usdc.address) - ).decimals.toString(); - - const expectedCollateralLiquidated = oneEther.multipliedBy('10'); - - const expectedPrincipal = new BigNumber(collateralPrice.toString()) - .times(expectedCollateralLiquidated) - .times(new BigNumber(10).pow(principalDecimals)) - .div( - new BigNumber(principalPrice.toString()).times(new BigNumber(10).pow(collateralDecimals)) - ) - .times(10000) - .div(liquidationBonus.toString()) - .decimalPlaces(0, BigNumber.ROUND_DOWN); - - expect(userGlobalDataAfter.healthFactor.toString()).to.be.bignumber.gt( - oneEther.toFixed(0), - 'Invalid health factor' - ); - - expect(userReserveDataAfter.currentVariableDebt.toString()).to.be.bignumber.almostEqual( - new BigNumber(userReserveDataBefore.currentVariableDebt.toString()) - .minus(expectedPrincipal) - .toFixed(0), - 'Invalid user borrow balance after liquidation' - ); - - expect(usdcReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(usdcReserveDataBefore.availableLiquidity.toString()) - .plus(expectedPrincipal) - .toFixed(0), - 'Invalid principal available liquidity' - ); - - expect(aaveReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(aaveReserveDataBefore.availableLiquidity.toString()) - .minus(expectedCollateralLiquidated) - .toFixed(0), - 'Invalid collateral available liquidity' - ); - }); -}); diff --git a/test-suites/test-amm/pausable-functions.spec.ts b/test-suites/test-amm/pausable-functions.spec.ts deleted file mode 100644 index e79d8203f..000000000 --- a/test-suites/test-amm/pausable-functions.spec.ts +++ /dev/null @@ -1,330 +0,0 @@ -import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors, RateMode } from '../../helpers/types'; -import { APPROVAL_AMOUNT_POOL, oneEther } from '../../helpers/constants'; -import { convertToCurrencyDecimals } from '../../helpers/contracts-helpers'; -import { parseEther, parseUnits } from 'ethers/lib/utils'; -import { BigNumber } from 'bignumber.js'; -import { MockFlashLoanReceiver } from '../../types/MockFlashLoanReceiver'; -import { getMockFlashLoanReceiver } from '../../helpers/contracts-getters'; - -const { expect } = require('chai'); - -makeSuite('Pausable Pool', (testEnv: TestEnv) => { - let _mockFlashLoanReceiver = {} as MockFlashLoanReceiver; - - const { - VL_RESERVE_PAUSED, - INVALID_FROM_BALANCE_AFTER_TRANSFER, - INVALID_TO_BALANCE_AFTER_TRANSFER, - } = ProtocolErrors; - - before(async () => { - _mockFlashLoanReceiver = await getMockFlashLoanReceiver(); - }); - - it('User 0 deposits 1000 DAI. Configurator pauses pool. Transfers to user 1 reverts. Configurator unpauses the network and next transfer succeeds', async () => { - const { users, pool, dai, aDai, configurator } = testEnv; - - const amountDAItoDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - await dai.connect(users[0].signer).mint(amountDAItoDeposit); - - // user 0 deposits 1000 DAI - await dai.connect(users[0].signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - await pool - .connect(users[0].signer) - .deposit(dai.address, amountDAItoDeposit, users[0].address, '0'); - - const user0Balance = await aDai.balanceOf(users[0].address); - const user1Balance = await aDai.balanceOf(users[1].address); - - // Configurator pauses the pool - await configurator.connect(users[1].signer).setPoolPause(true); - - // User 0 tries the transfer to User 1 - await expect( - aDai.connect(users[0].signer).transfer(users[1].address, amountDAItoDeposit) - ).to.revertedWith(VL_RESERVE_PAUSED); - - const pausedFromBalance = await aDai.balanceOf(users[0].address); - const pausedToBalance = await aDai.balanceOf(users[1].address); - - expect(pausedFromBalance).to.be.equal( - user0Balance.toString(), - INVALID_TO_BALANCE_AFTER_TRANSFER - ); - expect(pausedToBalance.toString()).to.be.equal( - user1Balance.toString(), - INVALID_FROM_BALANCE_AFTER_TRANSFER - ); - - // Configurator unpauses the pool - await configurator.connect(users[1].signer).setPoolPause(false); - - // User 0 succeeds transfer to User 1 - await aDai.connect(users[0].signer).transfer(users[1].address, amountDAItoDeposit); - - const fromBalance = await aDai.balanceOf(users[0].address); - const toBalance = await aDai.balanceOf(users[1].address); - - expect(fromBalance.toString()).to.be.equal( - user0Balance.sub(amountDAItoDeposit), - INVALID_FROM_BALANCE_AFTER_TRANSFER - ); - expect(toBalance.toString()).to.be.equal( - user1Balance.add(amountDAItoDeposit), - INVALID_TO_BALANCE_AFTER_TRANSFER - ); - }); - - it('Deposit', async () => { - const { users, pool, dai, aDai, configurator } = testEnv; - - const amountDAItoDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - await dai.connect(users[0].signer).mint(amountDAItoDeposit); - - // user 0 deposits 1000 DAI - await dai.connect(users[0].signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - // Configurator pauses the pool - await configurator.connect(users[1].signer).setPoolPause(true); - await expect( - pool.connect(users[0].signer).deposit(dai.address, amountDAItoDeposit, users[0].address, '0') - ).to.revertedWith(VL_RESERVE_PAUSED); - - // Configurator unpauses the pool - await configurator.connect(users[1].signer).setPoolPause(false); - }); - - it('Withdraw', async () => { - const { users, pool, dai, aDai, configurator } = testEnv; - - const amountDAItoDeposit = await convertToCurrencyDecimals(dai.address, '1000'); - - await dai.connect(users[0].signer).mint(amountDAItoDeposit); - - // user 0 deposits 1000 DAI - await dai.connect(users[0].signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - await pool - .connect(users[0].signer) - .deposit(dai.address, amountDAItoDeposit, users[0].address, '0'); - - // Configurator pauses the pool - await configurator.connect(users[1].signer).setPoolPause(true); - - // user tries to burn - await expect( - pool.connect(users[0].signer).withdraw(dai.address, amountDAItoDeposit, users[0].address) - ).to.revertedWith(VL_RESERVE_PAUSED); - - // Configurator unpauses the pool - await configurator.connect(users[1].signer).setPoolPause(false); - }); - - it('Borrow', async () => { - const { pool, dai, users, configurator } = testEnv; - - const user = users[1]; - // Pause the pool - await configurator.connect(users[1].signer).setPoolPause(true); - - // Try to execute liquidation - await expect( - pool.connect(user.signer).borrow(dai.address, '1', '2', '0', user.address) - ).revertedWith(VL_RESERVE_PAUSED); - - // Unpause the pool - await configurator.connect(users[1].signer).setPoolPause(false); - }); - - it('Repay', async () => { - const { pool, dai, users, configurator } = testEnv; - - const user = users[1]; - // Pause the pool - await configurator.connect(users[1].signer).setPoolPause(true); - - // Try to execute liquidation - await expect(pool.connect(user.signer).repay(dai.address, '1', '2', user.address)).revertedWith( - VL_RESERVE_PAUSED - ); - - // Unpause the pool - await configurator.connect(users[1].signer).setPoolPause(false); - }); - - it('Flash loan', async () => { - const { dai, pool, weth, users, configurator } = testEnv; - - const caller = users[3]; - - const flashAmount = parseEther('0.8'); - - await _mockFlashLoanReceiver.setFailExecutionTransfer(true); - - // Pause pool - await configurator.connect(users[1].signer).setPoolPause(true); - - await expect( - pool - .connect(caller.signer) - .flashLoan( - _mockFlashLoanReceiver.address, - [weth.address], - [flashAmount], - [2], - caller.address, - '0x10', - '0' - ) - ).revertedWith(VL_RESERVE_PAUSED); - - // Unpause pool - await configurator.connect(users[1].signer).setPoolPause(false); - }); - - it('Liquidation call', async () => { - const { users, pool, usdc, oracle, weth, configurator, helpersContract } = testEnv; - const depositor = users[3]; - const borrower = users[4]; - - //mints USDC to depositor - await usdc - .connect(depositor.signer) - .mint(await convertToCurrencyDecimals(usdc.address, '1000')); - - //approve protocol to access depositor wallet - await usdc.connect(depositor.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - //user 3 deposits 1000 USDC - const amountUSDCtoDeposit = await convertToCurrencyDecimals(usdc.address, '1000'); - - await pool - .connect(depositor.signer) - .deposit(usdc.address, amountUSDCtoDeposit, depositor.address, '0'); - - //user 4 deposits 1 ETH - const amountETHtoDeposit = await convertToCurrencyDecimals(weth.address, '1'); - - //mints WETH to borrower - await weth.connect(borrower.signer).mint(amountETHtoDeposit); - - //approve protocol to access borrower wallet - await weth.connect(borrower.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - - await pool - .connect(borrower.signer) - .deposit(weth.address, amountETHtoDeposit, borrower.address, '0'); - - //user 4 borrows - const userGlobalData = await pool.getUserAccountData(borrower.address); - - const usdcPrice = await oracle.getAssetPrice(usdc.address); - - const amountUSDCToBorrow = await convertToCurrencyDecimals( - usdc.address, - new BigNumber(userGlobalData.availableBorrowsBase.toString()) - .div(usdcPrice.toString()) - .multipliedBy(0.9502) - .toFixed(0) - ); - - await pool - .connect(borrower.signer) - .borrow(usdc.address, amountUSDCToBorrow, RateMode.Variable, '0', borrower.address); - - // Drops HF below 1 - await oracle.setAssetPrice( - usdc.address, - new BigNumber(usdcPrice.toString()).multipliedBy(1.2).toFixed(0) - ); - - //mints dai to the liquidator - await usdc.mint(await convertToCurrencyDecimals(usdc.address, '1000')); - await usdc.approve(pool.address, APPROVAL_AMOUNT_POOL); - - const userReserveDataBefore = await helpersContract.getUserReserveData( - usdc.address, - borrower.address - ); - - const amountToLiquidate = new BigNumber(userReserveDataBefore.currentVariableDebt.toString()) - .multipliedBy(0.5) - .toFixed(0); - - // Pause pool - await configurator.connect(users[1].signer).setPoolPause(true); - - // Do liquidation - await expect( - pool.liquidationCall(weth.address, usdc.address, borrower.address, amountToLiquidate, true) - ).revertedWith(VL_RESERVE_PAUSED); - - // Unpause pool - await configurator.connect(users[1].signer).setPoolPause(false); - }); - - it('SwapBorrowRateMode should fail because pool is paused', async () => { - const { pool, weth, dai, usdc, users, configurator } = testEnv; - const user = users[1]; - const amountWETHToDeposit = parseEther('10'); - const amountDAIToDeposit = parseEther('120'); - const amountToBorrow = parseUnits('65', 6); - - await weth.connect(user.signer).mint(amountWETHToDeposit); - await weth.connect(user.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - await pool.connect(user.signer).deposit(weth.address, amountWETHToDeposit, user.address, '0'); - - await dai.connect(user.signer).mint(amountDAIToDeposit); - await dai.connect(user.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - await pool.connect(user.signer).deposit(dai.address, amountDAIToDeposit, user.address, '0'); - - await pool.connect(user.signer).borrow(usdc.address, amountToBorrow, 2, 0, user.address); - - // Pause pool - await configurator.connect(users[1].signer).setPoolPause(true); - - // Try to repay - await expect( - pool.connect(user.signer).swapBorrowRateMode(usdc.address, RateMode.Stable) - ).revertedWith(VL_RESERVE_PAUSED); - - // Unpause pool - await configurator.connect(users[1].signer).setPoolPause(false); - }); - - it('RebalanceStableBorrowRate should fail because the pool is paused, even if there is no stable borrow', async () => { - const { pool, dai, users, configurator } = testEnv; - const user = users[1]; - // Pause pool - await configurator.connect(users[1].signer).setPoolPause(true); - - await expect( - pool.connect(user.signer).rebalanceStableBorrowRate(dai.address, user.address) - ).revertedWith(VL_RESERVE_PAUSED); - - // Unpause pool - await configurator.connect(users[1].signer).setPoolPause(false); - }); - - it('setUserUseReserveAsCollateral', async () => { - const { pool, weth, users, configurator } = testEnv; - const user = users[1]; - - const amountWETHToDeposit = parseEther('1'); - await weth.connect(user.signer).mint(amountWETHToDeposit); - await weth.connect(user.signer).approve(pool.address, APPROVAL_AMOUNT_POOL); - await pool.connect(user.signer).deposit(weth.address, amountWETHToDeposit, user.address, '0'); - - // Pause pool - await configurator.connect(users[1].signer).setPoolPause(true); - - await expect( - pool.connect(user.signer).setUserUseReserveAsCollateral(weth.address, false) - ).revertedWith(VL_RESERVE_PAUSED); - - // Unpause pool - await configurator.connect(users[1].signer).setPoolPause(false); - }); -}); diff --git a/test-suites/test-amm/pool-modifiers.spec.ts b/test-suites/test-amm/pool-modifiers.spec.ts deleted file mode 100644 index ed50407a5..000000000 --- a/test-suites/test-amm/pool-modifiers.spec.ts +++ /dev/null @@ -1,241 +0,0 @@ -// import {iATokenBase, iAssetsWithoutETH, ITestEnvWithoutInstances, RateMode} from '../utils/types'; -// import { -// PoolConfiguratorInstance, -// PoolInstance, -// ATokenInstance, -// PoolCoreInstance, -// MintableERC20Instance, -// } from '../utils/typechain-types/truffle-contracts'; -// import {testEnvProviderWithoutInstances} from '../utils/truffle/dlp-tests-env'; -// import {oneEther, ETHEREUM_ADDRESS} from '../utils/constants'; -// import {convertToCurrencyDecimals} from '../utils/misc-utils'; - -// const expectRevert = require('@openzeppelin/test-helpers').expectRevert; - -// contract('Pool: Modifiers', async ([deployer, ...users]) => { -// let _testEnvProvider: ITestEnvWithoutInstances; -// let _poolConfiguratorInstance: PoolConfiguratorInstance; -// let _PoolInstance: PoolInstance; -// let _PoolCoreInstance: PoolCoreInstance; -// let _aTokenInstances: iATokenBase; -// let _tokenInstances: iAssetsWithoutETH; - -// before('Initializing Pool test variables', async () => { -// console.time('setup-test'); -// _testEnvProvider = await testEnvProviderWithoutInstances(artifacts, [deployer, ...users]); - -// const { -// getAllAssetsInstances, -// getPoolInstance, -// getPoolCoreInstance, -// getPoolConfiguratorInstance, -// getATokenInstances, -// } = _testEnvProvider; -// const instances = await Promise.all([ -// getPoolInstance(), -// getPoolCoreInstance(), -// getPoolConfiguratorInstance(), -// getATokenInstances(), -// getAllAssetsInstances(), -// ]); - -// _poolInstance = instances[0]; -// _poolCoreInstance = instances[1]; -// _poolConfiguratorInstance = instances[2]; - -// _aTokenInstances = instances[3]; -// _tokenInstances = instances[4]; -// console.timeEnd('setup-test'); -// }); - -// it('Tries to deposit in an inactive reserve', async () => { -// //using the deployer address as a fake reserve address -// await expectRevert( -// _poolInstance.deposit(deployer, '1', '0'), -// 'Action requires an active reserve' -// ); -// }); - -// it('Tries to invoke redeemUnderlying on an reserve, from a non-aToken address', async () => { -// await expectRevert( -// _poolInstance.redeemUnderlying(ETHEREUM_ADDRESS, deployer, '1', '0'), -// 'The caller of this function can only be the aToken contract of this reserve' -// ); -// }); - -// it('Tries to borrow from an inactive reserve', async () => { -// //using the deployer address as a fake reserve address -// await expectRevert( -// _poolInstance.borrow(deployer, '1', '0', RateMode.Stable), -// 'Action requires an active reserve' -// ); -// }); - -// it('Tries to repay in an inactive reserve', async () => { -// //using the deployer address as a fake reserve address -// await expectRevert( -// _poolInstance.repay(deployer, '1', deployer), -// 'Action requires an active reserve' -// ); -// }); - -// it('Tries to swapBorrowRateMode on an inactive reserve', async () => { -// //using the deployer address as a fake reserve address -// await expectRevert( -// _poolInstance.swapBorrowRateMode(deployer), -// 'Action requires an active reserve' -// ); -// }); - -// it('Tries to rebalanceStableBorrowRate on an inactive reserve', async () => { -// //using the deployer address as a fake reserve address -// await expectRevert( -// _poolInstance.rebalanceStableBorrowRate(deployer, deployer), -// 'Action requires an active reserve' -// ); -// }); - -// it('Tries to setUserUseReserveAsCollateral on an inactive reserve', async () => { -// //using the deployer address as a fake reserve address -// await expectRevert( -// _poolInstance.setUserUseReserveAsCollateral(deployer, true), -// 'Action requires an active reserve' -// ); -// }); - -// it('Tries to invoke liquidationCall on an inactive reserve', async () => { -// //using the deployer address as a fake reserve address -// await expectRevert( -// _poolInstance.liquidationCall(ETHEREUM_ADDRESS, deployer, deployer, '1', false), -// 'Action requires an active reserve' -// ); -// }); - -// it('Tries to invoke liquidationCall on an inactive collateral', async () => { -// //using the deployer address as a fake reserve address -// await expectRevert( -// _poolInstance.liquidationCall(deployer, ETHEREUM_ADDRESS, deployer, '1', false), -// 'Action requires an active reserve' -// ); -// }); - -// it('Freezes the ETH reserve', async () => { -// await _poolConfiguratorInstance.freezeReserve(ETHEREUM_ADDRESS); -// }); - -// it('tries to deposit in a freezed reserve', async () => { -// await expectRevert( -// _poolInstance.deposit(ETHEREUM_ADDRESS, '1', '0'), -// 'Action requires an unfreezed reserve' -// ); -// }); - -// it('tries to borrow from a freezed reserve', async () => { -// await expectRevert( -// _poolInstance.borrow(ETHEREUM_ADDRESS, '1', '0', '0'), -// 'Action requires an unfreezed reserve' -// ); -// }); - -// it('tries to swap interest rate mode in a freezed reserve', async () => { -// await expectRevert( -// _poolInstance.swapBorrowRateMode(ETHEREUM_ADDRESS), -// 'Action requires an unfreezed reserve' -// ); -// }); - -// it('tries to disable as collateral a freezed reserve', async () => { -// await expectRevert( -// _poolInstance.setUserUseReserveAsCollateral(ETHEREUM_ADDRESS, false), -// 'Action requires an unfreezed reserve' -// ); -// }); - -// it('unfreezes the reserve, user deposits 1 ETH, freezes the reserve, check that the user can redeem', async () => { -// const {aWETH} = _aTokenInstances; - -// //unfreezes the reserve -// await _poolConfiguratorInstance.unfreezeReserve(ETHEREUM_ADDRESS); - -// //deposit 1 ETH -// await _poolInstance.deposit(ETHEREUM_ADDRESS, oneEther, '0', { -// value: oneEther.toString(), -// }); - -// //freezes the reserve -// await _poolConfiguratorInstance.freezeReserve(ETHEREUM_ADDRESS); - -// const balance = await aWETH.balanceOf(deployer); - -// await aWETH.redeem(balance); -// }); - -// it('unfreezes the reserve, user 0 deposits 100 DAI, user 1 deposits 1 ETH and borrows 50 DAI, freezes the reserve, checks that the user 1 can repay', async () => { -// const {aWETH, aDAI} = _aTokenInstances; -// const {DAI} = _tokenInstances; - -// //unfreezes the reserve -// await _poolConfiguratorInstance.unfreezeReserve(ETHEREUM_ADDRESS); - -// const amountDAI = await convertToCurrencyDecimals(DAI.address, '100'); - -// //user 0 deposits 100 DAI -// await DAI.mint(amountDAI, {from: users[0]}); - -// await DAI.approve(_poolCoreInstance.address, amountDAI, {from: users[0]}); - -// await _poolInstance.deposit(DAI.address, amountDAI, '0', {from: users[0]}); - -// //user 1 deposits 1 ETH -// await _poolInstance.deposit(ETHEREUM_ADDRESS, oneEther, '0', { -// from: users[1], -// value: oneEther.toString(), -// }); - -// const amountDAIToBorrow = await convertToCurrencyDecimals(DAI.address, '10'); - -// //user 1 borrows 10 DAI -// await _poolInstance.borrow(DAI.address, amountDAIToBorrow, RateMode.Stable, '0', { -// from: users[1], -// }); - -// //freezes the reserve -// await _poolConfiguratorInstance.freezeReserve(ETHEREUM_ADDRESS); - -// //user 1 repays 1 DAI -// await DAI.approve(_poolCoreInstance.address, amountDAIToBorrow, {from: users[1]}); - -// await _poolInstance.repay(DAI.address, oneEther, users[1], {from: users[1]}); -// }); - -// it('Check that liquidationCall can be executed on a freezed reserve', async () => { -// const {aWETH, aDAI} = _aTokenInstances; -// const {DAI} = _tokenInstances; - -// //user 2 tries to liquidate - -// await expectRevert( -// _poolInstance.liquidationCall( -// ETHEREUM_ADDRESS, -// DAI.address, -// users[1], -// oneEther, -// true, -// {from: users[2]} -// ), -// 'Health factor is not below the threshold' -// ); -// }); - -// it('Check that rebalanceStableBorrowRate can be executed on a freezed reserve', async () => { -// const {aWETH, aDAI} = _aTokenInstances; -// const {DAI} = _tokenInstances; - -// //user 2 tries to liquidate - -// await expectRevert( -// _poolInstance.rebalanceStableBorrowRate(DAI.address, users[1]), -// 'Interest rate rebalance conditions were not met' -// ); -// }); -// }); diff --git a/test-suites/test-amm/scenario.spec.ts b/test-suites/test-amm/scenario.spec.ts deleted file mode 100644 index 0e4572179..000000000 --- a/test-suites/test-amm/scenario.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { configuration as actionsConfiguration } from './helpers/actions'; -import { configuration as calculationsConfiguration } from './helpers/utils/calculations'; - -import fs from 'fs'; -import BigNumber from 'bignumber.js'; -import { makeSuite } from './helpers/make-suite'; -import { getReservesConfigByPool } from '../../helpers/configuration'; -import { AavePools, iLpPoolAssets, IReserveParams } from '../../helpers/types'; -import { executeStory } from './helpers/scenario-engine'; - -const scenarioFolder = './test-suites/test-amm/helpers/scenarios/'; - -const selectedScenarios: string[] = []; - -fs.readdirSync(scenarioFolder).forEach((file) => { - if (selectedScenarios.length > 0 && !selectedScenarios.includes(file)) return; - - const scenario = require(`./helpers/scenarios/${file}`); - - makeSuite(scenario.title, async (testEnv) => { - before('Initializing configuration', async () => { - // Sets BigNumber for this suite, instead of globally - BigNumber.config({ DECIMAL_PLACES: 0, ROUNDING_MODE: BigNumber.ROUND_DOWN }); - - actionsConfiguration.skipIntegrityCheck = false; //set this to true to execute solidity-coverage - - calculationsConfiguration.reservesParams = >( - getReservesConfigByPool(AavePools.amm) - ); - }); - after('Reset', () => { - // Reset BigNumber - BigNumber.config({ DECIMAL_PLACES: 20, ROUNDING_MODE: BigNumber.ROUND_HALF_UP }); - }); - - for (const story of scenario.stories) { - it(story.description, async function () { - // Retry the test scenarios up to 4 times in case random HEVM network errors happen - this.retries(4); - await executeStory(story, testEnv); - }); - } - }); -}); diff --git a/test-suites/test-amm/stable-rate-economy.spec.ts b/test-suites/test-amm/stable-rate-economy.spec.ts deleted file mode 100644 index bfdc526af..000000000 --- a/test-suites/test-amm/stable-rate-economy.spec.ts +++ /dev/null @@ -1,199 +0,0 @@ -// import { -// PoolInstance, -// PoolCoreInstance, -// MintableERC20Instance, -// ATokenInstance, -// } from "../utils/typechain-types/truffle-contracts" -// import { -// iATokenBase, -// iAssetsWithoutETH, -// ITestEnvWithoutInstances, -// RateMode, -// } from "../utils/types" -// import { -// APPROVAL_AMOUNT_POOL_CORE, -// ETHEREUM_ADDRESS, -// } from "../utils/constants" -// import { testEnvProviderWithoutInstances} from "../utils/truffle/dlp-tests-env" -// import {convertToCurrencyDecimals} from "../utils/misc-utils" - -// const expectRevert = require("@openzeppelin/test-helpers").expectRevert - -// contract("Pool - stable rate economy tests", async ([deployer, ...users]) => { -// let _testEnvProvider: ITestEnvWithoutInstances -// let _poolInstance: PoolInstance -// let _poolCoreInstance: PoolCoreInstance -// let _aTokenInstances: iATokenBase -// let _tokenInstances: iAssetsWithoutETH - -// let _daiAddress: string - -// let _depositorAddress: string -// let _borrowerAddress: string - -// let _web3: Web3 - -// before("Initializing Pool test variables", async () => { -// console.time('setup-test'); -// _testEnvProvider = await testEnvProviderWithoutInstances( -// artifacts, -// [deployer, ...users] -// ) - -// const { -// getWeb3, -// getAllAssetsInstances, -// getFirstBorrowerAddressOnTests, -// getFirstDepositorAddressOnTests, -// getPoolInstance, -// getPoolCoreInstance, -// getATokenInstances -// } = _testEnvProvider - -// const instances = await Promise.all([ -// getPoolInstance(), -// getPoolCoreInstance(), -// getATokenInstances(), -// getAllAssetsInstances() -// ]) -// _poolInstance = instances[0] -// _poolCoreInstance = instances[1] -// _aTokenInstances = instances[2] -// _tokenInstances = instances[3] -// _daiAddress = _tokenInstances.DAI.address -// _depositorAddress = await getFirstDepositorAddressOnTests() -// _borrowerAddress = await getFirstBorrowerAddressOnTests() - -// _web3 = await getWeb3() -// console.timeEnd('setup-test'); -// }) - -// it("BORROW - Test user cannot borrow using the same currency as collateral", async () => { -// const {aDAI: aDaiInstance} = _aTokenInstances -// const {DAI: daiInstance} = _tokenInstances - -// //mints DAI to depositor -// await daiInstance.mint(await convertToCurrencyDecimals(daiInstance.address, "1000"), { -// from: _depositorAddress, -// }) - -// //mints DAI to borrower -// await daiInstance.mint(await convertToCurrencyDecimals(daiInstance.address, "1000"), { -// from: _borrowerAddress, -// }) - -// //approve protocol to access depositor wallet -// await daiInstance.approve(_poolCoreInstance.address, APPROVAL_AMOUNT_POOL_CORE, { -// from: _depositorAddress, -// }) - -// //approve protocol to access borrower wallet -// await daiInstance.approve(_poolCoreInstance.address, APPROVAL_AMOUNT_POOL_CORE, { -// from: _borrowerAddress, -// }) - -// const amountDAItoDeposit = await convertToCurrencyDecimals(_daiAddress, "1000") - -// //user 1 deposits 1000 DAI -// const txResult = await _poolInstance.deposit(_daiAddress, amountDAItoDeposit, "0", { -// from: _depositorAddress, -// }) - -// //user 2 deposits 1000 DAI, tries to borrow. Needs to be reverted as you can't borrow at a stable rate with the same collateral as the currency. -// const amountDAIToDepositBorrower = await convertToCurrencyDecimals(_daiAddress, "1000") -// await _poolInstance.deposit(_daiAddress, amountDAIToDepositBorrower, "0", { -// from: _borrowerAddress, -// }) - -// const data: any = await _poolInstance.getReserveData(_daiAddress) - -// //user 2 tries to borrow -// const amountDAIToBorrow = await convertToCurrencyDecimals(_daiAddress, "250") - -// //user 2 tries to borrow -// await expectRevert( -// _poolInstance.borrow(_daiAddress, amountDAIToBorrow, RateMode.Stable, "0", { -// from: _borrowerAddress, -// }), -// "User cannot borrow the selected amount with a stable rate", -// ) -// }) - -// it("BORROW - Test user cannot borrow more than 25% of the liquidity available", async () => { -// const {aDAI: aDaiInstance} = _aTokenInstances -// const {DAI: daiInstance} = _tokenInstances - -// //redeem the DAI previously deposited -// const amountADAIToRedeem = await convertToCurrencyDecimals(aDaiInstance.address, "1000") -// await aDaiInstance.redeem(amountADAIToRedeem, { -// from: _borrowerAddress, -// }) - -// //user 2 deposits 5 ETH tries to borrow. needs to be reverted as you can't borrow more than 25% of the available reserve (250 DAI) -// const amountETHToDeposit = await convertToCurrencyDecimals(ETHEREUM_ADDRESS, "5") -// await _poolInstance.deposit(ETHEREUM_ADDRESS, amountETHToDeposit, "0", { -// from: _borrowerAddress, -// value: amountETHToDeposit, -// }) - -// const data: any = await _poolInstance.getReserveData(_daiAddress) - -// const amountDAIToBorrow = await convertToCurrencyDecimals(_daiAddress, "500") - -// //user 2 tries to borrow -// await expectRevert( -// _poolInstance.borrow(_daiAddress, amountDAIToBorrow, RateMode.Stable, "0", { -// from: _borrowerAddress, -// }), -// "User is trying to borrow too much liquidity at a stable rate", -// ) -// }) - -// it("BORROW - Test user can still borrow a currency that he previously deposited as a collateral but he transferred/redeemed", async () => { -// const {aDAI: aDaiInstance} = _aTokenInstances -// const {DAI: daiInstance} = _tokenInstances - -// const user = users[2] - -// //user deposits 1000 DAI -// await daiInstance.mint(await convertToCurrencyDecimals(daiInstance.address, "1000"), { -// from: user, -// }) -// await daiInstance.approve(_poolCoreInstance.address, APPROVAL_AMOUNT_POOL_CORE, { -// from: user, -// }) - -// const amountDAIToDeposit = await convertToCurrencyDecimals(daiInstance.address, "1000") -// await _poolInstance.deposit(daiInstance.address, amountDAIToDeposit, "0", { -// from: user, -// }) - -// //user deposits 5 ETH as collateral -// const amountETHToDeposit = await convertToCurrencyDecimals(ETHEREUM_ADDRESS, "5") -// await _poolInstance.deposit(ETHEREUM_ADDRESS, amountETHToDeposit, "0", { -// from: user, -// value: amountETHToDeposit, -// }) - -// //user transfers to another address all the overlying aDAI - -// const aDAIBalance = await aDaiInstance.balanceOf(user) - -// await aDaiInstance.transfer(users[3], aDAIBalance, { -// from: user, -// }) - -// //check the underlying balance is 0 -// const userData: any = await _poolInstance.getUserReserveData(daiInstance.address, user) - -// expect(userData.currentATokenBalance.toString()).to.be.equal("0") - -// //user tries to borrow the DAI at a stable rate using the ETH as collateral -// const amountDAIToBorrow = await convertToCurrencyDecimals(_daiAddress, "100") - -// //user tries to borrow. No revert expected -// await _poolInstance.borrow(_daiAddress, amountDAIToBorrow, RateMode.Stable, "0", { -// from: user, -// }) -// }) -// }) diff --git a/test-suites/test-amm/stable-token.spec.ts b/test-suites/test-amm/stable-token.spec.ts deleted file mode 100644 index 1102bdad7..000000000 --- a/test-suites/test-amm/stable-token.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { expect } from 'chai'; -import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors } from '../../helpers/types'; -import { getStableDebtToken } from '../../helpers/contracts-getters'; - -makeSuite('Stable debt token tests', (testEnv: TestEnv) => { - const { CT_CALLER_MUST_BE_POOL } = ProtocolErrors; - - it('Tries to invoke mint not being the Pool', async () => { - const { deployer, pool, dai, helpersContract } = testEnv; - - const daiStableDebtTokenAddress = (await helpersContract.getReserveTokensAddresses(dai.address)) - .stableDebtTokenAddress; - - const stableDebtContract = await getStableDebtToken(daiStableDebtTokenAddress); - - await expect( - stableDebtContract.mint(deployer.address, deployer.address, '1', '1') - ).to.be.revertedWith(CT_CALLER_MUST_BE_POOL); - }); - - it('Tries to invoke burn not being the Pool', async () => { - const { deployer, dai, helpersContract } = testEnv; - - const daiStableDebtTokenAddress = (await helpersContract.getReserveTokensAddresses(dai.address)) - .stableDebtTokenAddress; - - const stableDebtContract = await getStableDebtToken(daiStableDebtTokenAddress); - - const name = await stableDebtContract.name(); - - expect(name).to.be.equal('Aave AMM Market stable debt DAI'); - await expect(stableDebtContract.burn(deployer.address, '1')).to.be.revertedWith( - CT_CALLER_MUST_BE_POOL - ); - }); -}); diff --git a/test-suites/test-amm/subgraph-scenarios.spec.ts b/test-suites/test-amm/subgraph-scenarios.spec.ts deleted file mode 100644 index a622eb348..000000000 --- a/test-suites/test-amm/subgraph-scenarios.spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { configuration as actionsConfiguration } from './helpers/actions'; -import { configuration as calculationsConfiguration } from './helpers/utils/calculations'; - -import BigNumber from 'bignumber.js'; -import { makeSuite } from './helpers/make-suite'; -import { getReservesConfigByPool } from '../../helpers/configuration'; -import { AavePools, iLpPoolAssets, IReserveParams } from '../../helpers/types'; -import { executeStory } from './helpers/scenario-engine'; - -makeSuite('Subgraph scenario tests', async (testEnv) => { - let story: any; - let scenario; - before('Initializing configuration', async () => { - const scenario = require(`./helpers/scenarios/borrow-repay-stable`); - story = scenario.stories[0]; - // Sets BigNumber for this suite, instead of globally - BigNumber.config({ DECIMAL_PLACES: 0, ROUNDING_MODE: BigNumber.ROUND_DOWN }); - - actionsConfiguration.skipIntegrityCheck = false; //set this to true to execute solidity-coverage - - calculationsConfiguration.reservesParams = >( - getReservesConfigByPool(AavePools.amm) - ); - }); - after('Reset', () => { - // Reset BigNumber - BigNumber.config({ DECIMAL_PLACES: 20, ROUNDING_MODE: BigNumber.ROUND_HALF_UP }); - }); - it('deposit-borrow', async () => { - await executeStory(story, testEnv); - }); -}); diff --git a/test-suites/test-amm/upgradeability.spec.ts b/test-suites/test-amm/upgradeability.spec.ts deleted file mode 100644 index 3c174baf3..000000000 --- a/test-suites/test-amm/upgradeability.spec.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { expect } from 'chai'; -import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors, eContractid } from '../../helpers/types'; -import { deployContract, getContract } from '../../helpers/contracts-helpers'; -import { MockAToken } from '../../types/MockAToken'; -import { MockStableDebtToken } from '../../types/MockStableDebtToken'; -import { MockVariableDebtToken } from '../../types/MockVariableDebtToken'; -import { ZERO_ADDRESS } from '../../helpers/constants'; -import { - getAToken, - getMockStableDebtToken, - getMockVariableDebtToken, - getStableDebtToken, - getVariableDebtToken, -} from '../../helpers/contracts-getters'; -import { - deployMockAToken, - deployMockStableDebtToken, - deployMockVariableDebtToken, -} from '../../helpers/contracts-deployments'; - -makeSuite('Upgradeability', (testEnv: TestEnv) => { - const { CALLER_NOT_POOL_ADMIN } = ProtocolErrors; - let newATokenAddress: string; - let newStableTokenAddress: string; - let newVariableTokenAddress: string; - - before('deploying instances', async () => { - const { dai, pool } = testEnv; - const aTokenInstance = await deployMockAToken([ - pool.address, - dai.address, - ZERO_ADDRESS, - ZERO_ADDRESS, - 'Aave AMM Market DAI updated', - 'aAmmDAI', - '0x10', - ]); - - const stableDebtTokenInstance = await deployMockStableDebtToken([ - pool.address, - dai.address, - ZERO_ADDRESS, - 'Aave AMM Market stable debt DAI updated', - 'stableDebtAmmDAI', - '0x10', - ]); - - const variableDebtTokenInstance = await deployMockVariableDebtToken([ - pool.address, - dai.address, - ZERO_ADDRESS, - 'Aave AMM Market variable debt DAI updated', - 'variableDebtAmmDAI', - '0x10', - ]); - - newATokenAddress = aTokenInstance.address; - newVariableTokenAddress = variableDebtTokenInstance.address; - newStableTokenAddress = stableDebtTokenInstance.address; - }); - - it('Tries to update the DAI Atoken implementation with a different address than the poolManager', async () => { - const { dai, configurator, users } = testEnv; - - const name = await (await getAToken(newATokenAddress)).name(); - const symbol = await (await getAToken(newATokenAddress)).symbol(); - - const updateATokenInputParams: { - asset: string; - treasury: string; - incentivesController: string; - name: string; - symbol: string; - implementation: string; - params: string; - } = { - asset: dai.address, - treasury: ZERO_ADDRESS, - incentivesController: ZERO_ADDRESS, - name: name, - symbol: symbol, - implementation: newATokenAddress, - params: '0x10', - }; - await expect( - configurator.connect(users[1].signer).updateAToken(updateATokenInputParams) - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Upgrades the DAI Atoken implementation ', async () => { - const { dai, configurator, aDai } = testEnv; - - const name = await (await getAToken(newATokenAddress)).name(); - const symbol = await (await getAToken(newATokenAddress)).symbol(); - - const updateATokenInputParams: { - asset: string; - treasury: string; - incentivesController: string; - name: string; - symbol: string; - implementation: string; - } = { - asset: dai.address, - treasury: ZERO_ADDRESS, - incentivesController: ZERO_ADDRESS, - name: name, - symbol: symbol, - implementation: newATokenAddress, - }; - await configurator.updateAToken(updateATokenInputParams); - - const tokenName = await aDai.name(); - - expect(tokenName).to.be.eq('Aave AMM Market DAI updated', 'Invalid token name'); - }); - - it('Tries to update the DAI Stable debt token implementation with a different address than the poolManager', async () => { - const { dai, configurator, users } = testEnv; - - const name = await (await getStableDebtToken(newStableTokenAddress)).name(); - const symbol = await (await getStableDebtToken(newStableTokenAddress)).symbol(); - - const updateDebtTokenInput: { - asset: string; - incentivesController: string; - name: string; - symbol: string; - implementation: string; - } = { - asset: dai.address, - incentivesController: ZERO_ADDRESS, - name: name, - symbol: symbol, - implementation: newStableTokenAddress, - }; - - await expect( - configurator.connect(users[1].signer).updateStableDebtToken(updateDebtTokenInput) - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Upgrades the DAI stable debt token implementation ', async () => { - const { dai, configurator, pool, helpersContract } = testEnv; - - const name = await (await getStableDebtToken(newStableTokenAddress)).name(); - const symbol = await (await getStableDebtToken(newStableTokenAddress)).symbol(); - - const updateDebtTokenInput: { - asset: string; - incentivesController: string; - name: string; - symbol: string; - implementation: string; - } = { - asset: dai.address, - incentivesController: ZERO_ADDRESS, - name: name, - symbol: symbol, - implementation: newStableTokenAddress, - }; - - await configurator.updateStableDebtToken(updateDebtTokenInput); - - const { stableDebtTokenAddress } = await helpersContract.getReserveTokensAddresses(dai.address); - - const debtToken = await getMockStableDebtToken(stableDebtTokenAddress); - - const tokenName = await debtToken.name(); - - expect(tokenName).to.be.eq('Aave AMM Market stable debt DAI updated', 'Invalid token name'); - }); - - it('Tries to update the DAI variable debt token implementation with a different address than the poolManager', async () => { - const { dai, configurator, users } = testEnv; - - const name = await (await getVariableDebtToken(newVariableTokenAddress)).name(); - const symbol = await (await getVariableDebtToken(newVariableTokenAddress)).symbol(); - - const updateDebtTokenInput: { - asset: string; - incentivesController: string; - name: string; - symbol: string; - implementation: string; - } = { - asset: dai.address, - incentivesController: ZERO_ADDRESS, - name: name, - symbol: symbol, - implementation: newVariableTokenAddress, - }; - - await expect( - configurator.connect(users[1].signer).updateVariableDebtToken(updateDebtTokenInput) - ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); - }); - - it('Upgrades the DAI variable debt token implementation ', async () => { - const { dai, configurator, pool, helpersContract } = testEnv; - - const name = await (await getVariableDebtToken(newVariableTokenAddress)).name(); - const symbol = await (await getVariableDebtToken(newVariableTokenAddress)).symbol(); - - const updateDebtTokenInput: { - asset: string; - incentivesController: string; - name: string; - symbol: string; - implementation: string; - } = { - asset: dai.address, - incentivesController: ZERO_ADDRESS, - name: name, - symbol: symbol, - implementation: newVariableTokenAddress, - }; - //const name = await (await getAToken(newATokenAddress)).name(); - - await configurator.updateVariableDebtToken(updateDebtTokenInput); - - const { variableDebtTokenAddress } = await helpersContract.getReserveTokensAddresses( - dai.address - ); - - const debtToken = await getMockVariableDebtToken(variableDebtTokenAddress); - - const tokenName = await debtToken.name(); - - expect(tokenName).to.be.eq('Aave AMM Market variable debt DAI updated', 'Invalid token name'); - }); -}); diff --git a/test-suites/test-amm/variable-debt-token.spec.ts b/test-suites/test-amm/variable-debt-token.spec.ts deleted file mode 100644 index ae3d67ed0..000000000 --- a/test-suites/test-amm/variable-debt-token.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { expect } from 'chai'; -import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors, TokenContractId, eContractid } from '../../helpers/types'; -import { getVariableDebtToken } from '../../helpers/contracts-getters'; - -makeSuite('Variable debt token tests', (testEnv: TestEnv) => { - const { CT_CALLER_MUST_BE_POOL } = ProtocolErrors; - - it('Tries to invoke mint not being the Pool', async () => { - const { deployer, pool, dai, helpersContract } = testEnv; - - const daiVariableDebtTokenAddress = ( - await helpersContract.getReserveTokensAddresses(dai.address) - ).variableDebtTokenAddress; - - const variableDebtContract = await getVariableDebtToken(daiVariableDebtTokenAddress); - - await expect( - variableDebtContract.mint(deployer.address, deployer.address, '1', '1') - ).to.be.revertedWith(CT_CALLER_MUST_BE_POOL); - }); - - it('Tries to invoke burn not being the Pool', async () => { - const { deployer, pool, dai, helpersContract } = testEnv; - - const daiVariableDebtTokenAddress = ( - await helpersContract.getReserveTokensAddresses(dai.address) - ).variableDebtTokenAddress; - - const variableDebtContract = await getVariableDebtToken(daiVariableDebtTokenAddress); - - await expect(variableDebtContract.burn(deployer.address, '1', '1')).to.be.revertedWith( - CT_CALLER_MUST_BE_POOL - ); - }); -}); diff --git a/test-suites/test-aave/upgradeability.spec.ts b/test-suites/upgradeability.spec.ts similarity index 93% rename from test-suites/test-aave/upgradeability.spec.ts rename to test-suites/upgradeability.spec.ts index d217995b6..f0e66d421 100644 --- a/test-suites/test-aave/upgradeability.spec.ts +++ b/test-suites/upgradeability.spec.ts @@ -1,23 +1,23 @@ import { expect } from 'chai'; import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors, eContractid } from '../../helpers/types'; -import { deployContract, getContract } from '../../helpers/contracts-helpers'; -import { MockAToken } from '../../types/MockAToken'; -import { MockStableDebtToken } from '../../types/MockStableDebtToken'; -import { MockVariableDebtToken } from '../../types/MockVariableDebtToken'; -import { ZERO_ADDRESS } from '../../helpers/constants'; +import { ProtocolErrors, eContractid } from '../helpers/types'; +import { deployContract, getContract } from '../helpers/contracts-helpers'; +import { MockAToken } from '../types/MockAToken'; +import { MockStableDebtToken } from '../types/MockStableDebtToken'; +import { MockVariableDebtToken } from '../types/MockVariableDebtToken'; +import { ZERO_ADDRESS } from '../helpers/constants'; import { getAToken, getMockStableDebtToken, getMockVariableDebtToken, getStableDebtToken, getVariableDebtToken, -} from '../../helpers/contracts-getters'; +} from '../helpers/contracts-getters'; import { deployMockAToken, deployMockStableDebtToken, deployMockVariableDebtToken, -} from '../../helpers/contracts-deployments'; +} from '../helpers/contracts-deployments'; makeSuite('Upgradeability', (testEnv: TestEnv) => { const { CALLER_NOT_POOL_ADMIN } = ProtocolErrors; diff --git a/test-suites/test-aave/variable-debt-token.spec.ts b/test-suites/variable-debt-token.spec.ts similarity index 93% rename from test-suites/test-aave/variable-debt-token.spec.ts rename to test-suites/variable-debt-token.spec.ts index ae3d67ed0..31810f1e8 100644 --- a/test-suites/test-aave/variable-debt-token.spec.ts +++ b/test-suites/variable-debt-token.spec.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { makeSuite, TestEnv } from './helpers/make-suite'; -import { ProtocolErrors, TokenContractId, eContractid } from '../../helpers/types'; -import { getVariableDebtToken } from '../../helpers/contracts-getters'; +import { ProtocolErrors, TokenContractId, eContractid } from '../helpers/types'; +import { getVariableDebtToken } from '../helpers/contracts-getters'; makeSuite('Variable debt token tests', (testEnv: TestEnv) => { const { CT_CALLER_MUST_BE_POOL } = ProtocolErrors;