contract JellyAccessControls is JellyMinterAccess {
    /// @notice Role definitions

    bytes32 public constant SMART_CONTRACT_ROLE = keccak256("SMART_CONTRACT_ROLE");

    event SmartContractRoleGranted(
        address indexed beneficiary,
        address indexed caller
    );

    event SmartContractRoleRemoved(
        address indexed beneficiary,
        address indexed caller
    );


    constructor()  {
        TEMPLATE_TYPE = 7;
        TEMPLATE_ID = keccak256("ACCESS_CONTROLS");
    }


    /////////////
    // Lookups //
    /////////////


    /**
     * @notice Used to check whether an address has the smart contract role
     * @param _address EOA or contract being checked
     * @return bool True if the account has the role or false if it does not
     */
    function hasSmartContractRole(address _address) public view returns (bool) {
        return hasRole(SMART_CONTRACT_ROLE, _address);
    }


    ///////////////
    // Modifiers //
    ///////////////

    /**
     * @notice Grants the smart contract role to an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract receiving the new role
     */
    function addSmartContractRole(address _address) external {
        grantRole(SMART_CONTRACT_ROLE, _address);
        emit SmartContractRoleGranted(_address, _msgSender());
    }

    /**
     * @notice Removes the smart contract role from an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract affected
     */
    function removeSmartContractRole(address _address) external {
        revokeRole(SMART_CONTRACT_ROLE, _address);
        emit SmartContractRoleRemoved(_address, _msgSender());
    }


}
function removeSmartContractRole(address _address) external {
    revokeRole(SMART_CONTRACT_ROLE, _address);
    emit SmartContractRoleRemoved(_address, _msgSender());
}

/**
 * @notice Removes the smart contract role from an address
 * @dev The sender must have the admin role
 * @param _address EOA or contract affected
 */