Description: Contract LevelTwo.sol is not inheriting the UUPSUpgradable contract from OpenZeppelin. This means that the protocol can not be upgraded from LevelOne.sol to LevelTwo.sol. For a UUPSUpgradable OpenZeppelin contract to be upgraded to another contract it needs for the other contract to also be inheriting from UUPSUpgradable.
Impact: The protocol can not be upgraded, breaking the whole idea of the protocol.
Proof of Concept: We can see in this test when trying to call upgradeToAndCall function it will revert because the LevelTwo.sol contract is not inheriting from UUPSUpgradable.
Put this in the LevelOneAndGraduateTest.t.sol:
Recommended Mitigation: Easiest way to fix is to make the LevelTwo.sol contract also inherit from UUPSUpgradable. If you want the protocol to still be upgradable add the _authorizeUpgrade in the same manner as in LevelOne.sol, otherwise, make the _authorizeUpgrade function revert.
The system doesn't implement UUPS properly.
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.