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.