MEDIUM severity: The `totalStrategyTokenGlobal` variable in the `strategyContext.vaultState` tracks the total number . The `totalStrategyTokenGlobal` variable in the `strategyContext.vaultState` tracks the total number of strategy tokens held in the vault. However, this variable is not updated correctly when a small number of strategy tokens are redeemed. This can lead to accounting issues within the vault.\n\nThe `...

Vulnerable code:
```\nFile: StrategyUtils.sol\n\nfunction _convertStrategyTokensToBPTClaim(\n    StrategyContext memory context,\n    uint256 strategyTokenAmount\n) internal pure returns (uint256 bptClaim) {\n    require(strategyTokenAmount <= context.vaultState.totalStrategyTokenGlobal);\n    if (context.vaultState.totalStrategyTokenGlobal > 0) {\n        bptClaim = (strategyTokenAmount * context.vaultState.totalBPTHeld) / context.vaultState.totalStrategyTokenGlobal;\n    }\n}\n```\n```\nFile: Boosted3TokenPoolUtils.sol\n\nfunction _redeem(\n    ThreeTokenPoolContext memory poolContext,\n    StrategyContext memory strategyContext,\n    AuraStakingContext memory stakingContext,\n    uint256 strategyTokens,\n    uint256 minPrimary\n) internal returns (uint256 finalPrimaryBalance) {\n    uint256 bptClaim = strategyContext._convertStrategyTokensToBPTClaim(strategyTokens);\n\n    if (bptClaim == 0) {\n        return 0;\n    }\n\n    finalPrimaryBalance = _unstakeAndExitPool({\n        stakingContext: stakingContext,\n        poolContext: poolContext,\n        bptClaim: bptClaim,\n        minPrimary: minPrimary\n    });\n\n    strategyContext.vaultState.totalBPTHeld -= bptClaim;\n    strategyContext.vaultState.totalStrategyTokenGlobal -= uint256(strategyTokens);\n    strategyContext.vaultState.setStrategyVaultState();\n```\n```\nFile: BaseStrategyVault.sol\n\nfunction redeemFromNotional(\n    address account,\n    address receiver,\n    uint256 strategyTokens,\n    uint256 maturity,\n    uint256 underlyingToRepayDebt,\n    bytes calldata data\n) external onlyNotional returns (uint256 transferToReceiver) {\n    uint256 borrowedCurrencyAmount = _redeemFromNotional(account, strategyTokens, maturity, data);\n\n    uint256 transferToNotional;\n    if (account == address(this) || borrowedCurrencyAmount <= underlyingToRepayDebt) {\n        transferToNotional = borrowedCurrencyAmount;\n    } else {\n        transferToNotional = underlyingToRepayDebt;\n        unchecked {\n            transferToReceiver = borrowedCurrencyAmount - underlyingToRepayDebt;\n        }\n    }\n\n    if (_UNDERLYING_IS_ETH) {\n        if (transferToReceiver > 0) payable(receiver).transfer(transferToReceiver);\n        if (transferToNotional > 0) payable(address(NOTIONAL)).transfer(transferToNotional);\n    } else {\n        if (transferToReceiver > 0) _UNDERLYING_TOKEN.checkTransfer(receiver, transferToReceiver);\n        if (transferToNotional > 0) _UNDERLYING_TOKEN.checkTransfer(address(NOTIONAL), transferToNotional);\n    }\n}\n```\n```\nFile: VaultAction.sol\n\n@notice Redeems strategy tokens to cash\nfunction _redeemStrategyTokensToCashInternal(\n    VaultConfig memory vaultConfig,\n    uint256 maturity,\n    uint256 strategyTokensToRedeem,\n    bytes calldata vaultData\n) private nonReentrant returns (int256 assetCashRequiredToSettle, int256 underlyingCashRequiredToSettle) {\n    if (vaultConfig.getFlag(VaultConfiguration.ALLOW_REENTRANCY)) {\n        reentrancyStatus = _NOT_ENTERED;\n    }\n\n    VaultState memory vaultState = VaultStateLib.getVaultState(vaultConfig.vault, maturity);\n    (int256 assetCashReceived, uint256 underlyingToReceiver) = vaultConfig.redeemWithoutDebtRepayment(\n        vaultConfig.vault,\n        strategyTokensToRedeem,\n        maturity,\n        vaultData\n    );\n    require(assetCashReceived > 0);\n    require(underlyingToReceiver == 0);\n\n    vaultState.totalAssetCash = vaultState.totalAssetCash.add(uint256(assetCashReceived));\n    vaultState.totalStrategyTokens = vaultState.totalStrategyTokens.sub(strategyTokensToRedeem);\n    vaultState.setVaultState(vaultConfig.vault);\n\n    emit VaultRedeemStrategyToken(vaultConfig.vault, maturity, assetCashReceived, strategyTokensToRedeem);\n    return _getCashRequiredToSettle(vaultConfig, vaultState, maturity);\n}\n```\n```\nFile: Boosted3TokenPoolUtils.sol\n\nfunction _redeem(\n    ThreeTokenPoolContext memory poolContext,\n    StrategyContext memory strategyContext,\n    AuraStakingContext memory stakingContext,\n    uint256 strategyTokens,\n    uint256 minPrimary\n) internal returns (uint256 finalPrimaryBalance) {\n    uint256 bptClaim = strategyContext._convertStrategyTokensToBPTClaim(strategyTokens);\n\n    if (bptClaim == 0) {\n        return 0;\n    }\n\n    finalPrimaryBalance = _unstakeAndExitPool({\n        stakingContext: stakingContext,\n        poolContext: poolContext,\n        bptClaim: bptClaim,\n        minPrimary: minPrimary\n    });\n\n    strategyContext.vaultState.totalBPTHeld -= bptClaim;\n    strategyContext.vaultState.totalStrategyTokenGlobal -= uint256(strategyTokens);\n    strategyContext.vaultState.setStrategyVaultState();\n```