The contract inherits OpenZeppelin's AccessControl but implements custom role management functions (grantSigningRole, revokeSigningRole).
The inherited grantRole() and revokeRole() functions remain public and callable, but they don't update the custom s_signers array and s_isSigner mapping.
This creates an inconsistent state where AccessControl and custom tracking can become desynchronized.
Likelihood:
Currently mitigated because no one has DEFAULT_ADMIN_ROLE
However, if Missing DEFAULT_ADMIN_ROLE Grant in Constructor is fixed (granting DEFAULT_ADMIN_ROLE), this becomes exploitable
Integration confusion - other contracts might call inherited functions
Impact:
State desynchronization between AccessControl roles and custom signer tracking
Someone with SIGNING_ROLE via inherited grantRole() won't be in s_signers array
Could bypass max signer limit (5) via inherited functions
getSigners() returns incorrect data
Execution validation could fail unexpectedly
Override inherited AccessControl functions to prevent direct usage:
Or remove AccessControl inheritance entirely and use a simpler role check:
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.