Normal Behavior: Each Chainlink request ID should correspond to a single NFT mint. Once fulfillMintRequest processes a request, further calls with the same ID should be rejected.
Issue: The contract does not clear or invalidate the UserMintRequest after successful fulfillment, allowing anyone (including the original user) to call fulfillMintRequest multiple times for the same requestId and mint duplicate NFTs.
Likelihood:
Bots or users can easily replay on‑chain transactions once the oracle’s response is stored.
No on‑chain mechanism exists to automatically expire or consume a requestId.
Impact:
Multiple NFTs can be minted from a single paid request, diluting token scarcity and disrupting economic modeling.
Unexpected token ID collisions or inconsistencies in weather state tracking when multiple tokens share the same underlying data.
A user pays to mint a Weather NFT, which generates a unique requestId (e.g. 0xABC...) and the oracle responds with the weather data.
Anyone—whether it’s the same user or an attacker—can call fulfillMintRequest(0xABC...) once to mint the first NFT (say, token #100).
Because the contract never clears the record of that requestId, calling fulfillMintRequest(0xABC...) a second time still succeeds, minting a second NFT (token #101) without any additional payment.
This process can be repeated indefinitely, producing an arbitrary number of “unique” NFTs from a single paid request—breaking the one‑of‑a‑kind guarantee.
By clearing the s_funcReqIdToUserMintReq entry at the end of fulfillMintRequest, you ensure that each request ID can only be used once, preventing duplicate NFT minting.
The `WeatherNFT::fulfillMintRequest` allows a malicious user to call multiple times the function with the same `requestId`.
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.