The UUPSOwnableProxied contract, inherited by the Bridge contract, lacks a storage gap. This violates best practices for upgradeable contracts using the UUPS pattern, creating a significant risk of storage collisions during future upgrades and potentially leading to data corruption and broken functionality.
The UUPSOwnableProxied contract inherits from Ownable and UUPSUpgradeable, introducing its own state variable without including a storage gap:
This structure limits safe upgradability, as adding new state variables in future versions could cause storage collisions with child contracts.
High risk of storage collisions in future upgrades
Potential data corruption or unexpected behavior in child contracts
Possible breaking of contract functionality during upgrades
Limited ability to add new features or state variables safely
Manual review
Add a storage gap at the end of the UUPSOwnableProxied contract:
This __gap array reserves 50 storage slots (adjustable based on future needs), allowing safer contract upgrades by providing space for new state variables without risking collisions with existing storage layouts.
Consider implementing Namespaced Storage Layout as an alternative to storage gaps. This approach provides better organization and reduces the risk of storage collisions in complex inheritance structures.
Replace the standard Ownable contract with OpenZeppelin's OwnableUpgradeable:
Using OwnableUpgradeable ensures that the ownership functionality is compatible with the upgradeability pattern, further reducing the risk of storage layout issues in future upgrades.
Known issue: Lightchaser
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.