The LevelTwo
contract is intended to be used as a new implementation in the Hawk High UUPS upgrade pattern. However, it does not inherit from UUPSUpgradeable
, which is required for compatibility with OpenZeppelin's upgrade mechanisms. As a result, any upgrade attempt from LevelOne
to LevelTwo
will revert with an error.
The OpenZeppelin upgrade functions like upgradeTo()
or _upgradeToAndCallUUPS()
perform a safety check by calling:
This check only passes if the new implementation inherits UUPSUpgradeable
and implements proxiableUUID()
properly. Since LevelTwo
currently only inherits Initializable
, this call will revert, blocking the upgrade.
Upgrade from LevelOne → LevelTwo
will fail
Future upgrades (LevelTwo → LevelThree
) will also fail unless fixed
Manual code review
Remix test deployment with ERC1967Proxy
Reference to OpenZeppelin UUPSUpgradeable v5.3.0 source code
Update LevelTwo
to inherit both base contracts:
This ensures:
The contract is compatible with UUPS proxies
The upgrade from LevelOne to LevelTwo succeeds
LevelTwo remains upgradeable to future versions (e.g., LevelThree)
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.