2020-06-12 07:41:30 +00:00
|
|
|
import {TestEnv, makeSuite} from "./helpers/make-suite";
|
|
|
|
import {
|
|
|
|
MOCK_ETH_ADDRESS,
|
|
|
|
RAY,
|
2020-06-20 23:40:03 +00:00
|
|
|
APPROVAL_AMOUNT_LENDING_POOL,
|
2020-06-12 07:41:30 +00:00
|
|
|
} from "../helpers/constants";
|
|
|
|
import {convertToCurrencyDecimals} from "../helpers/contracts-helpers";
|
2020-06-12 08:39:42 +00:00
|
|
|
import {ProtocolErrors} from "../helpers/types";
|
2020-06-12 07:41:30 +00:00
|
|
|
|
|
|
|
const {expect} = require("chai");
|
|
|
|
|
2020-06-12 08:39:42 +00:00
|
|
|
makeSuite("LendingPoolConfigurator", (testEnv: TestEnv) => {
|
|
|
|
const {INVALID_POOL_MANAGER_CALLER_MSG} = ProtocolErrors;
|
|
|
|
|
2020-06-12 07:41:30 +00:00
|
|
|
it("Deactivates the ETH reserve", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.deactivateReserve(MOCK_ETH_ADDRESS);
|
2020-06-20 23:40:03 +00:00
|
|
|
const isActive = await pool.getReserveIsActive(MOCK_ETH_ADDRESS);
|
2020-06-12 07:41:30 +00:00
|
|
|
expect(isActive).to.be.equal(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Rectivates the ETH reserve", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.activateReserve(MOCK_ETH_ADDRESS);
|
|
|
|
|
2020-06-20 23:40:03 +00:00
|
|
|
const isActive = await pool.getReserveIsActive(MOCK_ETH_ADDRESS);
|
2020-06-12 07:41:30 +00:00
|
|
|
expect(isActive).to.be.equal(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on deactivateReserve ", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator.connect(users[2].signer).deactivateReserve(MOCK_ETH_ADDRESS),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on activateReserve ", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator.connect(users[2].signer).activateReserve(MOCK_ETH_ADDRESS),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Freezes the ETH reserve", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.freezeReserve(MOCK_ETH_ADDRESS);
|
2020-06-20 23:40:03 +00:00
|
|
|
const isFreezed = await pool.getReserveIsFreezed(MOCK_ETH_ADDRESS);
|
2020-06-12 07:41:30 +00:00
|
|
|
expect(isFreezed).to.be.equal(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Unfreezes the ETH reserve", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.unfreezeReserve(MOCK_ETH_ADDRESS);
|
|
|
|
|
2020-06-20 23:40:03 +00:00
|
|
|
const isFreezed = await pool.getReserveIsFreezed(MOCK_ETH_ADDRESS);
|
2020-06-12 07:41:30 +00:00
|
|
|
expect(isFreezed).to.be.equal(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on freezeReserve ", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator.connect(users[2].signer).freezeReserve(MOCK_ETH_ADDRESS),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on unfreezeReserve ", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator.connect(users[2].signer).unfreezeReserve(MOCK_ETH_ADDRESS),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Deactivates the ETH reserve for borrowing", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.disableBorrowingOnReserve(MOCK_ETH_ADDRESS);
|
2020-06-20 23:40:03 +00:00
|
|
|
const isEnabled = await pool.isReserveBorrowingEnabled(MOCK_ETH_ADDRESS);
|
2020-06-12 07:41:30 +00:00
|
|
|
expect(isEnabled).to.be.equal(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Activates the ETH reserve for borrowing", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.enableBorrowingOnReserve(MOCK_ETH_ADDRESS, true);
|
2020-06-20 23:40:03 +00:00
|
|
|
const isEnabled = await pool.isReserveBorrowingEnabled(MOCK_ETH_ADDRESS);
|
|
|
|
const interestIndex = await pool.getReserveLiquidityCumulativeIndex(
|
2020-06-12 07:41:30 +00:00
|
|
|
MOCK_ETH_ADDRESS
|
|
|
|
);
|
|
|
|
expect(isEnabled).to.be.equal(true);
|
|
|
|
expect(interestIndex.toString()).to.be.equal(RAY);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on disableBorrowingOnReserve ", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.disableBorrowingOnReserve(MOCK_ETH_ADDRESS),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on enableBorrowingOnReserve ", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.enableBorrowingOnReserve(MOCK_ETH_ADDRESS, true),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Deactivates the ETH reserve as collateral", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.disableReserveAsCollateral(MOCK_ETH_ADDRESS);
|
2020-06-20 23:40:03 +00:00
|
|
|
const isEnabled = await pool.isReserveUsageAsCollateralEnabled(
|
2020-06-12 07:41:30 +00:00
|
|
|
MOCK_ETH_ADDRESS
|
|
|
|
);
|
|
|
|
expect(isEnabled).to.be.equal(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Activates the ETH reserve as collateral", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.enableReserveAsCollateral(
|
|
|
|
MOCK_ETH_ADDRESS,
|
|
|
|
"75",
|
|
|
|
"80",
|
|
|
|
"105"
|
|
|
|
);
|
|
|
|
|
2020-06-20 23:40:03 +00:00
|
|
|
const isEnabled = await pool.isReserveUsageAsCollateralEnabled(
|
2020-06-12 07:41:30 +00:00
|
|
|
MOCK_ETH_ADDRESS
|
|
|
|
);
|
|
|
|
expect(isEnabled).to.be.equal(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on disableReserveAsCollateral ", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.disableReserveAsCollateral(MOCK_ETH_ADDRESS),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on enableReserveAsCollateral ", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.enableReserveAsCollateral(MOCK_ETH_ADDRESS, "75", "80", "105"),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Disable stable borrow rate on the ETH reserve", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.disableReserveStableBorrowRate(MOCK_ETH_ADDRESS);
|
2020-06-20 23:40:03 +00:00
|
|
|
const isEnabled = await pool.getReserveIsStableBorrowRateEnabled(
|
2020-06-12 07:41:30 +00:00
|
|
|
MOCK_ETH_ADDRESS
|
|
|
|
);
|
|
|
|
expect(isEnabled).to.be.equal(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Enables stable borrow rate on the ETH reserve", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.enableReserveStableBorrowRate(MOCK_ETH_ADDRESS);
|
2020-06-20 23:40:03 +00:00
|
|
|
const isEnabled = await pool.getReserveIsStableBorrowRateEnabled(
|
2020-06-12 07:41:30 +00:00
|
|
|
MOCK_ETH_ADDRESS
|
|
|
|
);
|
|
|
|
expect(isEnabled).to.be.equal(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on disableReserveStableBorrowRate", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.disableReserveStableBorrowRate(MOCK_ETH_ADDRESS),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on enableReserveStableBorrowRate", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.enableReserveStableBorrowRate(MOCK_ETH_ADDRESS),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Changes LTV of the reserve", async () => {
|
|
|
|
const {configurator, pool} = testEnv;
|
|
|
|
await configurator.setReserveBaseLTVasCollateral(MOCK_ETH_ADDRESS, "60");
|
|
|
|
const {ltv}: any = await pool.getReserveConfigurationData(MOCK_ETH_ADDRESS);
|
|
|
|
expect(ltv).to.be.bignumber.equal("60", "Invalid LTV");
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on setReserveBaseLTVasCollateral", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.setReserveBaseLTVasCollateral(MOCK_ETH_ADDRESS, "75"),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Changes liquidation threshold of the reserve", async () => {
|
|
|
|
const {configurator, pool} = testEnv;
|
|
|
|
await configurator.setReserveLiquidationThreshold(MOCK_ETH_ADDRESS, "75");
|
|
|
|
const {liquidationThreshold}: any = await pool.getReserveConfigurationData(
|
|
|
|
MOCK_ETH_ADDRESS
|
|
|
|
);
|
|
|
|
expect(liquidationThreshold).to.be.bignumber.equal(
|
|
|
|
"75",
|
|
|
|
"Invalid Liquidation threshold"
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on setReserveLiquidationThreshold", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.setReserveLiquidationThreshold(MOCK_ETH_ADDRESS, "80"),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Changes liquidation bonus of the reserve", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {configurator, pool} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
await configurator.setReserveLiquidationBonus(MOCK_ETH_ADDRESS, "110");
|
2020-06-20 23:40:03 +00:00
|
|
|
const liquidationBonus = await pool.getReserveLiquidationBonus(
|
2020-06-12 07:41:30 +00:00
|
|
|
MOCK_ETH_ADDRESS
|
|
|
|
);
|
|
|
|
expect(liquidationBonus).to.be.bignumber.equal(
|
|
|
|
"110",
|
|
|
|
"Invalid Liquidation discount"
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on setReserveLiquidationBonus", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.setReserveLiquidationBonus(MOCK_ETH_ADDRESS, "80"),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on setReserveDecimals", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.setReserveDecimals(MOCK_ETH_ADDRESS, "80"),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Removes the last added reserve", async () => {
|
|
|
|
const {configurator, pool} = testEnv;
|
|
|
|
const reservesBefore = await pool.getReserves();
|
|
|
|
|
|
|
|
const lastReserve = reservesBefore[reservesBefore.length - 1];
|
|
|
|
|
|
|
|
await configurator.removeLastAddedReserve(lastReserve);
|
|
|
|
|
|
|
|
const reservesAfter = await pool.getReserves();
|
|
|
|
|
|
|
|
expect(reservesAfter.length).to.be.equal(
|
|
|
|
reservesBefore.length - 1,
|
|
|
|
"Invalid number of reserves after removal"
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Check the onlyLendingPoolManager on setReserveLiquidationBonus", async () => {
|
|
|
|
const {configurator, users} = testEnv;
|
|
|
|
await expect(
|
|
|
|
configurator
|
|
|
|
.connect(users[2].signer)
|
|
|
|
.setReserveLiquidationBonus(MOCK_ETH_ADDRESS, "80"),
|
2020-06-12 08:39:42 +00:00
|
|
|
INVALID_POOL_MANAGER_CALLER_MSG
|
|
|
|
).to.be.revertedWith(INVALID_POOL_MANAGER_CALLER_MSG);
|
2020-06-12 07:41:30 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it("Reverts when trying to disable the DAI reserve with liquidity on it", async () => {
|
2020-06-20 23:40:03 +00:00
|
|
|
const {dai, pool, configurator} = testEnv;
|
2020-06-12 07:41:30 +00:00
|
|
|
|
|
|
|
await dai.mint(await convertToCurrencyDecimals(dai.address, "1000"));
|
|
|
|
|
|
|
|
//approve protocol to access depositor wallet
|
2020-06-20 23:40:03 +00:00
|
|
|
await dai.approve(pool.address, APPROVAL_AMOUNT_LENDING_POOL);
|
2020-06-12 07:41:30 +00:00
|
|
|
const amountDAItoDeposit = await convertToCurrencyDecimals(
|
|
|
|
dai.address,
|
|
|
|
"1000"
|
|
|
|
);
|
|
|
|
|
|
|
|
//user 1 deposits 1000 DAI
|
|
|
|
await pool.deposit(dai.address, amountDAItoDeposit, "0");
|
|
|
|
|
|
|
|
await expect(
|
|
|
|
configurator.deactivateReserve(dai.address),
|
|
|
|
"The liquidity of the reserve needs to be 0"
|
|
|
|
).to.be.revertedWith("The liquidity of the reserve needs to be 0");
|
|
|
|
});
|
|
|
|
});
|