LevelTwo contract does not inherit from UUPSUpgradeable, which is required for any implementation contract in the UUPS upgrade pattern, even if it's intended to be the final implementation. This will cause the upgrade from LevelOne to LevelTwo to fail in production.
In the UUPS (Universal Upgradeable Proxy Standard) pattern, all implementation contracts must inherit from UUPSUpgradeable, even if they are intended as "final" implementations with no further upgrades planned. This is because the upgrade process itself requires the new implementation to support the UUPS interface.
LevelOne correctly inherits from UUPSUpgradeable:
However, LevelTwo does not:
The upgrade process uses IERC1822Proxiable(newImplementation).proxiableUUID() to verify that the new implementation supports the UUPS pattern. Without inheriting from UUPSUpgradeable, LevelTwo doesn't implement this function, and the upgrade will fail with the error:
This is evident from the OpenZeppelin UUPSUpgradeable implementation:
The upgrade from LevelOne to LevelTwo will fail in production. The school system will be unable to complete its upgrade cycle, which is a core feature of the platform. This means:
The system will be stuck at LevelOne
Teachers and principal cannot receive their wages (which are paid during upgrade)
Students cannot graduate
The entire business logic of the platform breaks down
Manual code review
LevelTwo must inherit from UUPSUpgradeable and implement the required functions, even if it's intended as the final implementation:
If LevelTwo is intended as the final implementation, the _authorizeUpgrade function can be implemented to revert, which would prevent any further upgrades while still satisfying the UUPS pattern requirements.
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.