Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
cc93192
eth fees migration
taylorferran Jan 7, 2026
ee57f4f
Massimo comments
taylorferran Jan 8, 2026
5bceee8
Merge pull request #122 from ssvlabs/eth-fee-migration-docs
RaekwonIII Jan 9, 2026
a81bf8e
ssv staking first commit
taylorferran Jan 12, 2026
5861529
Remove helper files
taylorferran Jan 12, 2026
8e32bf1
Massimo comments
taylorferran Jan 13, 2026
d7e13c9
Merge pull request #123 from ssvlabs/ssv-staking-docs
RaekwonIII Jan 13, 2026
9222cfe
SSV Staking (Operators + IM)
Alex-ssvlabs Jan 13, 2026
cde4099
Merge branch 'ssv-staking' into operators-eth
RaekwonIII Jan 13, 2026
571bafa
Re-added image to tokenomics
Alex-ssvlabs Jan 13, 2026
e2a91fe
Merge pull request #124 from ssvlabs/operators-eth
RaekwonIII Jan 13, 2026
74ef48f
Modified Subgraph examples to be inline with SSV Staking changes
RaekwonIII Jan 21, 2026
918f93b
Essentials draft
Alex-ssvlabs Jan 21, 2026
513d322
essentials fixes #1
Alex-ssvlabs Jan 22, 2026
3d44c75
Merge pull request #127 from ssvlabs/subgraph-new-examples
RaekwonIII Jan 21, 2026
7b8a821
Added Total Effective Balance to DAO constants and Operators
RaekwonIII Jan 27, 2026
0e1124a
Merge pull request #129 from ssvlabs/essentials
RaekwonIII Jan 23, 2026
2b985e3
Merge pull request #132 from ssvlabs/subgraph-examples
RaekwonIII Jan 27, 2026
5bc5a1d
Essentials fixes #2
Alex-ssvlabs Jan 27, 2026
7bd61aa
Essentials fixes #3
Alex-ssvlabs Jan 29, 2026
61c1c06
Essentials fixes #4
Alex-ssvlabs Jan 29, 2026
7ed2fe2
Merge pull request #133 from ssvlabs/essentials2
RaekwonIII Jan 29, 2026
c6c7e67
Essentials fixes #5
Alex-ssvlabs Feb 3, 2026
dd8fe0d
Essentials fixes #6
Alex-ssvlabs Feb 4, 2026
4c2fec3
Essentials fixes #7
Alex-ssvlabs Feb 5, 2026
945528b
Fix typo in README about SSV clusters
RaekwonIII Feb 5, 2026
fd59ebd
Fixed broken links in ssv-scanner page
RaekwonIII Feb 5, 2026
00b8fc2
Merge pull request #134 from ssvlabs/essentials3
RaekwonIII Feb 5, 2026
689201f
Added legacy SSV-related fields to DAO values query
RaekwonIII Feb 9, 2026
d7a2efb
Merge branch 'main' into ssv-staking-3
Alex-ssvlabs Feb 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
403 changes: 381 additions & 22 deletions docs/developers/README.md

Large diffs are not rendered by default.

8 changes: 1 addition & 7 deletions docs/developers/SSV-SDK/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,7 @@ sidebar_position: 3

# SSV SDK

:::warning
Development Notice: This SDK is currently under active development and testing. It is not recommended for production use at this time.

This section and SDK are a work in progress and will be continuously updated as new components of the SDK are released.
:::

The SSV SDK is a comprehensive, open-source developer toolkit written in TypeScript, designed to empower developers to seamlessly interact with the SSV Network programmatically. 
The SSV SDK is a comprehensive, open-source developer toolkit written in TypeScript, designed to empower developers to seamlessly interact with the SSV Network programmatically.

It consolidates all necessary tooling into a single, cohesive package.

Expand Down
2 changes: 1 addition & 1 deletion docs/developers/SSV-SDK/examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ sidebar_position: 2

# Examples

In this examples section we will provide quick snippets of code to do certain actions, we will not show the imports/setup for each as this is covered previously. 
In this examples section we will provide quick snippets of code to do certain actions, we will not show the imports/setup for each as this is covered previously.

Each example will also be available in an executable typescript file found in the SDK repo.
4 changes: 2 additions & 2 deletions docs/developers/SSV-SDK/examples/api-calls.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ sidebar_position: 2

# API calls

This page will show how to use the API module to do various calls. The API module is used to get data such as the Account Nonce, or Cluster Snapshot, both are covered on this page. 
This page will show how to use the API module to do various calls. The API module is used to get data such as the Account Nonce, or Cluster Snapshot, both are covered on this page.

For the full list of functions you can check the [API Module Reference](../module-reference/api-module.md).

### Get Nonce 
### Get Nonce

``` typescript
const ownerNonce = await sdk.api.getOwnerNonce({
Expand Down
24 changes: 24 additions & 0 deletions docs/developers/SSV-SDK/examples/cluster-balance-script.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Cluster Balance Calculation

The script below calculates the balance of a cluster on the SSV network. This calculation can be made useful by adding it to cluster balance monitoring tool/automation of your own.

Details on the formulas used can be found in the documentation page related to [Cluster Balance](/stakers/clusters/cluster-balance).

The core calculation function that computes and prints the cluster balance:

```typescript
try {
const { balance, operationalRunway } = await sdk.utils.getClusterBalance({
args: {
operatorIds: [1, 2, 3, 4],
},
});

console.log('Cluster balance result:', {
balance: balance.toString(),
operationalRunway: operationalRunway.toString(),
});
} catch (error) {
console.error('Failed to get cluster balance:', error);
}
```
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ sidebar_position: 3

# Create Validator Keys

The SSV SDK does not natively support programmatically generating keystores out of the box, but a number of external libraries can be used to achieve this. 
The SSV SDK does not natively support programmatically generating keystores out of the box, but a number of external libraries can be used to achieve this.

If you do not need to do this programmatically, it may be easier to use the [Ethereum Staking Deposit CLI](https://github.com/ethereum/staking-deposit-cli) to generate validator keys. To generate Hoodi validator keys you can use [eth-educators' Staking Deposit CLI fork](https://github.com/eth-educators/ethstaker-deposit-cli).

Expand Down
28 changes: 28 additions & 0 deletions docs/developers/SSV-SDK/examples/deposit-eth.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
sidebar_position: 8
---

# Deposit ETH

This page shows how to programmatically deposit ETH to a cluster on the SSV network. This executes the contract call to the smart contract to deposit ETH to the cluster.

### Deposit ETH

```typescript
import { parseEther } from 'viem';

try {
const txnReceipt = await sdk.clusters.deposit({
value: parseEther('0.123')
args: {
id: "ee8881d3c979203025996773ef8a13cb4aac57076e22638dd6ed9b17adcdabfc",
},
},
).then(tx => tx.wait());

console.log('Transaction receipt:', txnReceipt);
} catch (error) {
console.error('Failed to deposit ETH:', error);
}
```

29 changes: 0 additions & 29 deletions docs/developers/SSV-SDK/examples/deposit-ssv.md

This file was deleted.

2 changes: 1 addition & 1 deletion docs/developers/SSV-SDK/examples/register-validator.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ sidebar_position: 5

# Register Validator

This page shows how to progmatically register a validator to the SSV network. Assuming you already have generated a valid keyshare. 
This page shows how to progmatically register a validator to the SSV network. Assuming you already have generated a valid keyshare.

### Register Validator

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
sidebar_position: 9
---

# Withdraw SSV
# Withdraw ETH

This page shows how to programmatically withdraw SSV from a cluster on the SSV network.
This page shows how to programmatically withdraw ETH from a cluster on the SSV network.

### Withdraw SSV
### Withdraw ETH

```typescript
import { parseEther } from 'viem';
Expand All @@ -15,13 +15,13 @@ try {
const txnReceipt = await sdk.clusters.withdraw({
args: {
id: "ee8881d3c979203025996773ef8a13cb4aac57076e22638dd6ed9b17adcdabfc",
amount: parseEther('30'),
amount: parseEther('0.123'),
},
}).then(tx => tx.wait());

console.log('Transaction receipt:', txnReceipt);
} catch (error) {
console.error('Failed to withdraw SSV:', error);
console.error('Failed to withdraw ETH:', error);
}
```

43 changes: 12 additions & 31 deletions docs/developers/SSV-SDK/module-reference/api-module.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@ sdk.api.getOwnerNonce()

Accepts a list of addresses, fetches their nonces using subgraph, returns as a list.

Input parameters:

<table data-header-hidden><thead><tr><th></th><th width="139"></th><th></th><th></th></tr></thead><tbody><tr><td>Input parameter</td><td>Input type</td><td>Description</td><td>Example input</td></tr><tr><td>account_address</td><td>string</td><td>An array of owner addresses.</td><td>[“0xA4831B989972605A62141a667578d742927Cbef9”]</td></tr></tbody></table>

Examples input:
#### Example:

```typescript
const ownerAddress = "0xA4831B989972605A62141a667578d742927Cbef9"
Expand All @@ -35,11 +33,9 @@ Example output:

Accepts a list of addresses, fetches cluster snapshots using subgraph, returns as a list.

Input:

<table data-header-hidden><thead><tr><th></th><th width="116"></th><th></th><th></th></tr></thead><tbody><tr><td>Input parameter</td><td>Input type</td><td>Description</td><td>Example input</td></tr><tr><td>cluster_id</td><td>string</td><td>An array of cluster IDs in their computed ID form.</td><td>[“4c0239091131c3e57e9555c540bcfd00bcd2484a9c4048f13411f22329511131”]</td></tr></tbody></table>

Example:
#### Example:

```typescript
const clusterSnapshot = await sdk.api.getClusterSnapshot({id: clusterID})
Expand All @@ -61,14 +57,13 @@ Example output:

Accepts the owner address and a list of operator IDs, computes and returns the cluster ID hash.

Input:

| Input parameter | Input type | Description | Example input |
| ----------------- | ---------- | ----------------------------- | -------------------------------------------- |
| owner\_address | string | Address of the cluster Owner. | '0x81592c3de184a3e2c0dcb5a261bc107bfa91f494' |
| operator\_ids\[] | integer | List of operator IDs. | \[12, 34, 56, 78] |

Example:
#### Example:

```typescript
import { createClusterId } from '@ssv-labs/ssv-sdk/utils'
Expand All @@ -77,7 +72,7 @@ const operatorIds = [242, 686, 707, 736]
const clusterID = createClusterId(ownerAddress, operatorIds)
```

Example output:&#x20;
Example output:

```bash
1179fed483c8c1b0327c8667521162015fa8cbe1a1b047a26baf0f0971a81929
Expand All @@ -87,11 +82,9 @@ Example output:&#x20;

Accepts a cluster id in it's hashed form. Returns details about the cluster.

Input:

<table data-header-hidden><thead><tr><th></th><th width="116"></th><th></th><th></th></tr></thead><tbody><tr><td>Input parameter</td><td>Input type</td><td>Description</td><td>Example input</td></tr><tr><td>cluster_id</td><td>string</td><td>A cluster ID in it's computed form</td><td>“4c0239091131c3e57e9555c540bcfd00bcd2484a9c4048f13411f22329511131”</td></tr><tr><td>daoAddress</td><td>string</td><td>Address of the DAO (chain specific)</td><td>"0x38A4794cCEd47d3baf7370CcC43B560D3a1beEFA"</td></tr><tr><td>operatorIds</td><td>string[]</td><td>A list of operator Ids</td><td>[1,2,3,4]</td></tr></tbody></table>

Example:
#### Example:

```typescript
const ownerAddress = "0xA4831B989972605A62141a667578d742927Cbef9"
Expand All @@ -116,11 +109,9 @@ Example output:

Accepts a cluster id in it's hashed form. Returns details about the cluster.

Input:

<table data-header-hidden><thead><tr><th></th><th width="116"></th><th></th><th></th></tr></thead><tbody><tr><td>Input parameter</td><td>Input type</td><td>Description</td><td>Example input</td></tr><tr><td>cluster_id</td><td>string</td><td>An array of cluster IDs in their computed ID form.</td><td>[“4c0239091131c3e57e9555c540bcfd00bcd2484a9c4048f13411f22329511131”]</td></tr></tbody></table>

Example:
#### Example:

```typescript
const clusterData = await sdk.api.getCluster({id: clusterID})
Expand All @@ -141,13 +132,11 @@ Example output:

### `getClusters(owner)`

Accepts an owner address. Returns details about all of the clusters that they own.&#x20;

Input:
Accepts an owner address. Returns details about all of the clusters that they own.

<table data-header-hidden><thead><tr><th></th><th width="116"></th><th></th><th></th></tr></thead><tbody><tr><td>Input parameter</td><td>Input type</td><td>Description</td><td>Example input</td></tr><tr><td>owner</td><td>string</td><td>An owner address</td><td>"0xA4831B989972605A62141a667578d742927Cbef9"</td></tr></tbody></table>

Example:
#### Example:

```typescript
const ownerAddress = "0xA4831B989972605A62141a667578d742927Cbef9"
Expand Down Expand Up @@ -183,11 +172,9 @@ Example output:

Accepts an operator ID and returns details about the operator.

Input:

<table data-header-hidden><thead><tr><th></th><th width="116"></th><th></th><th></th></tr></thead><tbody><tr><td>Input parameter</td><td>Input type</td><td>Description</td><td>Example input</td></tr><tr><td>id</td><td>string</td><td>A single operator ID</td><td>"4"</td></tr></tbody></table>

Example:
#### Example:

```typescript
const operatorData = await sdk.api.getOperator({id: "4"})
Expand All @@ -210,11 +197,9 @@ Example output:

Accepts a list of operator IDs and returns details about them.

Input:

<table data-header-hidden><thead><tr><th></th><th width="116"></th><th></th><th></th></tr></thead><tbody><tr><td>Input parameter</td><td>Input type</td><td>Description</td><td>Example input</td></tr><tr><td>operatorIds</td><td>string[]</td><td>A single operator ID</td><td>["4","5"]</td></tr></tbody></table>

Example:
#### Example:

```typescript
const operatorData = await sdk.api.getOperators({operatorIds: ["4","5"]})
Expand Down Expand Up @@ -247,11 +232,9 @@ Example output:

Accepts a validator ID and returns details about the validator.

Input:

<table data-header-hidden><thead><tr><th></th><th width="116"></th><th></th><th></th></tr></thead><tbody><tr><td>Input parameter</td><td>Input type</td><td>Description</td><td>Example input</td></tr><tr><td>id</td><td>string</td><td>A single validator ID</td><td>0x0c74493afd8082f86485e4172be72678b0feb1494087ee6abe7d7ea7437c2a3fc6c06193040c6e24cdf59c9081d1c7a9</td></tr></tbody></table>

Example:
#### Example:

```typescript
const validatorData = await sdk.api.getValidators({id: "0x0c74493afd8082f86485e4172be72678b0feb1494087ee6abe7d7ea7437c2a3fc6c06193040c6e24cdf59c9081d1c7a9"})
Expand All @@ -269,11 +252,9 @@ Example output:

Accepts an validator ID and returns details about the validator.

Input:

<table data-header-hidden><thead><tr><th></th><th width="116"></th><th></th><th></th></tr></thead><tbody><tr><td>Input parameter</td><td>Input type</td><td>Description</td><td>Example input</td></tr><tr><td>ids</td><td>string[]</td><td>An array of validator IDs</td><td>["0x0c74493afd8082f86485e4172be72678b0feb1494087ee6abe7d7ea7437c2a3fc6c06193040c6e24cdf59c9081d1c7a9", "0x1a85052f3b9d17e73ec76c472220c80ada65a19a0fd177344b1e9f6173d51136c400120989dbd9ff498defc99dfe5181"]</td></tr></tbody></table>

Example:
#### Example:

```typescript
const validatorData = await sdk.api.getValidators({id: ["0x0c74493afd8082f86485e4172be72678b0feb1494087ee6abe7d7ea7437c2a3fc6c06193040c6e24cdf59c9081d1c7a9", "0x1a85052f3b9d17e73ec76c472220c80ada65a19a0fd177344b1e9f6173d51136c400120989dbd9ff498defc99dfe5181"]})
Expand Down
Loading