Normal behavior: when protocol policy is whitelist-restricted trading, only approved wallets should buy listed NFTs.
Issue: buy() has no whitelist gate. Any external address can purchase listed NFTs.
The contract enforces whitelist checks for minting and listing, which suggests a restricted participant model during controlled phases. Omitting the same control on buy() creates an authorization gap where the most sensitive market action (acquiring listed assets) is still public.
If operational assumptions, compliance constraints, or launch mechanics depend on allowlisted participation, this mismatch causes immediate policy bypass.
Likelihood:
Public function with no access restriction.
Exploitable in every deployment where buyer allowlist is expected.
Impact:
Access-control policy mismatch and possible compliance/business-logic violations.
Restricted launch assumptions fail immediately.
A whitelisted seller creates a valid listing.
A non-whitelisted wallet approves USDC and calls buy().
Purchase succeeds and ownership transfers to non-whitelisted account.
This confirms absence of whitelist enforcement on buying.
Applying onlyWhitelisted to buy() aligns access control with restricted-market assumptions and removes policy ambiguity. If permissionless buy is desired instead, protocol docs should explicitly state that behavior so reviewers and users do not rely on whitelist-based purchase restrictions.
If permissionless buying is intentional, document it clearly in README/spec to avoid incorrect security assumptions.
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.