> ## Documentation Index
> Fetch the complete documentation index at: https://docs.p2p.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Incremental Staking (Top-ups)

> Pectra Upgrade brought to the Ethereum staking many new features, such as increasing of the validator maximum effective balance in particular. This now makes it possible to , as well as  and , up to a total of 2048 ETH.

Contributing to the validator's total stake is especially convenient, as the general top-up flow supports an amount starting from 1 ETH, whilst to create a new validator, at least 32 ETH are required.

To increase the stake of your validator:

1. Create an increment request.
2. Check the status of the request.
3. Sign and broadcast the transaction.

Request examples are provided using [cURL](https://curl.se/).

<Check>
  The flow is supported for both Ethereum and SSV validators via the same endpoint.
</Check>

## 1. Create increment request

> The flow applies only to active validators using the `0x02` type of withdrawal credentials.

1. Prepare `id` that is an arbitrary UUID. Generate it in one of the following ways:

   * [Online UUID Generator](https://www.uuidgenerator.net/)
   * [uuid npm package](https://www.npmjs.com/package/uuid)

2. Send a POST request to [/api/v1/eth/staking/direct/increment-request/create](/reference/eth-increment-request-create).

   Example request:

   <CodeGroup>
     ```bash bash theme={null}
     curl --request POST \
       --url https://api.p2p.org/api/v1/eth/staking/direct/increment-request/create \
       --header 'Content-Type: application/json' \
       --header 'Authorization: Bearer <token>' \
       --data '{
         "id": "f293e499-9188-4e01-8e7c-621038967b06",
         "pubkeys": [
        "0xffC08FcD7cFeF5c70fB2b0e1f2A8EaA690AaE2bDFfa5dBEc4dEef31DcC0B19eB1f9Cebe3E2fe9eefBD9a1BDF6FD89b39"
      ],
         "amountPerValidator": "10000000000",
         "withdrawalAddress": "0x338EF19fA2eC0fc4d1277B1307a613fA1FBbc0cb"
     }'
     ```
   </CodeGroup>

   * `id` — arbitrary UUID. You can later use that UUID to check the status of the top-up operation.
   * `pubkeys` — list of validators' public keys.
   * `amountPerValidator` — amount of tokens to stake in Gwei per validator.
   * `withdrawalAddress` — withdrawal address for the validators.

   Example response:

   <CodeGroup>
     ```json JSON theme={null}
     {
       "error": null,
       "result": true
     }
     ```
   </CodeGroup>

## 2. Check request status

Check the status of the top-up operation by sending a GET request to [/api/v1/eth/staking/direct/increment-request/status/\{id}](/reference/eth-increment-request-status).

Example request:

<CodeGroup>
  ```bash bash theme={null}
  curl --request GET \
    --url https://api.p2p.org/api/v1/eth/staking/direct/increment-request/status/f293e499-9188-4e01-8e7c-621038967b06 \
    --header 'accept: application/json'
    --header 'Authorization: Bearer <token>'
  ```
</CodeGroup>

Example response:

<CodeGroup>
  ```json JSON theme={null}
  {
      "error": null,
      "result": {
          "id": "f293e499-9188-4e01-8e7c-621038967b06",
          "status": "ready",
          "withdrawalAddress": "0x338EF19fA2eC0fc4d1277B1307a613fA1FBbc0cb",
          "amountPerValidator": "1000000000",
          "pubkeys": [
              "0xffC08FcD7cFeF5c70fB2b0e1f2A8EaA690AaE2bDFfa5dBEc4dEef31DcC0B19eB1f9Cebe3E2fe9eefBD9a1BDF6FD89b39"
          ],
          "depositData": [],
          "incrementTxs": [
              {
                  "serializeTx": "0x02f901d983088bb0808404521e85847d276925839896809400000000219ab540356cbb839cbe05303d7705fa880de0b6b3a7640000b901a422895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120bd3d5b43a2f35b2c8ab809dcdaf619ab1a068d944e02359e5b6cd1eb5c69daea0000000000000000000000000000000000000000000000000000000000000030a3ee378399d9eb0aa126594965866e8785033005709e2816c3969963d99cdce11ee6b0ff3c6410aca6b1cb2e820b28420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200200000000000000000000005419e9924ecd177418639cdce74cc3929c1472e80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0",
                  "to": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
                  "gasLimit": "10000000",
                  "data": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120bd3d5b43a2f35b2c8ab809dcdaf619ab1a068d944e02359e5b6cd1eb5c69daea0000000000000000000000000000000000000000000000000000000000000030a3ee378399d9eb0aa126594965866e8785033005709e2816c3969963d99cdce11ee6b0ff3c6410aca6b1cb2e820b28420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200200000000000000000000005419e9924ecd177418639cdce74cc3929c1472e80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
                  "value": "1000000000000000000",
                  "chainId": 560048,
                  "type": 2,
                  "maxFeePerGas": "2099734821",
                  "maxPriorityFeePerGas": "72490629"
              }
          ],
          "createdAt": "2023-08-24T08:14:50.455Z"
      }
  }
  ```
</CodeGroup>

* `id` — arbitrary UUID of the top-up request.

* `status` — current status of the top-up request:

  * `init` — request is created.
  * `processing` — request is in progress.
  * `ready` — backend has the deposit data for the top-up request.
  * `cancel` — something went wrong, and the deposit data was not created.

* `withdrawalAddress` — withdrawal address for the validators.

* `pubkeys` — list of validators' public keys.

* `amountPerValidator` — amount of tokens to stake in Gwei per validator.

* `depositData` for each validator:

  * `pubkey` — validator public key.
  * `signature` — validator signature.
  * `depositDataRoot` — SHA-256 hash of the SSZ-encoded `depositData` object. Used as a protection against malformed input.
  * `withdrawalCredentials`— withdrawal address credentials, passed in the expected format by the Ethereum deposit smart contract.
  * `amount` — amount of ETH, denominated in Gwei, that is being deposited.
  * `depositMessageRoot` — cryptographic hash of the Merkle tree's root, ensuring the integrity and authenticity of the deposit data.
  * `forkVersion` — version of the network fork that the deposit is intended for. It helps in aligning the deposit with a specific version of the protocol.
  * `eth2NetworkName` — name of the Ethereum 2.0 network where the deposit is made.
  * `depositCliVersion` — version of the deposit command-line interface (CLI) tool that was used to generate the deposit data.

* `incrementTxs` — list of serialized transaction payloads to increment the validator stake.

  * `serializeTx` — serialized unsigned transaction.
  * `to` — recipient address for this transaction.
  * `gasLimit` — maximum <Tooltip tip="A measure of computational effort required to execute a transaction or smart contract on a blockchain. Users must pay a gas fee, usually in the native token, to have their transactions processed by the network.">gas</Tooltip> 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](https://eips.ethereum.org/EIPS/eip-155).
  * `type` — [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) type of this transaction envelope.
  * `maxFeePerGas` — maximum price per unit of gas this transaction will pay for the combined [EIP-1559](https://eips.ethereum.org/EIPS/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](https://eips.ethereum.org/EIPS/eip-1559) block's base fee. This added fee is used to incentivize miners to prioritize this transaction.

* `createdAt` — timestamp of the transaction in the ISO 8601 format.

## 3. Sign and broadcast transaction

Prepare `serializeTx` from the previous step to [sign](/docs/signing-transaction-eth) and broadcast the signed transaction to the Ethereum network. After the transaction is processed in the chain's queue, the validator's stake will be topped up.


## Related topics

- [Overview](/docs/pectra-overview.md)
- [Initial Staking](/docs/initial-staking.md)
- [Validator Consolidation](/docs/validator-consolidation.md)
- [Prepare Top-Up Cluster Balance Transaction](/reference/transaction-deposit.md)
- [FAQ](/docs/faq.md)
