attendPerformance enforces the cooldown against a single global lastCheckIn[msg.sender] value (FestivalPass.sol:110) and updates that same global slot on every attendance (line 112). The cooldown is therefore not scoped to a performance, so attending any one performance blocks the user from attending every other performance for a full COOLDOWN (1 hour), including performances that run simultaneously.
Likelihood:
High. The festival is explicitly designed for multiple performances, and overlapping or back-to-back sets are normal. Any pass holder attending two events within an hour hits this on ordinary use.
Impact:
Low. No funds are at risk and the hasAttended mapping already prevents double-claiming a single performance. The harm is functional: legitimate attendees are denied BEAT rewards they earned by attending distinct, possibly concurrent, performances, degrading the core reward mechanic the protocol promises.
Attend one active performance, then immediately attempt a second concurrent one and observe the revert.
Scope the cooldown per performance, or rely on the existing per-performance hasAttended guard.
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.