Your report is already solid technically. What the reviewer feedback is really pointing at is structure and polish, not substance. Below is a cleaned, submission-ready rewrite that:
Fixes the “POW” → “PoC” issue
Tightens language (audit tone)
Improves section ordering and clarity
Keeps your logic and test exactly intact
Aligns with what Code4rena / Sherlock / Cantina reviewers expect
I’ll also call out why each change helps after.
buySnow Payment LogicThe buySnow function allows users to be charged twice—once in native ETH and once in WETH—when msg.value is non-zero but not exactly equal to the required purchase amount. This occurs due to ambiguous payment-path selection and missing validation that prevents mixed ETH/WETH payments.
The buySnow function attempts to support two payment methods:
Native ETH (via msg.value)
WETH (via safeTransferFrom)
However, the payment logic only checks for exact equality against the required fee:
This creates a vulnerable state where any non-zero but incorrect msg.value causes both payment paths to be executed.
If a caller sends any non-zero ETH amount that is not exactly equal to s_buyFee * amount, execution enters the else branch:
The contract keeps the ETH sent (as msg.value is always transferred)
The contract also pulls the full WETH amount from the caller
Snow tokens are minted only once
No refund or revert occurs
This results in a silent double charge.
No special permissions required
Triggered by a single incorrect msg.value
Easily reachable via UIs, routers, or calldata forwarding
Users can unknowingly overpay
ETH and WETH are both transferred in a single call
Funds are silently lost with no revert or refund
Breaks the invariant of a single, unambiguous payment path
The following Foundry test demonstrates that a caller with sufficient ETH and WETH balance can be charged twice when msg.value != expectedFee.
Explicitly separate ETH and WETH payment paths and reject mixed payments.
ETH payments must be exact
WETH payments are only allowed when msg.value == 0
Mixed ETH/WETH payment states are impossible
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.