The veRAACToken.sol contract is designed as a non-transferable governance token. However, the current implementation allows transfers because the transfer and transferFrom functions still call the parent ERC20 implementation. This contradicts the protocol’s intended design and documentation, which states that veRAAC tokens should be strictly non-transferable.
These are the transfer and transferFrom functions from the veRAACToken.sol contract: https://github.com/Cyfrin/2025-02-raac/blob/main/contracts/core/tokens/veRAACToken.sol#L457-L478
The problem is that both functions invoke super.transfer() and super.transferFrom(), which execute as standard ERC20 transfers. Since ERC20 does not inherently enforce non-transferability, this allows veRAAC tokens to be freely transferred, contrary to the comments, protocol documentation and intended behavior.
Impact: High – veRAAC tokens are supposed to be non-transferable, which is a fundamental property of the governance system. Allowing transfers can lead to governance manipulation and undermine the system.
Likelihood: High– Since the contract does not restrict transfers, any token holder can unknowingly or maliciously transfer tokens.
Severity: High – This breaks core protocol functionality.
Manual Review
To strictly enforce non-transferability, update the transfer and transferFrom functions as follows:
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.