DEFAULT_ADMIN_ROLE grant in constructor breaks grantRole() and revokeRole() functionalityOpenZeppelin's AccessControl requires a caller to have the admin role of the target role to grant or revoke it. By default, SIGNING_ROLE's admin is DEFAULT_ADMIN_ROLE (bytes32(0)).
In the constructor, the owner is only granted SIGNING_ROLE but not DEFAULT_ADMIN_ROLE, making the inherited grantRole() and revokeRole() functions unusable.
Likelihood: High
This occurs every time the contract is deployed, as the constructor never grants DEFAULT_ADMIN_ROLE
Impact: Medium
The grantRole() and revokeRole() functions inherited from OpenZeppelin's AccessControl are completely broken
While custom grantSigningRole() and revokeSigningRole() functions work, the standard AccessControl interface is non-functional
Explanation: The owner attempts to call grantRole() to add a new signer. Despite being the contract owner and having SIGNING_ROLE, the call reverts with AccessControlUnauthorizedAccount because the owner lacks DEFAULT_ADMIN_ROLE which is required to manage SIGNING_ROLE.
Expected: Owner can use grantRole() to manage signer roles.
Actual: Transaction reverts with AccessControlUnauthorizedAccount.
Explanation: Grant DEFAULT_ADMIN_ROLE to the deployer in the constructor. This allows the owner to use both the custom functions (grantSigningRole/revokeSigningRole) and the standard AccessControl interface (grantRole/revokeRole).
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.