mintNft() and buy() accept payment exclusively in USDC via transferFrom. No ETH is required or used in either function.
Both functions are marked payable, so the EVM accepts ETH sent alongside calls without reverting. Since the contract has no receive(), fallback(), or ETH withdrawal function, any ETH sent to these functions is permanently locked.
Likelihood:
Users familiar with ETH-native NFT marketplaces may send ETH expecting it to cover the mint or purchase price.
Wallet or frontend bugs can cause unintended ETH to be attached to contract calls.
Impact:
Any ETH sent to mintNft() or buy() is permanently lost with no recovery path.
No admin function or selfdestruct exists to rescue locked ETH.
Alice calls mintNft{value: 0.1 ether}() — USDC transfer succeeds, NFT is minted, 0.1 ETH is locked in contract forever.
Bob calls buy{value: 0.5 ether}(1) — USDC transfer succeeds, NFT transfers to Bob, 0.5 ETH is locked in contract forever.
Remove payable from both functions. Since all payments are handled in USDC, neither function has any reason to accept ETH. This causes the EVM to revert any call that includes a non-zero msg.value, protecting users from accidental ETH loss.
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.