Skip to main content

AccessControlPausableMod

Manage paused roles using diamond storage

Key Features
  • Internal functions for pausing and unpausing roles.
  • Uses diamond storage pattern (EIP-8042) for shared state management.
  • Reverts with specific errors (AccessControlRolePaused, AccessControlUnauthorizedAccount) on failed checks.
  • Compatible with ERC-2535 diamonds.
Module Usage

This module provides internal functions for use in your custom facets. Import it to access shared logic and storage.

Overview

This module provides internal functions to pause and unpause specific roles within a diamond. Facets can import this module to enforce role-based access control, ensuring that certain actions are temporarily blocked for a given role. Changes to role pause status are immediately visible across all facets interacting with the shared diamond storage.


Storage

AccessControlPausableStorage

Definition
struct AccessControlPausableStorage {
mapping(bytes32 role => bool paused) pausedRoles;
}

AccessControlStorage

Definition
struct AccessControlStorage {
mapping(address account => mapping(bytes32 role => bool hasRole)) hasRole;
mapping(bytes32 role => bytes32 adminRole) adminRole;
}

State Variables

PropertyTypeDescription
ACCESS_CONTROL_STORAGE_POSITIONbytes32Diamond storage slot position for this module (Value: keccak256("compose.accesscontrol"))
PAUSABLE_STORAGE_POSITIONbytes32Diamond storage slot position for this module (Value: keccak256("compose.accesscontrol.pausable"))

Functions

getAccessControlStorage

Returns the storage for AccessControl.

function getAccessControlStorage() pure returns (AccessControlStorage storage s);

Returns:

PropertyTypeDescription
sAccessControlStorageThe AccessControl storage struct.

getStorage

Returns the storage for AccessControlPausable.

function getStorage() pure returns (AccessControlPausableStorage storage s);

Returns:

PropertyTypeDescription
sAccessControlPausableStorageThe AccessControlPausable storage struct.

isRolePaused

function to check if a role is paused.

function isRolePaused(bytes32 _role) view returns (bool);

Parameters:

PropertyTypeDescription
_rolebytes32The role to check.

Returns:

PropertyTypeDescription
-boolTrue if the role is paused, false otherwise.

pauseRole

function to pause a role.

function pauseRole(bytes32 _role) ;

Parameters:

PropertyTypeDescription
_rolebytes32The role to pause.

requireRoleNotPaused

function to check if an account has a role and if the role is not paused. Notes: - Reverts with AccessControlUnauthorizedAccount If the account does not have the role. - Reverts with AccessControlRolePaused If the role is paused.

function requireRoleNotPaused(bytes32 _role, address _account) view;

Parameters:

PropertyTypeDescription
_rolebytes32The role to check.
_accountaddressThe account to check the role for.

unpauseRole

function to unpause a role.

function unpauseRole(bytes32 _role) ;

Parameters:

PropertyTypeDescription
_rolebytes32The role to unpause.

Events

Errors

Best Practices

Best Practice
  • Call pauseRole and unpauseRole only when necessary to temporarily restrict role functionality.
  • Use requireRoleNotPaused to enforce active role checks, reverting with AccessControlRolePaused if the role is paused.
  • Ensure the AccessControlPausableMod instance is correctly initialized and accessible by facets that require role pause management.

Integration Notes

Shared Storage

This module utilizes diamond storage at the ACCESS_CONTROL_STORAGE_POSITION, identified by keccak25356("compose.accesscontrol"). The AccessControlPausableStorage struct manages the pause state for roles. All functions are internal, directly interacting with this shared storage. Any facet that imports and calls functions on this module will see the updated pause status immediately due to the shared nature of diamond storage.

Was this helpful?
Last updated: