The LevelTwo contract does not inherit UUPSUpgradeable and does not implement the proxiableUUID() function required by the UUPS pattern. This function is essential for the upgrade process as it serves as a compatibility check to ensure the new implementation adheres to the UUPS standard. In the OpenZeppelin implementation, the _upgradeToAndCallUUPS function attempts to call proxiableUUID() on the new implementation contract and expects it to return ERC1967Utils.IMPLEMENTATION_SLOT.
The principal calls graduateAndUpgrade with the address of LevelTwo as the target implementation
If the function were correctly implemented to call upgradeToAndCall instead of just _authorizeUpgrade, the upgrade process would begin
During the upgrade, _upgradeToAndCallUUPS would attempt to call proxiableUUID() on the LevelTwo contract
Since LevelTwo does not implement this function (and does not inherit UUPSUpgradeable where is function included), the call would fail and enter the catch block
The transaction would revert with an ERC1967InvalidImplementation error
The upgrade would fail, leaving the system stuck at LevelOne
Implement the proxiableUUID() function in LevelTwo
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.