Vulnerability: Treasury rebalance will fail due to interest accrual
Severity: medium

Description:
If Compound has updated their interest rate model, then Notional will calculate the before total underlying token balance without accruing interest. If this exceeds `Constants.REBALANCING_UNDERLYING_DELTA`, then rebalance execution will revert.\\nThe `TreasuryAction._executeRebalance()` function will revert on a specific edge case where `oracle.getTotalUnderlyingValueStateful()` does not accrue interest before calculating the value of the treasury's `cToken` holdings.\\n```\\nFile: TreasuryAction.sol\\n    function _executeRebalance(uint16 currencyId) private {\\n        IPrimeCashHoldingsOracle oracle = PrimeCashExchangeRate.getPrimeCashHoldingsOracle(currencyId);\\n        uint8[] memory rebalancingTargets = _getRebalancingTargets(currencyId, oracle.holdings());\\n        (RebalancingData memory data) = REBALANCING_STRATEGY.calculateRebalance(oracle, rebalancingTargets);\\n\\n        (/* */, uint256 totalUnderlyingValueBefore) = oracle.getTotalUnderlyingValueStateful();\\n\\n        // Process redemptions first\\n        Token memory underlyingToken = TokenHandler.getUnderlyingToken(currencyId);\\n        TokenHandler.executeMoneyMarketRedemptions(underlyingToken, data.redeemData);\\n\\n        // Process deposits\\n        _executeDeposits(underlyingToken, data.depositData);\\n\\n        (/* */, uint256 totalUnderlyingValueAfter) = oracle.getTotalUnderlyingValueStateful();\\n\\n        int256 underlyingDelta = totalUnderlyingValueBefore.toInt().sub(totalUnderlyingValueAfter.toInt());\\n        require(underlyingDelta.abs() < Constants.REBALANCING_UNDERLYING_DELTA);\\n    }\\n```\\n\\n`cTokenAggregator.getExchangeRateView()` returns the exchange rate which is used to calculate the underlying value of `cToken` holdings in two ways:\\nIf the interest rate model is unchanged, then we correctly accrue interest by calculating it without mutating state.\\nIf the interest rate model HAS changed, then we query `cToken.exchangeRateStored()` which DOES NOT accrue interest.\\n```\\nFile: cTokenAggregator.sol\\n    function getExchangeRateView() external view override returns (int256) {\\n        // Return stored exchange rate if interest rate model is updated.\\n        // This prevents the function from returning incorrect exchange rates\\n        uint256 exchangeRate = cToken.interestRateModel() == INTEREST_RATE_MODEL\\n            ? _viewExchangeRate()\\n            : cToken.exchangeRateStored();\\n        _checkExchangeRate(exchangeRate);\\n\\n        return int256(exchangeRate);\\n    }\\n```\\n\\nTherefore, if the interest rate model has changed, `totalUnderlyingValueBefore` will not include any accrued interest and `totalUnderlyingValueAfter` will include all accrued interest. As a result, it is likely that the delta between these two amounts will exceed `Constants.REBALANCING_UNDERLYING_DELTA`, causing the rebalance to ultimately revert.\\nIt does not really make sense to not accrue interest if the interest rate model has changed unless we want to avoid any drastic changes to Notional's underlying protocol. Then we may want to explicitly revert here instead of allowing the rebalance function to still execute.

Impact:
The treasury manager is unable to rebalance currencies across protocols and therefore it is likely that most funds become under-utilised as a result.

Recommended mitigation:
Ensure this is well-understand and consider accruing interest under any circumstance. Alternatively, if we do not wish to accrue interest when the interest rate model has changed, then we need to make sure that `underlyingDelta` does not include this amount as `TreasuryAction._executeDeposits()` will ultimately update the vault's position in Compound.