- 1 min

execute

function canCall(
    address caller,
    address target,
    bytes4 selector
) public view virtual returns (bool immediate, uint32 delay) {
    ...
    uint64 roleId = getTargetFunctionRole(target, selector);
    (bool isMember, uint32 currentDelay) = hasRole(roleId, caller);
    return isMember ? (currentDelay == 0, currentDelay) : (false, 0);
}

function hasRole(
    uint64 roleId,
    address account
) public view virtual returns (bool isMember, uint32 executionDelay) {
    ...
    (uint48 hasRoleSince, uint32 currentDelay, , ) = getAccess(roleId, account);
    return (hasRoleSince != 0 && hasRoleSince <= Time.timestamp(), currentDelay);
}

function getAccess(
    uint64 roleId,
    address account
) public view virtual returns (uint48 since, uint32 currentDelay, uint32 pendingDelay, uint48 effect) {
    Access storage access = _roles[roleId].members[account];
    since = access.since;
    (currentDelay, pendingDelay, effect) = access.delay.getFull();
    return (since, currentDelay, pendingDelay, effect);
}

scheduler

guardian

role-admin

super-admin