From 162c7924a9da6f53643eb3917aa62957bfd3a83d Mon Sep 17 00:00:00 2001 From: The3D Date: Mon, 14 Sep 2020 09:33:53 +0200 Subject: [PATCH] Added index to mint and burn of variableDebtToken --- contracts/lendingpool/LendingPool.sol | 58 ++++++++++--------- contracts/tokenization/VariableDebtToken.sol | 12 ++-- .../interfaces/IVariableDebtToken.sol | 6 +- 3 files changed, 39 insertions(+), 37 deletions(-) diff --git a/contracts/lendingpool/LendingPool.sol b/contracts/lendingpool/LendingPool.sol index 453b9ac2..34d8e1aa 100644 --- a/contracts/lendingpool/LendingPool.sol +++ b/contracts/lendingpool/LendingPool.sol @@ -26,6 +26,7 @@ import {LendingPoolLiquidationManager} from './LendingPoolLiquidationManager.sol import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/SafeERC20.sol'; import {ILendingPool} from '../interfaces/ILendingPool.sol'; + /** * @title LendingPool contract * @notice Implements the actions of the LendingPool, and exposes accessory methods to fetch the users and reserve data @@ -238,14 +239,17 @@ contract LendingPool is VersionedInitializable, ILendingPool { reserve.updateCumulativeIndexesAndTimestamp(); - address debtTokenAddress = interestRateMode == ReserveLogic.InterestRateMode.STABLE ? reserve.stableDebtTokenAddress : reserve.variableDebtTokenAddress; + address debtTokenAddress = interestRateMode == ReserveLogic.InterestRateMode.STABLE + ? reserve.stableDebtTokenAddress + : reserve.variableDebtTokenAddress; + _mintToReserveTreasury(reserve, onBehalfOf, debtTokenAddress); //burns an equivalent amount of debt tokens if (interestRateMode == ReserveLogic.InterestRateMode.STABLE) { IStableDebtToken(reserve.stableDebtTokenAddress).burn(onBehalfOf, paybackAmount); } else { - IVariableDebtToken(reserve.variableDebtTokenAddress).burn(onBehalfOf, paybackAmount); + IVariableDebtToken(reserve.variableDebtTokenAddress).burn(onBehalfOf, paybackAmount, reserve.variableBorrowIndex); } address aToken = reserve.aTokenAddress; @@ -282,10 +286,12 @@ contract LendingPool is VersionedInitializable, ILendingPool { reserve.updateCumulativeIndexesAndTimestamp(); - address debtTokenAddress = interestRateMode == ReserveLogic.InterestRateMode.STABLE ? reserve.stableDebtTokenAddress : reserve.variableDebtTokenAddress; + address debtTokenAddress = interestRateMode == ReserveLogic.InterestRateMode.STABLE + ? reserve.stableDebtTokenAddress + : reserve.variableDebtTokenAddress; + _mintToReserveTreasury(reserve, msg.sender, debtTokenAddress); - if (interestRateMode == ReserveLogic.InterestRateMode.STABLE) { //burn stable rate tokens, mint variable rate tokens IStableDebtToken(reserve.stableDebtTokenAddress).burn(msg.sender, stableDebt); @@ -344,7 +350,6 @@ contract LendingPool is VersionedInitializable, ILendingPool { _mintToReserveTreasury(reserve, user, address(stableDebtToken)); - stableDebtToken.burn(user, stableBorrowBalance); stableDebtToken.mint(user, stableBorrowBalance, reserve.currentStableBorrowRate); @@ -779,7 +784,6 @@ contract LendingPool is VersionedInitializable, ILendingPool { * @param vars Input struct for the borrowing action, in order to avoid STD errors **/ function _executeBorrow(ExecuteBorrowParams memory vars) internal { - ReserveLogic.ReserveData storage reserve = _reserves[vars.asset]; UserConfiguration.Map storage userConfig = _usersConfig[msg.sender]; @@ -807,16 +811,15 @@ contract LendingPool is VersionedInitializable, ILendingPool { userConfig.setBorrowing(reserveId, true); } - address debtTokenAddress = ReserveLogic.InterestRateMode(vars.interestRateMode) == ReserveLogic.InterestRateMode.STABLE ? - reserve.stableDebtTokenAddress - : - reserve.variableDebtTokenAddress; - - - reserve.updateCumulativeIndexesAndTimestamp(); + address debtTokenAddress = ReserveLogic.InterestRateMode(vars.interestRateMode) == + ReserveLogic.InterestRateMode.STABLE + ? reserve.stableDebtTokenAddress + : reserve.variableDebtTokenAddress; _mintToReserveTreasury(reserve, vars.user, debtTokenAddress); + reserve.updateCumulativeIndexesAndTimestamp(); + //caching the current stable borrow rate uint256 currentStableRate = 0; @@ -825,13 +828,9 @@ contract LendingPool is VersionedInitializable, ILendingPool { ) { currentStableRate = reserve.currentStableBorrowRate; - IStableDebtToken(debtTokenAddress).mint( - vars.user, - vars.amount, - currentStableRate - ); + IStableDebtToken(debtTokenAddress).mint(vars.user, vars.amount, currentStableRate); } else { - IVariableDebtToken(debtTokenAddress).mint(vars.user, vars.amount); + IVariableDebtToken(debtTokenAddress).mint(vars.user, vars.amount, reserve.variableBorrowIndex); } reserve.updateInterestRates( @@ -933,23 +932,26 @@ contract LendingPool is VersionedInitializable, ILendingPool { return _addressesProvider; } - function _mintToReserveTreasury(ReserveLogic.ReserveData storage reserve, address user, address debtTokenAddress) internal { - + function _mintToReserveTreasury( + ReserveLogic.ReserveData storage reserve, + address user, + address debtTokenAddress + ) internal { uint256 reserveFactor = reserve.configuration.getReserveFactor(); - if(reserveFactor == 0) { + if (reserveFactor == 0) { return; } uint256 currentPrincipalBalance = DebtTokenBase(debtTokenAddress).principalBalanceOf(user); //calculating the interest accrued since the last borrow and minting the equivalent amount to the reserve factor - if(currentPrincipalBalance > 0){ - - uint256 balanceIncrease = IERC20(debtTokenAddress).balanceOf(user).sub(currentPrincipalBalance); + if (currentPrincipalBalance > 0) { + uint256 balanceIncrease = IERC20(debtTokenAddress).balanceOf(user).sub( + currentPrincipalBalance + ); uint256 amountForReserveFactor = balanceIncrease.percentMul(reserveFactor); - IAToken(reserve.aTokenAddress).mintToReserve(amountForReserveFactor); - } - + IAToken(reserve.aTokenAddress).mintToReserve(amountForReserveFactor); + } } } diff --git a/contracts/tokenization/VariableDebtToken.sol b/contracts/tokenization/VariableDebtToken.sol index 9bdff0e7..b43cbec4 100644 --- a/contracts/tokenization/VariableDebtToken.sol +++ b/contracts/tokenization/VariableDebtToken.sol @@ -54,23 +54,21 @@ contract VariableDebtToken is DebtTokenBase, IVariableDebtToken { * @dev mints new variable debt * @param user the user receiving the debt * @param amount the amount of debt being minted + * @param index the variable debt index of the reserve **/ - function mint(address user, uint256 amount) external override onlyLendingPool { - - uint256 index = POOL.getReserveNormalizedVariableDebt(UNDERLYING_ASSET); + function mint(address user, uint256 amount, uint256 index) external override onlyLendingPool { _mint(user, amount.rayDiv(index)); + emit MintDebt(user, amount, index); } /** * @dev burns user variable debt * @param user the user which debt is burnt - * @param amount the amount of debt being burned + * @param index the variable debt index of the reserve **/ - function burn(address user, uint256 amount) external override onlyLendingPool { - - uint256 index = POOL.getReserveNormalizedVariableDebt(UNDERLYING_ASSET); + function burn(address user, uint256 amount, uint256 index) external override onlyLendingPool { _burn(user, amount.rayDiv(index)); _userIndexes[user] = index; emit BurnDebt(user, amount, index); diff --git a/contracts/tokenization/interfaces/IVariableDebtToken.sol b/contracts/tokenization/interfaces/IVariableDebtToken.sol index 01b2aaca..3d26ed6e 100644 --- a/contracts/tokenization/interfaces/IVariableDebtToken.sol +++ b/contracts/tokenization/interfaces/IVariableDebtToken.sol @@ -36,15 +36,17 @@ interface IVariableDebtToken { * @dev mints new variable debt * @param user the user receiving the debt * @param amount the amount of debt being minted + * @param index the variable debt index of the reserve **/ - function mint(address user, uint256 amount) external; + function mint(address user, uint256 amount, uint256 index) external; /** * @dev burns user variable debt * @param user the user which debt is burnt * @param amount the amount of debt being burned + * @param index the variable debt index of the reserve **/ - function burn(address user, uint256 amount) external; + function burn(address user, uint256 amount, uint256 index) external; /** * @dev returns the scaled balance of the variable debt token