Normal behavior: mint flow should complete atomically without allowing callback-controlled reentry into state-changing mint logic.
Issue: mintNft() calls _safeMint, which invokes onERC721Received on contract recipients and allows nested calls to mintNft() in the same transaction.
_safeMint is an external interaction point because recipient contracts are synchronously called back via onERC721Received. Without a reentrancy guard, recipient-controlled code can call back into mint logic before the original call stack fully unwinds.
Even when no direct theft is shown today, this breaks CEI assumptions and creates fragile behavior under future changes (e.g., additional accounting, incentives, or hooks during mint).
Likelihood:
Triggered whenever recipient is a contract implementing ERC721 receiver.
Reentry occurs during normal ERC721 safe mint callback mechanics.
Impact:
Breaks CEI assumptions and increases attack surface for future logic additions.
Can produce unexpected nested state transitions in one transaction.
Attacker deploys an ERC721 receiver contract and gets whitelisted.
Attacker starts one mint call.
During _safeMint, receiver callback re-enters mintNft().
Two mints complete in one top-level transaction.
Result demonstrates callable reentry path through mint callback surface.
nonReentrant blocks nested entry into mintNft() during receiver callback execution. This preserves single-entry semantics for each transaction and protects future mint-path logic from callback-driven state interleaving.
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.
The contest is complete and the rewards are being distributed.