Skip to main content


To do batch staking operations within LSD contract, you will need the LSD wizard SDK:

The SDK allows you to easily get an ethers.js contract instance for the LSD network:

For example just supply your liquid staking network address in this function:

const contract = (await wizard.contractInstance).liquidStakingManager(LIQUID_STAKING_MANAGER_ADDRESS);

If you don’t know your liquid staking derivative network manager address, it can be queried here:

You can then use the following batch functions (signatures from LSD contracts):

function registerBLSPublicKeys(
bytes[] calldata _blsPublicKeys,
bytes[] calldata _blsSignatures,
address _eoaRepresentative


function stake(
bytes[] calldata _blsPublicKeyOfKnots,
bytes[] calldata _ciphertexts,
bytes[] calldata _aesEncryptorKeys,
IDataStructures.EIP712Signature[] calldata _encryptionSignatures,
bytes32[] calldata _dataRoots

The functions allow performing batch staking operations when registering a BLS public key or when staking with Ethereum deposit contract respectively.

Some of the params for stake() require the use of the Stakehouse protocol SDK using the EOA that you registered with registerBLSPublicKeys function above:

As long as there is an active stake session with the Ethereum deposit contract, it will not be possible to do further deposit contract staking as a node operator until the derivatives for that stake session have been minted. For example: if you have staked 8 validators with the Ethereum deposit contract, you will need to mint those derivatives before proceeding to stake more BLS keys. There is no limitation (outside of the block limits) to how many BLS keys that can be staked with an LSD network. Anyone can mint the derivatives of any validator within any liquid staking network via the above LSD wizard SDK meaning LP holders from LSD networks are never grieved.