The RAACReleaseOrchestrator
contract comes with a createVestingSchedule()
function that allows for creating vesting schedules. The creation of such schedules performs no validity checks on the vesting schedule's startTime
, allowing for creating vesting schedules that started in the past, which can effectively bypass the vesting cliff of 90 days.
Taking a look at RAACReleaseOrchestrator#createVestingSchedule
, we see that it expects a startTime
for the vesting schedule to be created:
This startTime
is set to determine when the vesting schedule has started, or will start. Later, when accounts try to release their RAACToken
from the allocation, this value is used to check whether or not the vesting cliff of 90 days has passed.
Because there's no check on the startTime
's value, the account that creates the vesting schedule can easily create schedules that "started" far enough in the past, such that the vest cliff has already elapsed, allowing the beneficiary to unlock their funds earlier than planned.
Beneficiaries essentially can access to their vested funds earlier than planned, which also allows them to dump their allocations on the market sooner than expected. Given that the idea of vesting schedules is that we want to prevent users from releasing funds to the market too soon, this is a potential risk that can unfairly devalue the allocation of other beneficiaries.
Manual review.
At the very least, require that startTime
has to be block.timestamp
or greater, so that no vesting schedule can be created "retroactively".
One could also protect against start times that live way too far in the future:
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.