Utils Module

This is a library which contains all the helper functions you need for working with SSV, such as creating validator keys.

After instantiating the SDK, you can call any of the functions in the utils library like so:

sdk.utils.generateKeyShares()

Function List

generateKeyShares()

Accepts all parameters necessary to compute the keyshares, does this in the background using ssv-keys library, returns the keyshares as an object or saves it to file.

Input:

Input parameter

Input type

Description

Example input

operator_keys[]

string

List of operator public keys to register the validator to.

["LS0tLS1CRUdJTi...", "LS0tLS1CRUdJTi...", "LS0tLS1CRUdJTi...", "LS0tLS1CRUdJTi..."]

operator_ids[]

integer

List of operator IDs to register the validator to.

[12, 34, 56, 78]

keystore

string

Validator keystore file created when generating the validator. Passed as object programmatically or file path.

‘./path-to-keystore.json'

keystore_password

string

Password for the attached keystore file.

‘123’

owner_address

string

Address of the validator Owner.

'0x81592c3de184a3e2c0dcb5a261bc107bfa91f494'

nonce

bigint

Nonce of the owner address

24

Example:

const ownerAddress = "0xA4831B989972605A62141a667578d742927Cbef9"
let nonce = Number(await sdk.api.getOwnerNonce({ owner: ownerAddress}))

const keysharesPayload = await sdk.utils.generateKeyShares({
  keystore: keystoresObject, 
  keystore_password: 'your_password' ,
  operator_keys: ['LS0...','LS1...','LS2...','LS3...',],
  operator_ids: ['1', '2', '3', '4'],
  owner_address: ownerAddress as string,
  nonce: nonce,
})

Example output:

{
  publicKey: '0x85de8923674d90f4fa8add44b2dcb0d0332f83b363249ac49a0d09764909dfbf3701bdcd3c5a5ed7791479cbe12884c1',
  operatorIds: [ 5, 8, 9, 10 ],
  sharesData: '0x8ad906de9eb4dd857c9d3fc9fda8e40aac033d672d5a689417668a3866c63312476628d76c2487797814f26044d71650149f28055e0de616388e283cba1a5b1ac1f46f7328d78fb5c7d1ce1d8752021ff5c18f8680898469702c4fc236dd8ea388278ee2cbe049b4f0170a5bf044721a66e43272cec0c09bcba2d0b8f166ebcc2510edda86f947da1e81e5af8b385ec18aa4b30a74052b8bda41ed71ad012251a5aaa3f5a732ce8119891fe5ffa3e0b519a26ec238d56d43a014475460333e528463c08ec8eaa3b144b2322fb4eb9a6bbb5fe28f17da02b35b07903d4d3a011755c43019003fc276ba22283ea4221899b98412e17a112fda41e4b39d107d54ec060244dc076ea65bdf0205738e9f5cd6fada754dbcd96a59e0bad9bbccde605277e24fffa8b8f53d3cf2f4931a1ab4ab7bed3c52c656cc3f6065d49c9480f007647a3674415a2b25fa7adcb62714b11a5a4ee9f96ee34c8e99d2f465d74d62a74976572169a1225278594e4dfa84c39ff23ebf495e6004ab2c6cb30bf570883421717354904589cfd0222b146e1f1f541246b05a9cb7c3941ada19bd23af9f22613418e694ebe0aa2f072facf177c1e6ddc32413ecb1f80313fd9fcd67d5cbe65e1cb80443b9762619bc90de59dc5b875ab0c59ff70d084d03f2983920d6e4980c271f579ce30a20304e1414f3bc5e1c0b9a6b81f581c76cb232f89340cce0a9254e89b9d48eee1a3c1a6c24c67245bd62b1355bc1ad4abfd9c628505731af0e7340f3ae20b9be61ddf17a4a46feea80bc2b770197f5953dba267fe980c2493aad7f071b87881ab29d962a7f9a2c8ef015066db3c95f99f78eaa1bc63aa318231129ac902539bac3bd95fa5a2f58bc3caa524704043d0494d3a18b69f127f1802863aa35cdb5b8ff8e0365798451d9901997e2e083d1830718baaaa605217f2810129dd92ced98df4317dea4604fd35968292a81846802d28eec75278655feb8a8712a243712d8899a4a69eafaa4bcd9598c8c1c1230cb4e8d5d4549dc1ddcb696bb2e7ba7fb699829d98e4ac3ae3123473162899746e75c85e6c65d39727f27dfb56ca966dc27a17b95eb2901b9c1c8cea3b1403d0266d1566c56ba881f5ee9255ab22b79a5bf319b87896ce133c2b8ff52642f2b61ea0c1f94e8c4e019537eb60f1a4555c91c226a6d1d55592e59c94a23a72b44b343160ff0f14f53f56f88df933613c44fab4945eab0f1450d7df427af0b968cb1010ed05037f8cf3660a5e1df2cd5280b0c3ce88f858174008f1ea4ca1c71cb235791d0e26b8007bdaee94049f84d0c09dafda5cbbdc66cfb716d069afca8ac1329ed0b87df87118213d9a185ee1a3e0627f755d4772f723f413db90dafd56b9122aa627ead2d4914a26d8dfdae3a9e232a11f303c461736d551f229f324d3fb3febb9bbbc7de4cc19f902a462bdc94466b52314587f2fdf23b7ef2763ab33cd4d71c67dff9f65304c70eb076a33496ccc6e03f7ddd9a121739e001cbcfc79f1b9c0b659156b79297a093e676c06e2b6db1c18ccaa6f0f791b53d4c9b78e2a165ccf1054dffe737dfa5dfeede1886e6ff1f19401a4cc62e92007638b5c80c148acb4042c8f8c322ae1cc611ba1759f0e663a36ffabfe3ebea580a52cb58cc37d18af0ad02e7013c5c01c1f13cb94520930b4e890139b51a0e3d0e5cbcf17b9351d95afe49b8aacfa5aa2888a68fdf7579eb5b97c1b4593a5898322a01b60ada759e9b3c46c3890ebf2040d5e8a9f1d065f62edcb6c5fc1516e9ed6828ffe58d289bfc88888c18f8cc7f68a62b1fbd36c1de881c4cd783cb1450a1d7d23d985bf56a42b8477089a4bfc148'
}

validateKeysharesJSON()

Checks a JSON file of keyshares and returns whether it is valid or not.

Input Parameter

Input Type

Description

Example Input

operators

'id[]' | 'publicKey[]'

Array of operator ids or public keys

OperatorArrayObject

keyshares

string | object

Generated keyshares

Keyshares json file

Example:

const operatorObjectArray = [{
  publicKey: string
  id: string
}]

await sdk.utils.validateKeysharesJSON({
        account: '0x012f55B6Cc5D57F943F1E79cF00214B652513f88',
        operators: operatorObjectArray,
        keyshares: keyshareFile,
      });

Example output:

{
  available: [
    KeySharesItem {
      error: undefined,
      data: [KeySharesData],
      payload: [KeySharesPayload]
    },
    KeySharesItem {
      error: undefined,
      data: [KeySharesData],
      payload: [KeySharesPayload]
    },
    KeySharesItem {
      error: undefined,
      data: [KeySharesData],
      payload: [KeySharesPayload]
    },
    KeySharesItem {
      error: undefined,
      data: [KeySharesData],
      payload: [KeySharesPayload]
    }
  ],
  registered: [],
  incorrect: []
}

validateSharesPreRegistration()

Checks keyshares json file and returns whether it is valid or not.

Input Parameter

Input Type

Description

Example Input

operatorIds

'id[]' | 'publicKey[]'

Array of operator ids or public keys

['1','2','3','4']

keyshares

string | object

Generated keyshares

Keyshares json file

Example:

const validatedShares = await sdk.utils.validateSharesPreRegistration({
    keyshares: keysharesJsonFile,
    operatorIds: ['242','686','707','736'],
 });

Example output:

{
  available: [
    KeySharesItem {
      error: undefined,
      data: [KeySharesData],
      payload: [KeySharesPayload]
    },
    KeySharesItem {
      error: undefined,
      data: [KeySharesData],
      payload: [KeySharesPayload]
    },
    KeySharesItem {
      error: undefined,
      data: [KeySharesData],
      payload: [KeySharesPayload]
    },
    KeySharesItem {
      error: undefined,
      data: [KeySharesData],
      payload: [KeySharesPayload]
    }
  ],
  registered: [],
  incorrect: []
}

getOperatorCapacity()

Checks how many validators an operator has registered, compares it with the maximum amount of validators that can be registered, and returns the amount that can be registered.

Input Parameter

Input Type

Description

Example Input

id

string

Operator ID

"1"

Example:

const result = await getOperatorCapacity('1')

Example output:

5 // number of validators that the operator can register

getClusterBalance()

Returns the balance of a cluster.

Input Parameter

Input Type

Description

Example Input

operatorIds

number[]

Operator ID array

[1,2,3,4]

Example:

const result = await getClusterBalance([1,2,3,4])

Example output:

{
    balance: 1728318231823, // ssv in wei
    operationalRunway: 123, // days left in cluster runway
 }

Last updated