Getting Started
To start staking on the SSV network using our DVT Staking API, there are a few essential prerequisites to ensure a smooth and efficient setup:
- Minimum Stake Requirement: You will need a minimum of 32 ETH for each staking validator you wish to run.
- Pectra Upgrade: Creation and consolidation of 0x02 type validators is now supported.
- SSV Tokens: To operate validators on the SSV network, holding at least 2.37 SSV tokens per validator is recommended to cover yearly operational costs.
- API Key Request: Get an authentication token to start using DVT Staking API.
Steps
1. Prepare an request id
which is UUID, Generate it with this uuid npm package.
2. Create a order to set up staking SSV nodes through Ebunker infrastructure
sending a POST request to API.
Example Request
curl --request POST \
--url https://api.hoodi.estake.ebunker.io/api/v1/eth/staking/ssv/order \
--header 'accept: application/json' \
--header 'authorization: Bearer <token>' \
--header 'content-type: application/json' \
--data '
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa5",
"validatorsCount": 1,
"amount": 2048,
"credentialsType": "0x02",
"withdrawalAddress": "0x39D02C253dA1d9F85ddbEB3B6Dc30bc1EcBbFA17",
"feeRecipientAddress": "0x39D02C253dA1d9F85ddbEB3B6Dc30bc1EcBbFA17",
"ssvOwnerAddress": "0x39D02C253dA1d9F85ddbEB3B6Dc30bc1EcBbFA17",
"operationPeriodInDays": 30
}
Parameters
- id — arbitrary UUID. You can later use that UUID to check the status of the set-up operation.
- validatorsCount — Number of validators. One validator represents between 32 to 2048 ETH.
- amount — The staking amount for each validator, valued in ETH.
- credentialsType — Type of validator, either 0x01 or 0x02.
- withdrawalAddress — withdrawal address for the client. This address is also used as the validator owner's address and must be - used to sign the transaction to register the SSV validator at step 6.
- feeRecipientAddress — Eth1 address that receives the fee recipient rewards. This parameter only generates transactions to update the fee address and will only take effect after the corresponding transaction is executed.
- ssvOwnerAddress — address that acts as the owner of the SSV cluster. The cluster owner can register the validator, update the - fee recipient address, top-up the cluster balance, and claim SSV incentives rewards.
- operationPeriodInDays— operation period in days.
Example response
{
"code": 200,
"message": "success"
}
3. Check the node set-up order's status
sending a POST request to API.
Example request:
curl -X 'GET' \
'https://api.hoodi.estake.ebunker.io/api/v1/eth/staking/ssv/order?id=123' \
-H 'accept: application/json'
- id — UUID that was specified in the SSV set-up request.
Example response:
{
"code": 200,
"message": "Success",
"result": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa5"",
"status": "ready",
"type": "without-encrypt-key",
"amount": 33,
"credentialsType": "0x02",
"operationPeriodInDays": 150,
"liquidationPeriodInDays": 30,
"ecdhPublicKey": "",
"encryptedShares": [
{
"publicKey": "0x8d8fe7ca46fe98384eb5120b99525d61559fd6ec47b566331f7881fb76357aa97d5d1f4247ee0e7930de2017c62d27bc",
"nonce": 20,
"sharesData": "0x8c3845ab84aa6753c7821e37dd2f545c083364a917d6754df55c0377dc4a52519289d04e40c8b7573cdd53c28b17e30611da7c72c41679bd58024d3d6fc1e8f00ba8f60e2efb59997b7aed3eef13f6e4a6f10c5071c8a52c8fea7c3b2c06561cafeaad949fe418806a4a3c9923ceecf84eeba7f931ffc02e0054c3e028baf7b32d062c04b7ebdb6eb5ed17af27080bd0b7972484c2af8dacee0f481462099493774855adc6417fd0aedf0fac28762c3e674b235a8715bdc47e8aede848e3632eb48b1f1c645a267a259eedb15cc37781989d6da9221d4adcc2fa901dd00031c649600bb4a05e5f72632492865bf11aefad1d0598c418d2d2040a1fa2658da0bc9b8390a0779c22b75716c09ccb93147050f65e83aff3f9ea297b17bc8d830edc8877b3c2ea45f74bfd0f4e1da02ea0d99139b15235111d79264c41e948fc3a1a702fd9ac9a9501364aaba148b0535be6132bfb2a532742012df7240d0540ccd3b2fa8ded09d92af5c7397c62b175776f8dea59d8029d73ed05d9c521aff2a6e3c749669b36e567d7b1e6825cb58c00da061797140ecd11099bdbae87996b2c14e1f89035b26bc00f9d91ce241f2dda6ddcaee9a6c641faf194cf992d2ece03c7fc8fa96973ea0a65474a82cf8ae48e455ecb55adfe3b392396b990339e0e6b24e568a15e8ca4973f48ce967f50ff7b2897bba0d6372f45c76ded138e3187c3876ffb09e8dc2e15b24a538322fb35a051dab39b2f318dea88249c34341acefccd175d4321e4c6f715303897a65750e8279102d6f6cfa5e8f9d19c85ac87d62cf188fbc188ff10ec74f675d444a092c45b062010a6ecf4aca0ee18c10a085da11729a6ab18d116babb8aeb6f83c9e13613b11022091555a6d89ca4ba629e7206deb9a9ade6a7385a4a1f6eac0cb3ddc4feb6fd52739a6ad7c58c8475369ebba4b9af8aec9e9e452759d70f6e9c1c58a988de65554e3c60e631f18d8d0c02080e5ba1bafbc8f61982a362caa3d725d8f0cc4cb5ec4857fdcbda6385a5650fc8478cd9431626e4f5a58f8d583ad05016125f68e59d6e06840f3c41858bd79fae8549e76381548f518e6f76548624b3f4115cbe9ac529928a3122c0cf5704404db56f44f1203a65fee8ddd4ee78f61e1bcde9d5e511c7a5cd0e872735e286866c8bf9aa3752fc044a61352813a69f41a3416e3f72b70b24acbbdf3e675f1962017a27754fb2d5776283b8fe9ccfa28676adfcd33205b0480895d0675d14b65ec22c8adbf318fe819bf1aba79e4e6cd45dc51d68c8e3b92a3f1fbcdce8ad97e130855d2e4d025b1639da55d2beae72462f786d2e527f9b95b745add9a87b6aa86c740cdd6ec335cb4d8a6626df5b58404f62f57a5cdf377c430d78f13012175977a47cc8abe100ce112a9877a803fcd97f3332a220e8f8988b25762d641d590bc59f56478c2de654988bd479887e4ae9149f2de5de58ce253d9ad2a83e4d6512f083526b9ad548ebf12c9bff4de8b90011fb2ae22de5c8393a1c96d0f8f14d1d09c58dbcd06525c85b305c6c56d64a30719bc39d81d374e768b867bfac633ea12163f5d70a44cbde7dd370a8064159a76edfa5b05c495465eed343bf3070043c107dd8136a95e4d3b141d0ba5d1985030aca12587837f723cc31347719dd09e523ec8d8d958a40b248eeac8f9cd81f8e3326c240c7a2d99d1a579fa9abe4ed8995b72bbbfd509141cea9cbf6823b8a42496540ea7cc4419e51840aea964a15efe5ba032153a032ffde05b683e22e9dd5c057f96b1e6b2f7ecb426293b0f8ed9b46d442888fa1cc51c4f47539fb14f9136eee9532cc1760a5aa32a4489859d1b038f2b4",
"ecdhEncryptedPrivateKey": null
}
],
"validatorsCount": 1,
"withdrawalAddress": "0xaC8583143bD6dCE71D15d26833CaF638A4b925b5",
"ssvOwnerAddress": "0xaC8583143bD6dCE71D15d26833CaF638A4b925b5",
"feeRecipientAddress": "0x9E8f8190fc5242AA48DB9eA363edE0f5FEd8a15D",
"depositData": [
{
"publicKey": "0x8d8fe7ca46fe98384eb5120b99525d61559fd6ec47b566331f7881fb76357aa97d5d1f4247ee0e7930de2017c62d27bc",
"signature": "0x96f23ee730affd35a535a054defbd6fd10a7d11119e126a2508f8b0a4b6c100808a5e195533e257d2a9e72c22708abc2116381ded292e5badebc0edfc78fbe7627057687b2b37f933d0d8f8330fd212c1e0d3f599c29787b774d00f3de5d398a",
"depositDataRoot": "0x5813d3358b05c29998e7635de3be2a2c14a01a42d7032e13043ad3e46fb41433",
"withdrawalCredentials": "020000000000000000000000ac8583143bd6dce71d15d26833caf638a4b925b5",
"amount": "33000000000",
"depositMessageRoot": "5fb1c594a3fc1908fe250102489d909b0cc83cd05349180e29de1a63c8b3fcc8",
"forkVersion": "10000910",
"eth2NetworkName": "hoodi",
"depositCliVersion": "2.3.0"
}
],
"bulkValidatorRegistrationTxs": {
"to": "0x58410Bef803ECd7E63B23664C586A6DB72DAf59c",
"gasLimit": "505404",
"data": "0x22f18bf5000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000004b4816bcf5b980000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000045c0b246e000000000000000000000000000000000000000000000000000000356ad1b8080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000007a74ea0d0f945ca000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000308d8fe7ca46fe98384eb5120b99525d61559fd6ec47b566331f7881fb76357aa97d5d1f4247ee0e7930de2017c62d27bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000...",
"value": "0",
"chainId": 560048,
"type": 2,
"maxFeePerGas": "1880367142",
"maxPriorityFeePerGas": "97930826",
"serializeTx": "0x02f9081183088bb0808405d64e4a84701420268307b63c9458410bef803ecd7e63b23664c586a6db72daf59c80b907e422f18bf5000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000004b4816bcf5b980000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000045c0b246e000000000000000000000000000000000000000000000000000000356ad1b8080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000007a74ea0d0f945ca000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000308d8fe7ca46fe98384eb5120b99525d61559fd6ec47b566331f7881fb76357aa97d5d1f4247ee0e7930de2017c62d27bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005208c3845ab84aa6753c7821e37dd2f545c083364a917d6754df55c0377dc4a52519289d04e40c8b7573cdd53."
},
"ssvFeeTxs": [
{
"to": "0x58410Bef803ECd7E63B23664C586A6DB72DAf59c",
"gasLimit": "179628",
"data": "0xbc26e7e5000000000000000000000000ac8583143bd6dce71d15d26833caf638a4b925b500000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000004b4816bcf5b980000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000045c0b246e000000000000000000000000000000000000000000000000000000356ad1b8080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000007a74ea0d0f945ca0000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000008",
"value": "0",
"chainId": 560048,
"type": 2,
"maxFeePerGas": "1880367142",
"maxPriorityFeePerGas": "97930826",
"serializeTx": "0x02f901d183088bb0808405d64e4a84701420268302bdac9458410bef803ecd7e63b23664c586a6db72daf59c80b901a4bc26e7e5000000000000000000000000ac8583143bd6dce71d15d26833caf638a4b925b500000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000004b4816bcf5b980000000000000000000000000000000000..."
}
],
"feeRecipientTx": {
"to": "0x58410Bef803ECd7E63B23664C586A6DB72DAf59c",
"gasLimit": "42693",
"data": "0xdbcdc2cc0000000000000000000000009e8f8190fc5242aa48db9ea363ede0f5fed8a15d",
"value": "0",
"chainId": 560048,
"type": 2,
"maxFeePerGas": "1880367142",
"maxPriorityFeePerGas": "97930826",
"serializeTx": "0x02f84e83088bb0808405d64e4a847014202682a6c59458410bef803ecd7e63b23664c586a6db72daf59c80a4dbcdc2cc0000000000000000000000009e8f8190fc5242aa48db9ea363ede0f5fed8a15dc0"
},
"approveTx": {
"to": "0x9F5d4Ec84fC4785788aB44F9de973cF34F7A038e",
"gasLimit": "70988",
"data": "0x095ea7b300000000000000000000000058410bef803ecd7e63b23664c586a6db72daf59c00000000000000000000000000000000000000000000043c33c1937564800000",
"value": "0",
"chainId": 560048,
"type": 2,
"maxFeePerGas": "1880367142",
"maxPriorityFeePerGas": "97930826",
"serializeTx": "0x02f87083088bb0808405d64e4a84701420268301154c949f5d4ec84fc4785788ab44f9de973cf34f7a038e80b844095ea7b300000000000000000000000058410bef803ecd7e63b23664c586a6db72daf59c00000000000000000000000000000000000000000000043c33c1937564800000c0"
}
}
}
id: UUID specified in the SSV setup request.
status: Current status of the SSV request:
- init: Request is stored.
- processing: Request is in progress, please wait.
- ready: Request is ready. After ready, validator data can be used in the validator registration step.
- cancel: Request is canceled due to errors or timeouts.
type: Method of operation:
- without-encrypt-key (available): Validator's private key is maintained by Ebunker for initiating withdrawals upon client request.the client.
- with-encrypt-key (unavailable): Returns the validator's private key encrypted to
operationPeriodInDays: Operation period in days.
liquidationPeriodInDays: Liquidation threshold period in days.
ecdhPublicKey: ECDH public key used for obtaining the encrypted validator private key.
encryptedShares:
- publicKey: Validator public key.
- nonce: Nonce for the validator key owner in sharesData used for signing.
- sharesData: Shares (transforming the validator key into predefined threshold shares) and signature for proving the validator owner's address. Use registerValidator to create a validator from the SSV smart contract in an Ethereum transaction.
- ecdhEncryptedPrivateKey: Encrypted validator private key.
validatorsCount: Number of validators. One validator equals 32 ETH.
withdrawalAddress: Withdrawal address of the cluster owner.
ssvOwnerAddress: Address of the cluster owner acting as the SSV cluster owner. Cluster owner can register validators, update fee recipient addresses, deposit cluster balance, and claim SSV rewards.
feeRecipientAddress: Eth1 address receiving recipient rewards.
depositData:
- pubkey: Validator public key.
- signature: Validation signature.
- depositDataRoot: SHA-256 hash of the ssz-encoded DepositData object, used as protection against malformed inputs.
- withdrawalCredentials: SHA-256 hash of the ssz-encoded DepositData object, used as protection against malformed inputs. Withdrawal address credential passed in the expected format by the Ethereum deposit contract.
- amount: Amount of Ether being deposited, valued in gwei.
- depositMessageRoot: Encrypted hash ensuring integrity and authenticity of deposit data.
- forkVersion: Network fork version intended for the deposit. It helps keep the deposit consistent with a specific version of the protocol.
- eth2NetworkName: Name of the Ethereum 2.0 network for the deposit.
- depositCliVersion: Version of the deposit command-line interface (CLI) tool used for generating deposit data.
validatorRegistrationTxs: Transaction data presented in serialized and non-serialized form for registering validators on the SSV network.
ssvFeeTxs: Transaction data presented in serialized and non-serialized form for depositing SSV fees into the cluster balance.
feeRecipientTx: Transaction data presented in serialized and non-serialized form for setting the recipient address.
approveTx: Transaction data presented in serialized and non-serialized form for approving the transfer of SSV tokens from the SSV network smart contract.
validatorRegistrationTxs, ssvFeeTxs, feeRecipientTx, and approveTx contain the following data field list:
- serializeTx: Serialized unsigned transaction.
- to: Recipient address of this transaction.
- gasLimit: Maximum gas limit for this block.
- data: Transaction data.
- value: Amount sent by this transaction in wei.
- chainId: Chain ID authorized by this transaction, specified by EIP-155.
- type: EIP-2718 type of this transaction envelope.
- maxFeePerGas: Base fee of the EIP-1559 block this transaction will pay, plus the priority fee of this transaction in wei.
- maxPriorityFeePerGas: Price per unit of gas added to the base fee of the EIP-1559 block. This additional fee is used to incentivize miners to prioritize processing this transaction.
4. Sign and broadcast transaction approveTx
- Sign the transaction using the serialized signature from serializeTx.
- Construct the signature of approveTx using internally unserialized data.
Use serializeTx to sign and broadcast the signed transaction to the Ethereum network.
Please perform the Approve operation before executing any SSV-related transactions to register your validator on SSV. It allows the SSV smart contract to transfer SSV tokens on your behalf to fund the cluster balance.
5. Sign and broadcast transaction feeRecipientTx
- Sign the transaction using the serialized signature from serializeTx.
- Construct the signature of feeRecipientTx using internally unserialized data.
Use serializeTx to sign and broadcast the signed transaction to the Ethereum network.
If your EL fee recipient address is different from your SSV owner address, please perform this operation. Each SSV owner corresponds to a single fee address, so you don’t need to send a transaction for every order to set it. One owner address only needs to set the fee address once. This address serves as the block reward destination for the validator on the SSV network and will receive the accumulated execution layer rewards.
6. Sign and broadcast transaction bulkValidatorRegistrationTxs
- Sign the transaction using the serialized signature from serializeTx.
- Construct the signature of bulkValidatorRegistrationTxs using internally unserialized data.
Use serializeTx to sign and broadcast the signed transaction to the Ethereum network.
By broadcasting this transaction, your validator will be bulk registered on the SSV network and managed by a pool consisting of four top-tier node operators (AntAlpha, Ebunker).
Please include SSV registration in SSV URL
7. Sign and broadcast Ethereum smart contract
- Construct the signature of depositData using internally unserialized data.
Use sign and broadcast to send the signed transaction to the Ethereum network.
Finally, just wait.