npm package: @satlayer/bvs-registry
Description: The BVS Registry is a central record-keeping contract for all Operators and Services within the SatLayer ecosystem. It serves as a directory where Operators and Services can register themselves and establish mutual relationships.
Latest version: 2.4.0

# BVS Registry

The BVS Registry is a central record-keeping contract for all Operators and Services within the SatLayer ecosystem.
It serves as a directory where Operators and Services can register themselves and establish mutual relationships.

The BVS Registry provides essential bookkeeping for the `vault-router` to query delegations and determine
if an Operator is validating a Service.
This enables the `vault-router` to make informed vault management decisions,
such as queuing funds withdrawal from the Vault when delegated.

- **Operator and Service Registration**: Allows addresses to register as Operators or Services
- **Bidirectional Relationships**: Establishes mutual connections between Operators and Services
- **Metadata Management**: Supports optional metadata (name, URI) for Operators and Services
- **Status Tracking**: Tracks the registration status between Operators and Services
- **Event-Based Metadata**: Emits metadata as events rather than storing it on-chain
- **Delegation Information**: Provides critical data for vault management decisions

## Contract Functions

### Registration Functions

- `RegisterAsService`: Register an address as a Service with optional metadata
- `RegisterAsOperator`: Register an address as an Operator with optional metadata
- `RegisterOperatorToService`: Service registers an Operator to run it
- `RegisterServiceToOperator`: Operator registers a Service it's willing to run

### Metadata Management

- `UpdateServiceMetadata`: Update a Service's metadata (name, URI)
- `UpdateOperatorMetadata`: Update an Operator's metadata (name, URI)

### Deregistration Functions

- `DeregisterOperatorFromService`: Service removes an Operator
- `DeregisterServiceFromOperator`: Operator removes a Service

### Query Functions

- `Status`: Check registration status between a Service and Operator
- `IsService`: Check if an address is registered as a Service
- `IsOperator`: Check if an address is registered as an Operator
- `IsOperatorActive`: Check if an Operator has active Service registrations

### Slashing Management

- `EnableSlashing`: Enable slashing for a Service with specified parameters
- `DisableSlashing`: Disable slashing for a Service
- `OperatorOptInToSlashing`: Operator opts into service slashing

## Registration Process

An Operator/Service can register a Service/Operator to run and vice versa. However, both the Operator and Service must register to each other to establish an active relationship.

- As an Operator, registering a Service indicates willingness to run that Service
- As a Service, registering an Operator indicates willingness to be run by that Operator

### Registration Sequence

```mermaid
sequenceDiagram
    participant Operator
    participant Service
    participant Registry
    Operator ->> Registry: 0. RegisterAsOperator()
    Service ->> Registry: 0. RegisterAsService()
    Service ->> Registry: 1. RegisterOperatorToService(operator)
    Operator ->> Registry: 2. RegisterServiceToOperator(service)
```