diff --git a/contracts/tokenization/AToken.sol b/contracts/tokenization/AToken.sol index 5f308d76..e0e874d7 100644 --- a/contracts/tokenization/AToken.sol +++ b/contracts/tokenization/AToken.sol @@ -201,7 +201,7 @@ contract AToken is VersionedInitializable, ERC20, IAToken { if (currentScaledBalance == 0 && redirectedBalance == 0) { return 0; } - uint256 scaledRedirectedBalance = redirectedBalance > 0 ? redirectedBalance.rayDiv(_interestRedirectionIndexes[user]) : 0; + uint256 scaledRedirectedBalance = redirectedBalance > 0 ? redirectedBalance.rayDiv(_redirectedBalanceIndexes[user]) : 0; uint256 index = _pool.getReserveNormalizedIncome(UNDERLYING_ASSET_ADDRESS); @@ -340,6 +340,8 @@ contract AToken is VersionedInitializable, ERC20, IAToken { _updateRedirectedBalanceOfRedirectionAddress(origin, redirectionAddress, 0, 0, index); } + console.log("Interest redirection completed"); + emit RedirectedBalanceUpdated( redirectionAddress, scaledBalanceToAdd, @@ -454,6 +456,10 @@ contract AToken is VersionedInitializable, ERC20, IAToken { //being transferred _updateRedirectedBalanceOfRedirectionAddress(to, to, scaledAmount, 0, index); + if(scaledBalanceOf(from) == 0){ + _resetDataOnZeroBalance(from); + } + emit BalanceTransfer(from, to, amount, index); } diff --git a/test/helpers/utils/calculations.ts b/test/helpers/utils/calculations.ts index c45ad951..14a3a1f5 100644 --- a/test/helpers/utils/calculations.ts +++ b/test/helpers/utils/calculations.ts @@ -50,8 +50,8 @@ export const calcExpectedUserDataAfterDeposit = ( expectedUserData.liquidityRate = reserveDataAfterAction.liquidityRate; expectedUserData.scaledATokenBalance = calcExpectedScaledATokenBalance( - reserveDataAfterAction, userDataBeforeAction, + reserveDataAfterAction.liquidityIndex, new BigNumber(amountDeposited), new BigNumber(0) ); @@ -89,8 +89,8 @@ export const calcExpectedUserDataAfterDeposit = ( ); expectedUserData.redirectionAddressRedirectedBalance = calcExpectedRedirectedBalance( - userDataBeforeAction, expectedUserData, + reserveDataAfterAction.liquidityIndex, userDataBeforeAction.redirectionAddressRedirectedBalance, new BigNumber(amountDeposited), new BigNumber(0) @@ -121,8 +121,8 @@ export const calcExpectedUserDataAfterWithdraw = ( } expectedUserData.scaledATokenBalance = calcExpectedScaledATokenBalance( - reserveDataAfterAction, userDataBeforeAction, + reserveDataAfterAction.liquidityIndex, new BigNumber(0), new BigNumber(amountWithdrawn) ); @@ -175,8 +175,8 @@ export const calcExpectedUserDataAfterWithdraw = ( } expectedUserData.redirectionAddressRedirectedBalance = calcExpectedRedirectedBalance( - userDataBeforeAction, expectedUserData, + reserveDataAfterAction.liquidityIndex, userDataBeforeAction.redirectionAddressRedirectedBalance, new BigNumber(0), new BigNumber(amountWithdrawn) @@ -900,6 +900,7 @@ export const calcExpectedReserveDataAfterStableRateRebalance = ( expectedReserveData.totalBorrowsVariable, expectedReserveData.averageStableBorrowRate ); + expectedReserveData.liquidityRate = rates[0]; expectedReserveData.stableBorrowRate = rates[1]; @@ -941,10 +942,6 @@ export const calcExpectedUserDataAfterStableRateRebalance = ( expectedUserData.principalVariableDebt = userDataBeforeAction.principalVariableDebt; - const debtAccrued = expectedUserData.currentStableDebt.minus( - userDataBeforeAction.principalStableDebt - ); - expectedUserData.stableBorrowRate = reserveDataBeforeAction.stableBorrowRate; expectedUserData.liquidityRate = expectedDataAfterAction.liquidityRate; @@ -971,6 +968,8 @@ export const calcExpectedUsersDataAfterRedirectInterest = ( const expectedFromData = { ...fromDataBeforeAction }; const expectedToData = { ...toDataBeforeAction }; + const index = calcExpectedReserveNormalizedIncome(reserveDataBeforeAction, txTimestamp); + expectedFromData.currentStableDebt = calcExpectedStableDebtTokenBalance( fromDataBeforeAction, txTimestamp @@ -988,20 +987,17 @@ export const calcExpectedUsersDataAfterRedirectInterest = ( expectedFromData.stableBorrowRate = fromDataBeforeAction.stableBorrowRate; expectedToData.stableBorrowRate = toDataBeforeAction.stableBorrowRate; - expectedFromData.scaledATokenBalance = expectedFromData.currentATokenBalance = calcExpectedATokenBalance( + expectedFromData.scaledATokenBalance = fromDataBeforeAction.scaledATokenBalance; + + expectedFromData.currentATokenBalance = calcExpectedATokenBalance( reserveDataBeforeAction, fromDataBeforeAction, txTimestamp ); - expectedToData.principalATokenBalance = expectedToData.currentATokenBalance = calcExpectedATokenBalance( - reserveDataBeforeAction, - toDataBeforeAction, - txTimestamp - ); expectedToData.redirectedBalance = toDataBeforeAction.redirectedBalance.plus( - expectedFromData.currentATokenBalance + expectedFromData.currentATokenBalance.rayDiv(index) ); if (fromAddress === toAddress) { @@ -1013,10 +1009,11 @@ export const calcExpectedUsersDataAfterRedirectInterest = ( expectedToData.redirectionAddressRedirectedBalance = new BigNumber(0); } else { expectedFromData.interestRedirectionAddress = toAddress; + expectedFromData.interestRedirectionIndex = index; expectedFromData.redirectionAddressRedirectedBalance = calcExpectedRedirectedBalance( - toDataBeforeAction, expectedFromData, + index, toDataBeforeAction.redirectedBalance, expectedFromData.currentATokenBalance, new BigNumber(0) @@ -1027,14 +1024,14 @@ export const calcExpectedUsersDataAfterRedirectInterest = ( }; const calcExpectedScaledATokenBalance = ( - reserveDataAfterAction: ReserveData, userDataBeforeAction: UserReserveData, + index: BigNumber, amountAdded: BigNumber, amountTaken: BigNumber ) => { return userDataBeforeAction.scaledATokenBalance - .plus(amountAdded.rayDiv(reserveDataAfterAction.liquidityIndex)) - .minus(amountTaken.rayDiv(reserveDataAfterAction.liquidityIndex)); + .plus(amountAdded.rayDiv(index)) + .minus(amountTaken.rayDiv(index)); }; const calcExpectedATokenBalance = ( @@ -1065,14 +1062,14 @@ const calcExpectedATokenBalance = ( }; const calcExpectedRedirectedBalance = ( - userDataBeforeAction: UserReserveData, expectedUserDataAfterAction: UserReserveData, + index: BigNumber, redirectedBalanceBefore: BigNumber, amountToAdd: BigNumber, amountToSubstract: BigNumber ): BigNumber => { return expectedUserDataAfterAction.interestRedirectionAddress !== ZERO_ADDRESS - ? redirectedBalanceBefore.plus(amountToAdd).minus(amountToSubstract) + ? redirectedBalanceBefore.plus(amountToAdd.rayDiv(index)).minus(amountToSubstract.rayDiv(index)) : new BigNumber('0'); }; const calcExpectedAverageStableBorrowRate = ( diff --git a/test/scenario.spec.ts b/test/scenario.spec.ts index 025bc720..bc295986 100644 --- a/test/scenario.spec.ts +++ b/test/scenario.spec.ts @@ -12,7 +12,7 @@ BigNumber.config({DECIMAL_PLACES: 0, ROUNDING_MODE: BigNumber.ROUND_DOWN}); const scenarioFolder = './test/helpers/scenarios/'; -const selectedScenarios: string[] = ['']; +const selectedScenarios: string[] = ['interest-redirection.json']; fs.readdirSync(scenarioFolder).forEach((file) => { if (selectedScenarios.length > 0 && !selectedScenarios.includes(file)) return;