mintNft() and buy() are both marked payable, which allows callers to attach ETH to these transactions. All payments in the protocol are made exclusively in USDC via transferFrom.
Neither function reads msg.value or processes the attached ETH in any way. The contract has no receive(), no fallback(), and no ETH withdrawal function, so any ETH sent with these calls is permanently locked in the contract with no recovery path.
Likelihood:
Any user who mistakenly or deliberately sends ETH along with a mintNft or buy call loses those funds immediately.
Wallets and scripts that batch ETH and ERC20 operations can trigger this silently.
Impact:
ETH sent to these functions is permanently locked — there is no owner function or emergency withdrawal to recover it.
Users suffer direct financial loss with no recourse.
Paste this function inside NFTDealersTest in test/NFTDealersTest.t.sol and run:
forge test --match-test testPoC_PayableBuyLocksEth -vvvv
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.