Skip to content

Commit

Permalink
Merge pull request #362 from aave/fix/361-missing-isolation-total-deb…
Browse files Browse the repository at this point in the history
…t-event

fix: Add isolation mode total debt event
  • Loading branch information
The-3D authored Dec 17, 2021
2 parents 6a25662 + 5ffeecd commit 6d29cd3
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 15 deletions.
7 changes: 7 additions & 0 deletions contracts/interfaces/IPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@ interface IPool {
**/
event Swap(address indexed reserve, address indexed user, uint256 rateMode);

/**
* @notice Emitted on borrow(), repay() and liquidationCall() when using isolated assets
* @param asset The address of the underlying asset of the reserve
* @param totalDebt The total isolation mode debt for the reserve
*/
event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt);

/**
* @notice Emitted on setUserUseReserveAsCollateral()
* @param reserve The address of the underlying asset of the reserve
Expand Down
8 changes: 7 additions & 1 deletion contracts/protocol/libraries/logic/BorrowLogic.sol
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ library BorrowLogic {

event RebalanceStableBorrowRate(address indexed reserve, address indexed user);
event Swap(address indexed reserve, address indexed user, uint256 rateMode);
event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt);

/**
* @notice Implements the borrow feature. Borrowing allows users that provided collateral to draw liquidity from the
Expand Down Expand Up @@ -124,12 +125,17 @@ library BorrowLogic {
}

if (isolationModeActive) {
reserves[isolationModeCollateralAddress].isolationModeTotalDebt += Helpers.castUint128(
uint256 nextIsolationModeTotalDebt = reserves[isolationModeCollateralAddress]
.isolationModeTotalDebt += Helpers.castUint128(
params.amount /
10 **
(reserveCache.reserveConfiguration.getDecimals() -
ReserveConfiguration.DEBT_CEILING_DECIMALS)
);
emit IsolationModeTotalDebtUpdated(
isolationModeCollateralAddress,
nextIsolationModeTotalDebt
);
}

reserve.updateInterestRates(
Expand Down
13 changes: 10 additions & 3 deletions contracts/protocol/libraries/logic/IsolationModeLogic.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ library IsolationModeLogic {
using ReserveConfiguration for DataTypes.ReserveConfigurationMap;
using UserConfiguration for DataTypes.UserConfigurationMap;

// See `IPool` for descriptions
event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt);

/**
* @notice updated the isolated debt whenever a position collateralized by an isolated asset is repaid or liquidated
* @param reserves The state of all the reserves
Expand Down Expand Up @@ -47,10 +50,14 @@ library IsolationModeLogic {
// since the debt ceiling does not take into account the interest accrued, it might happen that amount repaid > debt in isolation mode
if (isolationModeTotalDebt <= isolatedDebtRepaid) {
reserves[isolationModeCollateralAddress].isolationModeTotalDebt = 0;
emit IsolationModeTotalDebtUpdated(isolationModeCollateralAddress, 0);
} else {
reserves[isolationModeCollateralAddress].isolationModeTotalDebt =
isolationModeTotalDebt -
isolatedDebtRepaid;
uint256 nextIsolationModeTotalDebt = reserves[isolationModeCollateralAddress]
.isolationModeTotalDebt = isolationModeTotalDebt - isolatedDebtRepaid;
emit IsolationModeTotalDebtUpdated(
isolationModeCollateralAddress,
nextIsolationModeTotalDebt
);
}
}
}
Expand Down
36 changes: 25 additions & 11 deletions test-suites/isolation-mode.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,11 @@ makeSuite('Isolation mode', (testEnv: TestEnv) => {
const { dai, aave, users, pool } = testEnv;

const borrowAmount = utils.parseEther('10');
await pool.connect(users[1].signer).borrow(dai.address, borrowAmount, '2', 0, users[1].address);
await expect(
pool.connect(users[1].signer).borrow(dai.address, borrowAmount, '2', 0, users[1].address)
)
.to.emit(pool, 'IsolationModeTotalDebtUpdated')
.withArgs(aave.address, 1000);

const reserveData = await pool.getReserveData(aave.address);

Expand All @@ -238,8 +242,11 @@ makeSuite('Isolation mode', (testEnv: TestEnv) => {
await pool.connect(users[3].signer).supply(aave.address, aaveAmount, users[3].address, 0);

const borrowAmount = utils.parseEther('10');
await pool.connect(users[3].signer).borrow(dai.address, borrowAmount, '2', 0, users[3].address);

await expect(
pool.connect(users[3].signer).borrow(dai.address, borrowAmount, '2', 0, users[3].address)
)
.to.emit(pool, 'IsolationModeTotalDebtUpdated')
.withArgs(aave.address, 2000);
const reserveData = await pool.getReserveData(aave.address);

expect(reserveData.isolationModeTotalDebt).to.be.eq('2000');
Expand Down Expand Up @@ -273,8 +280,11 @@ makeSuite('Isolation mode', (testEnv: TestEnv) => {
await dai.connect(users[1].signer)['mint(uint256)'](mintAmount);
await dai.connect(users[1].signer).approve(pool.address, MAX_UINT_AMOUNT);

await pool.connect(users[1].signer).repay(dai.address, MAX_UINT_AMOUNT, '2', users[1].address);

await expect(
pool.connect(users[1].signer).repay(dai.address, MAX_UINT_AMOUNT, '2', users[1].address)
)
.to.emit(pool, 'IsolationModeTotalDebtUpdated')
.withArgs(aave.address, 0);
const reserveData = await pool.getReserveData(aave.address);

expect(reserveData.isolationModeTotalDebt).to.be.eq('0');
Expand Down Expand Up @@ -328,16 +338,20 @@ makeSuite('Isolation mode', (testEnv: TestEnv) => {

const isolationModeTotalDebtBefore = (await pool.getReserveData(aave.address))
.isolationModeTotalDebt;
const expectedAmountAfter = isolationModeTotalDebtBefore.sub(
borrowAmount.div(2).div(BigNumber.from(10).pow(16))
);

await pool
.connect(liquidator.signer)
.liquidationCall(aave.address, dai.address, borrower.address, borrowAmount.div(2), false);
await expect(
pool
.connect(liquidator.signer)
.liquidationCall(aave.address, dai.address, borrower.address, borrowAmount.div(2), false)
)
.to.emit(pool, 'IsolationModeTotalDebtUpdated')
.withArgs(aave.address, expectedAmountAfter);

const isolationModeTotalDebtAfter = (await pool.getReserveData(aave.address))
.isolationModeTotalDebt;
const expectedAmountAfter = isolationModeTotalDebtBefore.sub(
borrowAmount.div(2).div(BigNumber.from(10).pow(16))
);

expect(isolationModeTotalDebtAfter).to.be.eq(expectedAmountAfter);
});
Expand Down

0 comments on commit 6d29cd3

Please sign in to comment.