createMemorabiliaCollection()
seeds every new collection with currentItemId = 1
, whileredeemMemorabilia()
allows minting only when the current counter is strictly less thanmaxSupply
. For a 1-of-1 drop (maxSupply = 1
) the condition 1 < 1
fails on the very first call, so redemption always reverts and the unique item can never be minted.
Result: functional DoS for any collection configured with maxSupply = 1
.
Likelihood:
Organisers often release exclusive 1-of-1 items; every such collection fails deterministically.
Impact:
Functional DoS – users cannot mint the intended item; organiser reputation hit. No funds lost, but business logic broken.
Off-by-one shortage and reputation damage for every other collection (N-1
minted instead of N
).
The PoC deploys a 1-of-1 collection, tops up a user with BEAT, and shows that
the first redemption reverts because of the off-by-one.
Allow “<=” in the check. Diff for the simple comparator fix:
This lets the first (and only) item in a 1-unit collection be minted
successfully; subsequent calls revert once currentItemId exceeds maxSupply.
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.