In unstakeAll the contract unstakes each active epoch. But it skips the current epoch, even though it would be possible to unstake that.
The comparison if (dr.epoch == 0 || currentEpoch - epoch <= lockCycle) continue; source is true for currentEpoch == epoch. Therefor the current epoch will be skipped and not unstaked.
Users might not notice that the unstakeAll does not work as indented and could think they unstaked everything. If they dont call unstake with the current epoch, the tokens would stay in the contract.
manual review
Change unstakeAll to also unstake the current epoch. For example:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.