Root + Impact
The burnFrom() function in BeatToken only checks that the caller is festivalContract. It does not check any ERC20 allowance or explicit user consent for the burn.
This means the FestivalPass contract (or any future function added to it) can burn arbitrary amounts of BEAT tokens from any user's balance without the user ever approving the burn. Currently redeemMemorabilia() uses this correctly (user calls it themselves), but the design is unsafe — any added function in FestivalPass that calls burnFrom with an attacker-controlled from address would drain victims.
Compare with OpenZeppelin's standard ERC20Burnable.burnFrom():
Likelihood:
Currently FestivalPass only calls burnFrom(msg.sender, ...) inside redeemMemorabilia(), so the user is always burning their own tokens
The risk materializes when any new function is added to FestivalPass (or a new festival contract is set) that passes a different from address
Impact:
Any upgrade or addition to the FestivalPass contract could enable burning tokens from any user without consent
Violates the ERC20 allowance model that users and integrators expect
Then in FestivalPass.redeemMemorabilia(), users would need to first approve the FestivalPass contract to spend their BEAT, or use a permit pattern.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.