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.