# utils sub-class
The following readme describes all the functions and their parameters exposed by the `utils` class of the Stakehouse SDK.  

## checkKeystorePass function
This function allows to validate the password being provided to with the keystore file.  

### Input Parameters
password: String provided by the user for the keystore file  

### Using checkKeystorePass function
```js
await sdk.utils.checkKeystorePass(password);
```

### Return Parameter
Returns boolean values. If the password is valid, it returns true, otherwise false.  

## add0x function
`add0x` function checks if a parameter has `0x` in front, if not, then it adds it.  

### Input Parameters
data: String, Buffer or Object where `0x` may be needed    

### Using add0x function
```js
await sdk.utils.add0x(data);
```

### Return Parameter
Returns data with `0x` in front.  


## remove0x function
`remove0x` function checks if a parameter has `0x` in front, if yes, then it removes it.  

### Input Parameters
data: String, Buffer or Object where `0x` shouldn't be  

### Using remove0x function
```js
await sdk.utils.remove0x(data);
```

### Return Parameter
Returns data without `0x` in front.  

## getPersonalSignInitials function
It is used to sign a message containing `blsPublicKey`, `blsSignature`, `lifecycleStatus` and `deadline` which makes sure that that the message signer is the owner or the representative of the provided `blsPublicKey`. This method is a crucial step for the deposit router to stake and create a validator.  

### Input Parameters
blsPublicKey: BLS Public Key of user  
blsSignature: BLS Signature corresponding to the BLS Public Key  
account: ETH1 account address corresponding to the BLS Public Key

### Using getPersonalSignInitials function
```js
await sdk.utils.getPersonalSignInitials(blsPublicKey, blsSignature, account);
```

### Return Parameter
Returns a JSON data comprising of JSON message, hex of the JSON message, and signature of the hex.  

## generateCredentials function
It is used to generate BLS credentials (deposit data file and the keystore) protected by the user provided password. It also provides an option to store the generated files in the user provided location. It is an optional feature to write the generated BLS keystore to a specific location on the file system. However, such a feature is not available from the browser.  

### Input Parameters
password: User's password  

### Using generateCredentials function
```js
await sdk.utils.generateCredentials(password);
```

### Return Parameter
Returns a JSON data comprising of depositObject and keystore.  
```js
{
  "depositObject": [
    {
      "pubkey": "9584423b45c1d8919fdc0caec208b72a11ee0582790a49f97364fb6...",
      "withdrawal_credentials": "010000000000000000000000f847b44695d33e9...",
      "amount": 32000000000,
      "signature": "a531bf2f681a442df6cfb72999534af919fef5af51f4c29e8905...",
      "deposit_message_root": "3805f963284b308fc274fed64062c61995113feb3...",
      "deposit_data_root": "25aa910ceb901858c76add081c3aa45fb60414e7ea99...",
      "fork_version": "00001020",
      "eth2_network_name": "prater",
      "deposit_cli_version": "1.2.0"
    }
  ],
  "keystore": {
    "version": 4,
    "uuid": "c7534e8b-445e-4697-a554-125af3354e6d",
    "path": "m/12381/60/0/0",
    "pubkey": "9584423b45c1d8919fdc0caec208b72a11ee0582790a49f97364fb650...",
    "crypto": {
      "kdf": {
        "function": "pbkdf2",
        "params": {
          "dklen": 32,
          "c": 262144,
          "prf": "hmac-sha256",
          "salt": "81c430ea7f43ee3a527d8282e758a01545902842849e637f27770..."
        },
        "message": ""
      },
      "checksum": {
        "function": "sha256",
        "params": {},
        "message": "e4180d47bd4de58452189048e4d1862eb8a2c98fabcad1acb5a7..."
      },
      "cipher": {
        "function": "aes-128-ctr",
        "params": {
          "iv": "4379bdef0f24af9a12f9e071c6db60e3"
        },
        "message": "ed1e79d52b7aaa22965158deb330f57b21a8f7bcbeb3752b2a73..."
      }
    }
  }
}
```  

## getValidatorLifecycleStatus function
It returns the lifecycle status of the validator.  

### Input Parameters
blsPublicKey: BLS Public Key of the Validator  

### Using getValidatorLifecycleStatus function
```js
await sdk.utils.getValidatorLifecycleStatus(blsPublicKey);
```

### Return Parameter
Returns lifecycle status of the validator which can range from 0 to 4.  
* UNBEGUN = 0  
* INITIALS_REGISTERED = 1  
* DEPOSIT_COMPLETED = 2   
* TOKENS_MINTED = 3  
* EXITED = 4  

## formDepositDataRoot function
It is used to form DepositData SSZ object required by Ethereum Foundation deposit contract. The exact fields are specified in the Beacon Chain spec found [here](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#depositdata).  

### Input Parameters
blsPublicKey: BLS Public Key  
blsSignature: BLS Signature  

### Using formDepositDataRoot function
```js
await sdk.utils.formDepositDataRoot(blsPublicKey, blsSignature);
```

### Return Parameter
Returns depositData.  

## getLastDepositIndex function
It is used to get the last deposit Index.  

### Input Parameters
blsPublicKey: BLS Public Key of the Validator  

### Using getLastDepositIndex function
```js
await sdk.utils.getLastDepositIndex(blsPublicKey);
```

### Return Parameter
Returns the last deposit index.  

## getDETHBalanceInIndex function
This function allows users to fetch their dETH balance in the Index.  

### Input Parameters
blsPublicKey: BLS Public Key  

### Using getDETHBalanceInIndex function
```js
await sdk.utils.getDETHBalanceInIndex(blsPublicKey);
```

### Return Parameter
Returns the dETH balance  

## getSLOTBalanceInVault function
This function allows users to fetch their collateralised SLOT balance.

### Input Parameters
stakehouseAddress: Stakehouse address of the KNOT  
userAddress: Ethereum execution layer address of the user  
blsPublicKey: BLS Public Key of the KNOT  

### Using getSLOTBalanceInVault function
```js
await sdk.utils.getSLOTBalanceInVault(stakehouseAddress, userAddress, blsPublicKey);
```

### Return Parameter
Returns the collateralised SLOT balance in Big Numbers

## getsETHAddress function
This function allows users to get the sETH token address. sETH address differs for every Stakehouse.

### Input Parameters
stakehouseAddress: Stakehouse address of the KNOT

### Using getsETHAddress function
```js
await sdk.utils.getsETHAddress(stakehouseAddress);
```

### Return Parameter
Returns the sETH address.  

## getsETHBalance function
This function allows users to fetch their sETH balance.

### Input Parameters
stakehouseAddress: Stakehouse address of the KNOT  
userAddress: Ethereum execution layer address of the user  

### Using getsETHBalance function
```js
await sdk.utils.getsETHBalance(stakehouseAddress, userAddress);
```

### Return Parameter
Returns the sETH balance in Big Numbers  

## getGenericERC20WalletBalance function
This function allows users to get the balance of any ERC-20 token they hold in their wallet.

### Input Parameters
tokenAddress: ERC-20 token address  
userAddress: Ethereum execution layer address of the user  

### Using getGenericERC20WalletBalance function
```js
await sdk.utils.getGenericERC20WalletBalance(tokenAddress, userAddress);
```

### Return Parameter
Returns the ERC-20 balance for a particular token that the user hold.  

## currentSlashedAmountOfSLOTForKnot function
This function allows users to know the amount of SLOTs slashed for a particular KNOT.  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT

### Using currentSlashedAmountOfSLOTForKnot function
```js
await sdk.utils.currentSlashedAmountOfSLOTForKnot(blsPublicKey);
```

### Return Parameter
Returns the amount of SLOTs slashed for a particular KNOT.  

## calculateExitFee function
This function allows users to know the amount of ETH required to exit the Stakehouse.

### Input Parameters
authenticatedReport: Report returned by the `authenticateReport` function  

### Using calculateExitFee function
```js
await sdk.utils.calculateExitFee(authenticatedReport);
```

### Return Parameter
Returns the exit fees in Big Numbers.  

## getNumberOfCollateralisedSlotOwnersForKnot function
This function allows users to know the number of collateralised owners for a KNOT. If a KNOT has been slashed and some other user tops up this KNOT, then the other user becomes a collateralised owner of this KNOT.  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT  

### Using getNumberOfCollateralisedSlotOwnersForKnot function
```js
await sdk.utils.getNumberOfCollateralisedSlotOwnersForKnot(blsPublicKey);
```

### Return Parameter
Returns the number of owners for a KNOT in Big Numbers.  

## getStakehouseRedemptionRate function
This function allows users to fetch the redemption rate for any Stakehouse. Learn more about SLOT tokens (sETH) [here](https://docs.joinstakehouse.com/protocol/learn/slottokens).  

### Input Parameters
stakehouseAddress: Stakehouse address for which the user wants to know the redemption rate of  

### Using getStakehouseRedemptionRate function
```js
await sdk.utils.getStakehouseRedemptionRate(stakehouseAddress);
```

### Return Parameter
Returns the redemption rate for a stakehouse.  

## getStakehouseExchangeRate function
This function allows users to get the exchange rate for a Stakehouse. The exchange rate works between sETH and SLOT. Learn more about SLOT tokens (sETH) [here](https://docs.joinstakehouse.com/protocol/learn/slottokens).  

### Input Parameters
stakehouseAddress: Stakehouse address that the user wants to get the exchange rate of  

### Using getStakehouseExchangeRate function
```js
await sdk.utils.getStakehouseExchangeRate(stakehouseAddress);
```

### Return Parameter
Returns the exchange rate of a stakehouse.  

## getStakehouseSETHRedemptionThreshold function
This function allows users to get the redemption threshold for sETH for a particular Stakehouse. The redemption threshold is the total number of collateralised sETH a user must hold across all KNOTs in a house in order to Rage Quit. It is equal to 4 SLOT * redemption rate.  

### Input Parameters
stakehouseAddress: Stakehouse address

### Using getStakehouseSETHRedemptionThreshold function
```js
await sdk.utils.getStakehouseSETHRedemptionThreshold(stakehouseAddress);
```

### Return Parameter
Returns the sETH redemption threshold.  

## getTotalUserCollateralisedSETHBalanceInHouse function
This function allows users to fetch the collateralised sETH balance for a Stakehouse.  

### Input Parameters
stakehouseAddress: Stakehouse address  
userAddress: Ethereum execution layer address

### Using getTotalUserCollateralisedSETHBalanceInHouse function
```js
await sdk.utils.getTotalUserCollateralisedSETHBalanceInHouse(stakehouseAddress, userAddress);
```

### Return Parameter
Returns the sETH balance for the Stakehouse.  

## totalFundsInKNOTQueue function
This function allows users to fetch the ETH amount in the queue. The queue will have a non zero amount of ETH for a given knot if SLOT has been topped up and the aggregate of the top ups are less than 1 ETH.  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT  

### Using totalFundsInKNOTQueue function
```js
await sdk.utils.totalFundsInKNOTQueue(blsPublicKey);
```

### Return Parameter
Returns the balance in Big Numbers.  

## associatedIndexIdForKnot function
This function allows users to find the primary index for a KNOT.  

### Input Parameters
blsPublicKey: BLS Public of the KNOT

### Using associatedIndexIdForKnot function
```js
await sdk.utils.associatedIndexIdForKnot(blsPublicKey);
```

### Return Parameter
Returns the index ID for the KNOT in Big Numbers.  

## rageQuitChecks function
This function allows users to check if a particular KNOT is eligible to Rage Quit.  

### Input Parameters
stakehouseAddress: Stakehouse address of the KNOT  
userAddress: Ethereum execution layer address of the user (to whom the KNOT belongs)  
authenticatedReport: report returned by the `authenticateReport` function  

### Using rageQuitChecks function
```js
await sdk.utils.rageQuitChecks(stakehouseAddress, userAddress, authenticatedReport);
```

### Return Parameter
Returns `true` if the KNOT is eligible to Rage Quit. Otherwise, it throws an error.

## indexIdToOwner function
This function allows the user to fetch the owner of an index.  

### Input Parameters
indexID: savETH index ID

### Using indexIdToOwner function
```js
await sdk.utils.indexIdToOwner(indexID);
```

### Return Parameter
Returns index owner's address.  

## isBalanceLower function
This function allows the user to check if the KNOT's balance is below the last known balance.  

### Input Parameters
beaconNodeURL: Beacon Node URL  
blsPublicKey: BLS Public Key of the KNOT  

### Using isBalanceLower function
```js
await sdk.utils.isBalanceLower(beaconNodeURL, blsPublicKey);
```

### Return Parameter
Returns an object which contains `result`, `metadata` and `report`.  
`result`: boolean. `true` if the  balance is lower and `false` otherwise  
`metadata`: object containing the last known balance and current balance  
`report`: authenticated balance report.  

## dETHToSavETH function
This function allows the users to find the equivalent amount of savETH for their dETH tokens.

### Input Parameters
amount: amount of dETH tokens

### Using dETHToSavETH function
```js
await sdk.utils.dETHToSavETH(amount);
```

### Return Parameter
Returns the equivalent amount of savETH in Big Numbers.  

## savETHToDETH function
This function allows the user to get the equivalent amount of dETH for their savETH.  

### Input Parameters
amount: amount of savETH tokens  

### Using savETHToDETH function
```js
await sdk.utils.savETHToDETH(amount);
```

### Return Parameter
Returns the savETH amount in Big Numbers.  

## dETHRewardsMintedForKNOT function
This function allows user to fetch the dETH rewards for a particular KNOT  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT

### Using dETHRewardsMintedForKNOT function
```js
await sdk.utils.dETHRewardsMintedForKNOT(blsPublicKey);
```

### Return Parameter
Returns the amount of dETH rewards minted in Big Numbers.  

## dETHRequiredForIsolation function
This function helps the user to calculate the dETH required to isolate the KNOT.  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT  

### Using dETHRequiredForIsolation function
```js
await sdk.utils.dETHRequiredForIsolation(blsPublicKey);
```

### Return Parameter
Returns the dETH amount in Big Numbers.  

## savETHRequiredForIsolation function
This function allows users to calculate the amount of savETH required to isolate a KNOT.  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT

### Using savETHRequiredForIsolation function
```js
await sdk.utils.savETHRequiredForIsolation(blsPublicKey);
```

### Return Parameter
Returns the amount in Big Numbers.  

## getKNOTNonce function
This function allows users to get the nonce for a KNOT. 

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT

### Using getKNOTNonce function
```js
await sdk.utils.getKNOTNonce(blsPublicKey);
```

### Return Parameter
Returns the nonce.  

## getLastKnownReportForKNOT function
This function allows users to get the last Balance Report for a KNOT.  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT  

### Using getLastKnownReportForKNOT function
```js
await sdk.utils.getLastKnownReportForKNOT(blsPublicKey);
```

### Return Parameter
Returns the Balance Report object.  

## updateSavETHIndexName function
This function allows the user to update the name of their savETH index.  

### Input Parameters
indexID: index ID of user's index  
name: new name for the index  

### Using updateSavETHIndexName function
```js
await sdk.utils.updateSavETHIndexName(indexID, name);
```

### Return Parameter
Returns the transaction data  

## topUpSlashedSlot function
This function allows users to top-up a KNOT that has been leaking.  

### Input Parameters
stakehouseAddress: Stakehouse address of the KNOT  
blsPublicKey: BLS Public Key of the KNOT  
recipient: Ethereum execution layer address of the recipient of the collateralised SLOT  
amount: number of slashed SLOTs to top-up. (0 < amount <= slashed SLOTs)  
ethValue: ETH to be provided to the function.

### Using topUpSlashedSlot function
```js
await sdk.utils.topUpSlashedSlot(stakehouseAddress, blsPublicKey, recipient, amount, ethValue);
```

### Return Parameter
Returns the transaction data  

## topUpSlashedSlotWithOneEth function
This function allows users to top-up slashed KNOTs with 1 ETH.  

### Input Parameters
stakehouseAddress: Stakehouse address of the KNOT  
blsPublicKey: BLS Public Key of the KNOT  
recipient: Ethereum execution layer address of the depositor of KNOT  

### Using topUpSlashedSlotWithOneEth function
```js
await sdk.utils.topUpSlashedSlotWithOneEth(stakehouseAddress, blsPublicKey, recipient);
```

### Return Parameter
Returns the transaction data.  

## topUpKNOT function
This function allows users to top-up any KNOT.  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT  
ethValue: amount of ETH to top-up the KNOT  

### Using topUpKNOT function
```js
await sdk.utils.topUpKNOT(blsPublicKey, ethValue);
```

### Return Parameter
Returns the transaction data.  

## topUpKNOTWithOneEth function
This function allows users to top-up any KNOT with 1 ETH.  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT.  

### Using topUpKNOTWithOneEth function
```js
await sdk.utils.topUpKNOTWithOneEth(blsPublicKey);
```

### Return Parameter
Returns the transaction data.  

## dETHMetadata function
This function allows the users to get the metadata related to dETH such as dETH in circulation and dETH in Open Index.  

### Using dETHMetadata function
```js
await sdk.utils.dETHMetadata();
```

### Return Parameter
Returns the metadata.  

## getStakehouse function
This function allows users to fetch the Stakehouse address for any KNOT  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT.  

### Using getStakehouse function
```js
await sdk.utils.getStakehouse(blsPublicKey)
```

### Return Parameter
Returns the Stakehouse address if the KNOT exists in the Stakehouse Universe. Otherwise, zero address is returned.  

## isPartOfStakehouse function
This function allows users to check if the KNOT is a part of Stakehouse universe or not.  

### Input Parameters
blsPublicKey: BLS Public Key of the KNOT.  

### Using isPartOfStakehouse function
```js
await sdk.utils.isPartOfStakehouse(blsPublicKey)
```

### Return Parameter
Returns boolean. `true` if the KNOT exists, `false ` otherwise.  