mintNft() and buy() are declared payable but neither function uses msg.value, and the contract provides no ETH withdrawal or recovery mechanism. Any ETH attached to those calls is permanently locked in the contract.
The contract inherits from ERC721 but does not implement receive() or fallback(), and there is no withdrawETH owner function. ETH sent to either entry point cannot be recovered by users or the owner.
Likelihood:
Easy user mistake, especially from generic frontends, wallet UIs that auto-attach ETH, or scripted integrations
Occurs whenever a user mistakenly sends ETH alongside a USDC transaction
Impact:
ETH sent to mintNft() or buy() is permanently trapped
No recovery path exists for affected users or the protocol owner
Remove the payable modifier from both functions since ETH payment is not part of the protocol design:
Alternatively, add an explicit revert if msg.value > 0 to prevent accidental ETH transfers, or add an owner-only ETH recovery function if ETH acceptance is intentional.
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.