Opus finding
StreamableFeesLocker.distributeFees state inconsistency when position.isUnlocked is set in memory but written to storage; releasing fees after unlock is impossible because position record stays
lowbugmedium
- src/StreamableFeesLocker.sol:208-225
After unlock, the position is transferred away but `positions[tokenId]` retains data with `isUnlocked=true`. `releaseFees` only checks `position.startDate != 0` (not `isUnlocked`), so beneficiaries can still call releaseFees and the contract will attempt to call `positionManager.getPoolAndPositionInfo(tokenId)` — fine, beneficiaries can still claim accrued residual fees recorded in `beneficiariesClaims`. This is intentional. Not a bug.
Recommendation
N/A