Getting started

To start staking on the SSV network using our SSV On-Chain, 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.
  • API Key Request: Get an authentication token to start using DVT Staking API.

We created an API endpoint to return the transaction data required to interact with our proxy smart contract. We also provide convenient request examples using cURL to guide you through the process. While the use of the API method is not mandatory for the smart contract interaction, we recommend it for a faster integration.

Staking via SSV Proxy Smart Contract and API

  1. Create a serialized transaction for depositing the stake amount to the SSV proxy smart contract by sending a GET request to /api/v1/eth/staking/ssv/p2p/deposit.

    Example request:

    curl --request POST \
         --url https://api.p2p.org/api/v1/eth/staking/ssv/p2p/deposit \
         --header 'accept: application/json' \
         --header 'authorization: Bearer <token>' \
         --header 'content-type: application/json' \
         --data '
    {
      "amount": 32,
      "withdrawalAddress": "0x39D02C253dA1d9F85ddbEB3B6Dc30bc1EcBbFA17",
      "feeRecipientAddress": "0x39D02C253dA1d9F85ddbEB3B6Dc30bc1EcBbFA17"
    }
    '
    
    • amount — amount of ETH to deposit. The value must be in multiples of 32 ETH.
    • withdrawalAddress — withdrawal address for the validators.
    • feeRecipientAddress — Eth1 address that receives the fee recipient rewards.

    Example response:

    {
        "error": null,
        "result": {
            "serializeTx": "0x02f902cf0580021e830186a094681a1b3441c6bfb12f91651efd9f02c83c0702938901bc16d674ec800000b902a44f498c730000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030b4b5f251eac53f34eb1da2b6659d35db303e408c4c830156cf090441564474f356abd023a0e679aa97cefeed850abb27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200100000000000000000000009c7d4b4595402ed44167c74f9f7c7720ab5528e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060a307b2e1661bcc38d482a69603713baf332ad36adf837392e9f20a96b77a03ca415a46261fc62b8f5d4aa69a0d70e2cf0d23e3396bd387cfde18d392a2c7ba822d3f8a60d075366625dcb3c88cd59ebc8f7ab1fc312c6b8b625a57bf7e1b6e6f000000000000000000000000000000000000000000000000000000000000000178ae581ccc8bdf1fde00cff35b2278e1c10a9ed2fc18632373dac118a03cfacdc0",
            "to": "0x681a1b3441c6BFb12f91651EFD9F02c83c070293",
            "gasLimit": "0.0000000000001",
            "data": "0x4f498c730000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030b4b5f251eac53f34eb1da2b6659d35db303e408c4c830156cf090441564474f356abd023a0e679aa97cefeed850abb27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200100000000000000000000009c7d4b4595402ed44167c74f9f7c7720ab5528e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060a307b2e1661bcc38d482a69603713baf332ad36adf837392e9f20a96b77a03ca415a46261fc62b8f5d4aa69a0d70e2cf0d23e3396bd387cfde18d392a2c7ba822d3f8a60d075366625dcb3c88cd59ebc8f7ab1fc312c6b8b625a57bf7e1b6e6f000000000000000000000000000000000000000000000000000000000000000178ae581ccc8bdf1fde00cff35b2278e1c10a9ed2fc18632373dac118a03cfacd",
            "value": "32.0",
            "chainId": 1,
            "type": 2,
            "maxFeePerGas": "0.00000000000000003",
            "maxPriorityFeePerGas": "2"
        }
    }
    
    • serializeTx — serialized unsigned transaction.
    • to — recipient address for this transaction.
    • gasLimit — maximum gas limit for this block.
    • data — transaction data.
    • value — amount this transaction is sending in Wei.
    • chainId — chain ID this transaction is authorized on, as specified by EIP-155.
    • typeEIP-2718 type of this transaction envelope.
    • maxFeePerGas — maximum price per unit of gas this transaction will pay for the combined EIP-1559 block's base fee and this transaction's priority fee in Wei.
    • maxPriorityFeePerGas — price per unit of gas in Wei, which is added to the EIP-1559 block's base fee. This added fee is used to incentivize miners to prioritize this transaction.
  2. Use serializeTx from the previous step to sign and send the signed transaction to the Ethereum network.

    By broadcasting this transaction, you are depositing the requested stake amount in the Ethereum deposit smart contract by using the SSV proxy smart contract. Also, the smart contract will register the newly created validators on the SSV protocol.

    After your deposit is successful, your validator will enter the activation queue and soon start performing the validator tasks. You can check the status of your validator on the SSV network explorer.

  3. Check the list of validators created via your authentication token and their status by sending a GET request to /api/v1/eth/staking/ssv/p2p/deposits.

    Example request:

    curl --request GET \
         --url https://api.p2p.org/api/v1/eth/staking/ssv/p2p/deposits?limit=50&offset=0&type=withdrawalAddress&withdrawalAddress=0xe3bb3cc1fd44fced699e5eae6fbbc643a0fbcca0 \
         --header 'accept: application/json' \
         --header 'authorization: Bearer <token>'
    
    • limit — number of resources that a single response page contains.
    • offset — number of resources to exclude from a response.
    • type — type of filter:
      • withdrawalAddress
    • withdrawalAddress — withdrawal address for the validators.

    Example response:

    {
      "error": null,
      "result": {
        "list": [
          {
            "deposit": {
              "depositId": "",
              "transactionHash": "",
              "senderAddress": "",
              "withdrawalAddress": "0xe3bb3cc1fd44fced699e5eae6fbbc643a0fbcca0",
              "feeRecipientAddress": "",
              "totalAmount": "",
              "unprocessedAmount": "18273"
            },
            "validator": {
              "pubkey": "0xad9049587a26e8db61f6b2443798519a7220bb3dde4b6ec8f4d3ab9c06f48952377ae6869b67e4b9d1549f334caaf5e9",
              "status": "unknown",
              "amount": "1991"
            }
          },
          {
            "deposit": {
              "depositId": "",
              "transactionHash": "",
              "senderAddress": "",
              "withdrawalAddress": "0xe3bb3cc1fd44fced699e5eae6fbbc643a0fbcca0",
              "feeRecipientAddress": "",
              "totalAmount": "",
              "unprocessedAmount": "18273"
            },
            "validator": {
              "pubkey": "0xcd5ff4fbeafeb6bcdc5dde3ba41d88638eb7b14e52ee3beaf0d32ae3abb303ff8814258ecaa49c5ed0bd7dd48bb0ca502ac89c0bcd36dc7b01a00b8db1e4adec",
              "status": "unknown",
              "amount": "2073"
            }
          }
        ],
        "limit": 50,
        "offset": 0,
        "totalCount": 17,
        "totalAmount": "18273",
        "unprocessedAmount": "18273"
      }
    }
    
    • deposit:
      • depositId
      • transactionHash
      • senderAddress
      • withdrawalAddress — withdrawal address for the validators.
      • feeRecipientAddress — the address that receives the fee recipient rewards.
      • totalAmount
      • unprocessedAmount
    • validator:
      • pubkey — validator public key.
      • status — current status of the validator
      • amount — amount of ETH, denominated in gwei, that is being deposited.
    • limit — number of resources that a single response page contains.
    • offset — number of resources to exclude from a response.
    • totalCount
    • totalAmount
    • unprocessedAmount

What's Next?