Hawk High

First Flight #39
Beginner FriendlySolidity
100 EXP
View results
Submission Details
Severity: high
Valid

Upgrade Logic Incomplete

Summary

The graduateAndUpgrade function authorizes an upgrade via _authorizeUpgrade(_levelTwo), but fails to perform the actual upgrade because _upgradeToAndCall is never called. As a result, the contract remains at the same implementation even after the function completes.

Vulnerability Details

In UUPS upgradeable contracts (like OpenZeppelin’s), the upgrade process typically involves two steps:

  1. Authorization via _authorizeUpgrade(address newImplementation),

  2. Execution via upgradeTo or upgradeToAndCall.

This function does only step 1:

_authorizeUpgrade(_levelTwo);

But never calls:

_upgradeToAndCall(_levelTwo, data, false); // or true depending on use case

As a result, no upgrade actually takes place.

Impact

  • The contract remains stuck on the current implementation.

  • Any expected new logic or state from _levelTwo is never reached.

  • Protocol misbehavior or stalling may occur due to false assumption that upgrade succeeded.

Updates

Lead Judging Commences

yeahchibyke Lead Judge 6 months ago
Submission Judgement Published
Validated
Assigned finding tags:

failed upgrade

The system doesn't implement UUPS properly.

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.