collectPresent() checks if both s_theListCheckedOnce and s_theListCheckedTwice equal NICE or EXTRA_NICE. The second mapping defaults to NICE (0) for addresses that were only checked once but never checked twice. Combined with the default enum issue (H-03), there is no explicit check that checkTwice() was actually called. A user checked once as NICE by Santa but never confirmed via checkTwice() still passes both conditions because s_theListCheckedTwice defaults to NICE.
The protocol's design requires two checks before collecting. Santa calls checkList() first, then checkTwice(). But if Santa only calls checkList(user, NICE) and never follows up with checkTwice(), the user can still collect because the second mapping defaults to NICE.
This is related to H-03 (default enum) but represents a distinct logical flaw: even if the enum were reordered so that 0 = NOT_CHECKED_TWICE, the contract still lacks an explicit verification that checkTwice() was called for the address.
Likelihood:
Requires Santa to check a user once but not follow through with checkTwice. This is a normal operational scenario, especially if Santa is still processing the list.
Impact:
Users who were only partially vetted can collect presents early, before their second check.
Track whether checkTwice() was actually called:
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.