Missing @custom:oz-upgrades-unsafe-allow for Upgradable Contracts
If the contract is intended to be upgradable (e.g., using OpenZeppelin's TransparentUpgradeableProxy), the @custom:oz-upgrades-unsafe-allow directive is missing for functions that modify storage layout (e.g., grantSigningRole).
Likelihood:
The grantSigningRole function modifies the s_signers array and s_signerCount state variables.
Without the @custom:oz-upgrades-unsafe-allow directive, upgrading the contract could lead to storage layout conflicts or unexpected behavior.
Impact:
Deployment Failure: If the contract is deployed as an upgradable proxy, the absence of the directive may cause the upgrade to fail or behave unpredictably.
Storage Corruption: Upgrades could overwrite or misalign storage variables, leading to data loss or contract instability.
simulate an upgrade to the MultiSigTimelock contract. The original contract modifies storage (s_signers, s_signerCount), but lacks the @custom:oz-upgrades-unsafe-allow directive. When upgraded, the proxy will fail to map storage correctly.
Add the @custom:oz-upgrades-unsafe-allow directive to the contract:
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.
The contest is complete and the rewards are being distributed.