mintNft() and buy() are marked payable but the protocol settles exclusively in USDC. Any ETH sent with these calls is accepted by the contract and permanently locked — there is no withdraw, rescue, or receive/fallback recovery function for native ETH. The contract inherits from OpenZeppelin ERC721, which includes no native token recovery.
Likelihood:
Occurs when a user calls mintNft() or buy() with non-zero msg.value — possible through user error, frontend bugs, or wallets that default to non-zero value
Both functions are core user-facing operations called in normal marketplace usage
Impact:
Any native ETH sent is irrecoverably locked — no contract function can move it, not even the owner
Cumulative losses grow over the contract's lifetime with no recovery path
Output: Contract holds 0.5 ETH with no function to extract it.
Root cause — payable modifier on USDC-only functions:
Fix — remove payable:
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.