# Accrued rewards will be lost in DistributionManager if index delta rounds down to 0

DistributionManager updates lastUpdateTimestamp even when reward index delta rounds to 0, silently forfeiting accrued rewards for depositors.

- Payout: Contest reward
- Severity: medium
- Program: Silo
- Credited: Ruhum
- Disclosed: 2025-03-19
- Write-up quality: 6/10
- Original: https://cdn.cantina.xyz/reports/cantina_competition_silo.pdf#3.2.5
- Library page: https://bugbountylibrary.com/r/cantina%3Asilo%3A3.2.5
- Tags: domain:web3 impact:funds-loss kind:contest platform:cantina sev:medium tech:solidity vuln:business-logic vuln:precision-loss vuln:reward-distribution

**Target:** DistributionManager.sol reward index accounting
**Root cause:** lastUpdateTimestamp is advanced unconditionally even when newIndex == oldIndex, so the elapsed time contributing to a sub-1 index delta is discarded instead of carried forward.
**Steps:**
1. Deploy incentive program with totalSupply 10,000,000e18 and emissionPerSecond 1e5
2. Warp 12s and call `claimRewards(address(this))`; index delta = 1e5*1e18*12/10,000,000e18 = 0.12 → rounds to 0
3. Repeat 100 times; assert `details.index == 0` despite elapsed time
4. Observe lastUpdateTimestamp advanced each call, so accrued rewards never distributed
**How found:** Code reading of the index update path: noticed timestamp updated regardless of whether index actually changed, then constructed a supply/emission ratio where per-interval delta rounds below 1.
**Insight:** In reward-index accumulators, check whether the timestamp/checkpoint advances when the computed index delta truncates to zero — large totalSupply relative to emissionPerSecond makes every interval round away.
