The Proxy
won't be upgraded with the new implementation contract (Level2.sol
) because there is no function called inside graduateAndUpgrade()
that performs the actual change of the implementation contract address.
The Proxy contract stores the address of the implementation contract to point to when delegatecall
.
With UUPSUpgradeable
mechanism, the set up of a new implementation contract address is normally processed by a function inside the actual implementation contract : LevelOne.sol
But here in LevelOne.sol
there is no call to an upgrade of the implementation contract address. Only a call to the __AuthorizeUpgrade()
function which is only present to restrict access for an upgrade.
According to Openzeppelin : upgradeToAndCall()
should be used to upgrade the implementation contract.
https://github.com/CodeHawks-Contests/2025-05-hawk-high/blob/main/src/LevelOne.sol#L305
No upgrade can be performed.
GitHub, Manual review.
Use upgradeToAndCall()
inside graduateAndUpgrade()
to perform the actual upgrade of the implementation contract.
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.