The RAACReleaseOrchestrator contract allows administrators to retroactively reduce the token allocation for a vesting category (e.g., Team, Advisors) even after vesting schedules have been created. This enables admins to break promises to beneficiaries by reducing their total entitlements, violating the immutability expected in vesting contracts.
https://github.com/Cyfrin/2025-02-raac/blob/89ccb062e2b175374d40d824263a4c0b601bcb7f/contracts/core/minters/RAACReleaseOrchestrator/RAACReleaseOrchestrator.sol#L147
The contract’s vesting mechanism does not reserve tokens for individual schedules. Instead, it checks if the category’s total allocation has enough tokens to cover claims.
Exploit Scenario :
Create Vesting Schedules: Admins allocate tokens to users under a category (e.g., TEAM_CATEGORY = 18,000,000 RAAC).
Retroactively Reduce Allocation: Admins call updateCategoryAllocation to lower the category’s total allocation below the amount already distributed.
Break Vesting Schedules: Users can no longer claim their full vested amounts, as the category’s allocation is insufficient.
Code Proof:
In RAACReleaseOrchestrator.sol, allocations can be reduced without safeguarding vested schedules:
Attack Simulation:
Setup
Category: TEAM_CATEGORY has 18,000,000 RAAC allocated.
Beneficiary: Alice is granted a vesting schedule for 18,000,000 RAAC (the entire category).
Malicious Admin Action
The admin reduces the TEAM_CATEGORY allocation to 10,000,000 RAAC (below Alice’s vested amount).
Alice Tries to Claim
After the vesting period, Alice attempts to claim her tokens.
Result:
Expected: Alice claims 18,000,000 RAAC.
Actual:
Category allocation: 10,000,000 RAAC (reduced by admin).
Category used: 18,000,000 RAAC (Alice’s full entitlement).
Error: CategoryAllocationExceeded – Alice cannot claim any tokens.
Users unable to claim full vested amounts
Manual review, static analysis
Enhance the code to prevent admins from reducing category allocations below the total tokens reserved for active vesting schedules.
Add categoryReserved
to Track Reserved Tokens
Modify createVestingSchedule
to Track Reserved Tokens
Update updateCategoryAllocation
to Check Reserved Tokens
Add a Lock Mechanism for Categories
Why This Works
Reserved Tokens: Admins cannot reduce allocations below the total reserved for vesting schedules, protecting users' entitlements.
Immutability: Locked categories prevent retroactive changes, ensuring vesting promises are honored.
Transparency: Clear checks and events make allocation changes auditable.
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.