FestivalPass constructor does not validate _beatToken != address(0) or _organizer != address(0). Since beatToken has no setter, deploying with address(0) permanently bricks all BEAT operations. Similarly, BeatToken.setFestivalContract does not check for address(0), creating a confusing deployment state.
Calling with _festival = address(0) is technically a no-op (festivalContract stays address(0), and the guard still passes on the next call since address(0) == address(0) remains true). So the BeatToken case is recoverable. But it creates a confusing deployment state where the owner believes the contract is configured while mint and burnFrom revert for any real caller.
If _beatToken is address(0), every call to BeatToken(beatToken).mint(...) calls address(0), which succeeds silently (no code at that address) but mints nothing. Users pay ETH for passes and earn zero BEAT.
Likelihood:
Requires deployment error (passing address(0) to constructor or setFestivalContract). Low probability but irreversible for the FestivalPass constructor since there is no setter for beatToken.
Impact:
With beatToken = address(0): all BEAT operations silently fail. Pass buyers pay ETH but receive no BEAT bonus. Attendance mints zero BEAT. Memorabilia redemption burns zero BEAT (free NFTs). With organizer = address(0): all onlyOrganizer functions are bricked.
Output:
Add zero-address checks:
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.