Both OneShot::getRapperStats() and RapBattle::getRapperSkill() do not check that the arbitrarily provided tokenId actually exists.
Due to missing checks that the passed tokenId is already been minted, those functions create inconsistent state in the protocol.
RapBattle::getRapperSkill() makes possible for anyone to freely obtain a "non-minted rapper" with a high skill of 65, that will normally require 3 staking days to obtain.
Manual review
In the trace below, I call OneShot::getRapperStats() with a tokenId not yet minted, and the function returns a RapperStats struct with state-default values for his attributes (that corresponds to a skill level of 65):
Add existence checks to the pointed functions.
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.