SIGNING_ROLE can directly call renounceRole from AccessControl, causing state desynchronization.Only the owner should be able to revoke the signer role, ensuring that any change in the multisig composition goes through the controlled flow that correctly updates all internal state.
Any signer can directly call renounceRole from AccessControl, removing their role without going through contract logic and without updating s_isSigner, s_signerCount, or the list of signers, causing critical state desynchronization.
AccessControl contract
Likelihood: High
Any signer can call renounceRole at any time, since the function is public and part of AccessControl.
The contract does not block or intercept this action, so the behavior is always accessible.
Impact: High
The internal state of the multisig becomes desynchronized, causing incorrect signer counts and possible permanent lockups.
“Ghost” signer slots may be occupied, preventing new signers from being added and breaking contract governance.
This test demonstrates that a signer can call renounceRole directly, losing the SIGNING_ROLE without the internal signer count being updated. This creates a desynchronization between the actual roles and the internal state of the multisig.
Override renounceRole to prevent signers from unilaterally renouncing the SIGNING_ROLE, forcing signer management to go exclusively through owner-controlled functions.
This solution preserves standard AccessControl behavior for other roles and prevents desynchronization of the multisig’s internal state.
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.