# Vault's `totalStrategyTokenGlobal` will not be in sync

Rounding to zero in _convertStrategyTokensToBPTClaim makes _redeem early-return without decrementing totalStrategyTokenGlobal, desyncing vault accounting from Notional's totalStrategyTokens.

- Payout: Contest reward
- Severity: high
- Program: Notional
- Credited: xiaoming90
- Disclosed: 2022-12-20
- Write-up quality: 7/10
- Original: https://github.com/sherlock-audit/2022-12-notional-judging/issues/15
- Library page: https://bugbountylibrary.com/r/sherlock%3A2022-12-notional%3AH-4
- Tags: domain:web3 impact:funds-loss kind:contest platform:sherlock sev:high tech:evm tech:solidity technique:source-review vuln:accounting-error vuln:precision-loss

**Target:** Balancer strategy vault (TwoToken/Boosted3Token) redeem path
**Root cause:** _convertStrategyTokensToBPTClaim floors (strategyTokenAmount * totalBPTHeld) / totalStrategyTokenGlobal to zero for tiny amounts; _redeem returns early on bptClaim==0 before subtracting strategyTokens from totalStrategyTokenGlobal, while Notional still subtracts from its own totalStrategyTokens.
**Steps:**
1. Call redeemFromNotional with a very small strategyTokens amount such that strategyTokens * totalBPTHeld < totalStrategyTokenGlobal
2. _convertStrategyTokensToBPTClaim returns bptClaim = 0
3. _redeem hits `if (bptClaim == 0) return 0;` and skips `totalStrategyTokenGlobal -= strategyTokens`
4. Notional's VaultAction._redeemStrategyTokensToCashInternal still does `totalStrategyTokens.sub(strategyTokensToRedeem)`
5. Repeat to accumulate divergence between vault totalStrategyTokenGlobal and Notional totalStrategyTokens
**How found:** Code review of the redeem path: noticed the early return on bptClaim==0 in _redeem and traced that the caller (redeemFromNotional) and Notional's VaultAction both treat the redemption as complete, while the vault-side accounting decrement is skipped.
**Exploitation:** Repeated small redemptions inflate vault-side totalStrategyTokenGlobal relative to actual tokens; since it feeds _convertStrategyTokensToBPTClaim/_convertBPTClaimToStrategyTokens/_getBPTHeldInMaturity used in deposit/redeem, users receive inaccurate strategy token or asset amounts (over/under).
**Insight:** When a conversion helper floors to zero, check every early-return branch that skips state updates the external caller still assumes happened; cross-contract mirrored accounting (vault vs Notional totalStrategyTokens) is where desyncs hide.
