LevelTwo contract does not inherit from UUPSUpgradeable contract but only from Initializable. This means that it will not comply with ERC1967, which ensure a consistent location where proxies store the implementation address they delegate calls to. Therefore, the LevelOne::graduateAndUpgrade function will not be able to upgrade to LevelTwo contract and will revert on an invalid implementation.
See https://eips.ethereum.org/EIPS/eip-1967
The LevelOne::graduateAndUpgrade function will not be able to upgrade to LevelTwo contract and will revert on an invalid implementation, clocking the system.
Deploy LevelTwo contract without inheriting from UUPSUpgradeable.
Call the LevelOne::graduateAndUpgrade function with the LevelTwo implementation address.
The function will revert on an invalid implementation following ERC1967.
Manual review.
LevelTwo contract should inherit from UUPSUpgradeable contract to ensure that it complies with ERC1967. This will ensure that the LevelOne::graduateAndUpgrade function can upgrade to LevelTwo contract without any issues.
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.