The function _calculate_vested_amount () doesn't check vesting end time is greater than start time.
See comments below (offending line)
If the contract is deployed with a vesting_end_time that is equal to or less than vesting_start_time, this subtraction would underflow or yield zero. In the case where (vesting_duration equals zero), the subsequent division in the linear vesting calculation would revert (or behave unpredictably).
Since the vested amount that is returned is wrong, all calculations that rely on it will be wrong in the above scenario (eg transfer func).
Manual review.
Put a check in the constructor to ensure that vesting_end_time > vesting_start_time.
The `_calculate_vested_amount` function is called in ` claim` and `claimable_amount` functions. There is a check that ensures the `block.timestamp` is greater or equal to the `vesting_start_time` in the both functions. Also, the admin sets the start and end time of the vesting. This means it will be always correct. Therefore, there is no risk from underflow or division by zero in `_calculate_vested_amount` function.
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.