The graduateAndUpgrade function in the LevelOne contract directly calls the internal _authorizeUpgrade function instead of calling the upgradeToAndCall function from the UUPSUpgradeable contract. This is a critical error in the implementation of the UUPS upgrade pattern.
In the UUPS pattern, the _authorizeUpgrade() function is only meant to check authorization for an upgrade, not to perform the upgrade itself. The actual upgrade logic is implemented in the _upgradeToAndCallUUPS() function, which is called by upgradeToAndCall() after authorization is confirmed.
The contract cannot be upgraded to LevelTwo, making the upgrade functionality completely broken
The principal and users may believe an upgrade has occurred when it hasn't
The school cannot progress to the next level as intended
Replace the direct call to _authorizeUpgrade with a call to upgradeToAndCall in the graduateAndUpgrade function
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.