# Operator VCS

`OperatorVCS` is a staking strategy that manages many `OperatorVault` contracts by tracking the balance of each and moving tokens in and out of them.

## View Functions

### token

Returns the token this strategy supports

```solidity
function token() external view returns (address)
```

#### Return Values

| Name  | Type    | Description      |
| ----- | ------- | ---------------- |
| token | address | Address of token |

### canDeposit

Returns the available deposit room for this strategy

```solidity
function canDeposit() public view returns (uint256)
```

#### Return Values

| Name        | Type    | Description                  |
| ----------- | ------- | ---------------------------- |
| depositRoom | uint256 | Amount that can be deposited |

### canWithdraw

Returns the available withdrawal room for this strategy

```solidity
function canWithdraw() public view returns (uint256)
```

#### Return Values

| Name           | Type    | Description                  |
| -------------- | ------- | ---------------------------- |
| withdrawalRoom | uint256 | Amount that can be withdrawn |

### pendingFees

Returns the total amount of fees that will be paid on the next call to `updateDeposits`

```solidity
function pendingFees() external view returns (uint256)
```

#### Return Values

| Name      | Type    | Description                         |
| --------- | ------- | ----------------------------------- |
| totalFees | uint256 | Amount of tokens to be paid as fees |

### getTotalDeposits

Returns the total amount of deposits in this strategy

```solidity
function getTotalDeposits() public view returns (uint256)
```

#### Return Values

| Name          | Type    | Description                      |
| ------------- | ------- | -------------------------------- |
| totalDeposits | uint256 | Total amount of tokens deposited |

### getMaxDeposits

Returns the maximum amount of tokens this strategy can hold

*Accounts for total current deposits + current additional vault space + current space in the Chainlink*

```solidity
function getMaxDeposits() public view returns (uint256)
```

#### Return Values

| Name        | Type    | Description            |
| ----------- | ------- | ---------------------- |
| maxDeposits | uint256 | Maximum token deposits |

### getMinDeposits

Returns the minimum amount of tokens that must remain in this strategy

```solidity
function getMinDeposits() public view returns (uint256)
```

#### Return Values

| Name        | Type    | Description            |
| ----------- | ------- | ---------------------- |
| minDeposits | uint256 | Minimum token deposits |

### getDepositChange

Returns the deposit change since the last call to `updateDeposits` (ignores stakes/withdraws)

```solidity
function getDepositChange() public view returns (int256)
```

#### Return Values

| Name          | Type   | Description                    |
| ------------- | ------ | ------------------------------ |
| depositChange | int256 | Change in total token deposits |

### getVaults

Returns a list of all vaults

```solidity
function getVaults() external view returns (contract IVault[])
```

#### Return Values

| Name   | Type       | Description             |
| ------ | ---------- | ----------------------- |
| vaults | address\[] | List of vault addresses |

### getVaultDepositLimits

Returns the vault deposit limits

```solidity
function getVaultDepositLimits() public view returns (uint256, uint256)
```

#### Return Values

| Name        | Type    | Description                                      |
| ----------- | ------- | ------------------------------------------------ |
| minDeposits | uint256 | minimum amount of deposits that a vault can hold |
| maxDeposits | uint256 | maximum amount of deposits that a vault can hold |

### vaultImplementation

Returns the address of the vault implementation contract this strategy will use for new vaults

```solidity
function vaultImplementation() external view returns (address)
```

#### Return Values

| Name                | Type    | Description                              |
| ------------------- | ------- | ---------------------------------------- |
| vaultImplementation | address | Address of vault implementation contract |

### getFees

Returns a list of all fees

```solidity
function getFees() external view returns (struct VaultControllerStrategy.Fee[])
```

#### Return Values

| Name | Type                                  | Description  |
| ---- | ------------------------------------- | ------------ |
| fees | struct VaultControllerStrategy.Fee\[] | List of fees |

### operatorRewardPercentage

Returns the basis point amount of an operator's earned rewards that they receive

```solidity
function operatorRewardPercentage() external view
```

#### Return Values

| Name                     | Type    | Description                            |
| ------------------------ | ------- | -------------------------------------- |
| operatorRewardPercentage | uint256 | Basis point operator reward percentage |

### getOperatorRewards

Returns the total unclaimed operator rewards

```solidity
function getOperatorRewards() external view returns (uint256, uint256)
```

#### Return Values

| Name                     | Type    | Description                      |
| ------------------------ | ------- | -------------------------------- |
| unclaimedOperatorRewards | uint256 | Total unclaimed operator rewards |
| availableRewards         | uint256 | Total available operator rewards |

### getVaultRemovalQueue

Returns a list of all vaults queued for removal

```solidity
function getVaultRemovalQueue() external view returns (address[])
```

#### Return Values

| Name  | Type       | Description                       |
| ----- | ---------- | --------------------------------- |
| queue | address\[] | List of vaults queued for removal |

## Write Functions

### deposit

Deposits tokens from the staking pool into vaults

```solidity
function deposit(uint256 _amount, bytes _data) external
```

#### Parameters

| Name     | Type    | Description                 |
| -------- | ------- | --------------------------- |
| \_amount | uint256 | Amount to deposit           |
| \_data   | bytes   | Encoded vault deposit order |

### withdraw

Withdraws tokens from vaults and sends them to the staking pool

```solidity
function withdraw(uint256 _amount, bytes _data) external
```

#### Parameters

| Name     | Type    | Description                    |
| -------- | ------- | ------------------------------ |
| \_amount | uint256 | Amount to withdraw             |
| \_data   | bytes   | Encoded vault withdrawal order |

### onTokenTransfer

ERC677 implementation to receive operator rewards

```solidity
function onTokenTransfer(address, uint256, bytes) external
```

### withdrawOperatorRewards

Used by vaults to withdraw operator rewards

```solidity
function withdrawOperatorRewards(address _receiver, uint256 _amount) external
```

#### Parameters

| Name       | Type    | Description                |
| ---------- | ------- | -------------------------- |
| \_receiver | address | Address to receive rewards |
| \_amount   | uint256 | Amount to withdraw         |

### updateDeposits

Updates deposit accounting and calculates fees on newly earned rewards

```solidity
function updateDeposits(bytes _data) external returns (uint256 depositChange, address[] receivers, uint256[] amounts)
```

#### Parameters

| Name   | Type  | Description                                                                     |
| ------ | ----- | ------------------------------------------------------------------------------- |
| \_data | bytes | Encoded min amount of rewards required to claim (set 0 to skip reward claiming) |

#### Return Values

| Name          | Type       | Description                          |
| ------------- | ---------- | ------------------------------------ |
| depositChange | uint256    | change in deposits since last update |
| receivers     | address\[] | List of fee receivers                |
| amounts       | uint256\[] | List of fee amounts                  |

### updateVaultGroups

Executes a vault group update

*Re-unbonds all vaults in the current vault group and increments the current vault group*

```solidity
function updateVaultGroups(uint256[] _curGroupVaultsToUnbond, uint256 _curGroupTotalDepositRoom, uint256 _nextGroup,
uint256 _nextGroupTotalUnbonded) external
```

#### Parameters

| Name                       | Type       | Description                                                 |
| -------------------------- | ---------- | ----------------------------------------------------------- |
| \_curGroupVaultsToUnbond   | uint256\[] | list of vaults to unbond in current vault group             |
| \_curGroupTotalDepositRoom | uint256\[] | total deposit room across all vaults in current vault group |
| \_nextGroup                | uint256\[] | index of next vault group                                   |
| \_nextGroupTotalUnbonded   | uint256\[] | total unbonded across all vaults in next vault group        |

### upgradeVaults

Upgrades vaults to a new implementation contract

```solidity
function upgradeVaults(uint256 _startIndex, uint256 _numVaults, bytes _data) external
```

#### Parameters

| Name         | Type    | Description                                                 |
| ------------ | ------- | ----------------------------------------------------------- |
| \_startIndex | uint256 | Index of first vault to upgrade                             |
| \_numVaults  | uint256 | Number of vaults to upgrade starting at \_startIndex        |
| \_data       | bytes   | Optional encoded function call to be executed after upgrade |

### setWithdrawalIndexes

Manually sets the withdrawal index for each vault group

```solidity
function setWithdrawalIndexes(uint64 _withdrawalIndexes) external
```

#### Parameters

| Name                | Type      | Description                                     |
| ------------------- | --------- | ----------------------------------------------- |
| \_withdrawalIndexes | uint64\[] | list of withdrawal indexes for each vault group |

### addFee

Adds a new fee

```solidity
function addFee(address _receiver, uint256 _feeBasisPoints) external
```

#### Parameters

| Name             | Type    | Description             |
| ---------------- | ------- | ----------------------- |
| \_receiver       | address | Address of fee receiver |
| \_feeBasisPoints | uint256 | Fee in basis points     |

### updateFee

Updates an existing fee

```solidity
function updateFee(uint256 _index, address _receiver, uint256 _feeBasisPoints) external
```

#### Parameters

| Name             | Type    | Description             |
| ---------------- | ------- | ----------------------- |
| \_index          | uint256 | Index of fee            |
| \_receiver       | address | Address of fee receiver |
| \_feeBasisPoints | uint256 | Fee in basis points     |

### setVaultImplementation

Sets a new vault implementation contract to be used when deploying/upgrading vaults

```solidity
function setVaultImplementation(address _vaultImplementation) external
```

#### Parameters

| Name                  | Type    | Description                        |
| --------------------- | ------- | ---------------------------------- |
| \_vaultImplementation | address | Address of implementation contract |

### addVault

Deploys a new vault

```solidity
function addVault(address _operator) external
```

#### Parameters

| Name       | Type    | Description                                   |
| ---------- | ------- | --------------------------------------------- |
| \_operator | address | Address of operator that the vault represents |

### queueVaultRemoval

Queues a vault for removal

*A vault can only be queued for removal if the operator has been removed from the Chainlink staking contract*

```solidity
function queueVaultRemoval(uint256 _index) external
```

#### Parameters

| Name    | Type    | Description    |
| ------- | ------- | -------------- |
| \_index | uint256 | Index of vault |

### removeVault

Removes a vault that has been queued for removal

```solidity
function removeVault(uint256 _queueIndex) external
```

#### Parameters

| Name         | Type    | Description                     |
| ------------ | ------- | ------------------------------- |
| \_queueIndex | uint256 | Index of vault in removal queue |

### updateVaultGroupAccounting

Updates accounting for any number of vault groups

*Used to correct minor accounting errors that result from the removal or slashing of operators in the Chainlink staking contract*

```solidity
function updateVaultGroupAccounting(
        uint256[] _vaultGroups,
        uint256[] _totalDepositRoom,
        uint256 _totalUnbonded,
        uint256 _vaultMaxDeposits
    ) external
```

#### Parameters

| Name               | Type       | Description                                                    |
| ------------------ | ---------- | -------------------------------------------------------------- |
| \_vaultGroups      | uint256\[] | list of vault groups to update                                 |
| \_totalDepositRoom | uint256\[] | list of totalDepositRoom corresponding to list of vault groups |
| \_totalUnbonded    | uint256    | total amount currently unbonded                                |
| \_vaultMaxDeposits | uint256    | vault deposit limit as defined in Chainlink staking contract   |

### setOperator

Sets a vault's operator address

```solidity
function setOperator(uint256 _index, address _operator) external
```

#### Parameters

| Name       | Type    | Description                                   |
| ---------- | ------- | --------------------------------------------- |
| \_index    | uint256 | Index of vault                                |
| \_operator | address | Address of operator that the vault represents |

### setRewardsReceiver

Sets the address authorized to claim rewards for a vault

```solidity
function setRewardsReceiver(address _rewardsReceiver) external
```

#### Parameters

| Name       | Type    | Description                           |
| ---------- | ------- | ------------------------------------- |
| \_operator | address | Address of rewards receiver for vault |

### setOperatorRewardPercentage

Sets the basis point amount of an operator's earned rewards that they receive

```solidity
function setOperatorRewardPercentage(uint256 _operatorRewardPercentage) external
```

#### Parameters

| Name                       | Type    | Description                            |
| -------------------------- | ------- | -------------------------------------- |
| \_operatorRewardPercentage | uint256 | Basis point operator reward percentage |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.stake.link/link-staking-contracts/operatorvcs.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
