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 consolidate multiple validators, as well as increase the validator's total stake and compound staking rewards, 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:
- Create an increment request.
- Check the status of the request.
- Sign and broadcast the transaction.
Request examples are provided using cURL.
The flow is supported for both Ethereum and SSV validators via the same endpoints.
1. Create Increment Request
The flow applies only to active validators using the
0x02
type of withdrawal credentials.
-
Prepare
id
that is an arbitrary UUID. Generate it in one of the following ways: -
Send a POST request to /api/v1/eth/staking/direct/increment-request/create.
Example request:
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" }'
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:
{ "error": null, "result": true }
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}
endpoint.
Example request:
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>'
Example response:
{
"result": {
"id": "f293e499-9188-4e01-8e7c-621038967b06",
"status": "processing",
"withdrawalAddress": "0x338EF19fA2eC0fc4d1277B1307a613fA1FBbc0cb",
"pubkeys": [
"0xffC08FcD7cFeF5c70fB2b0e1f2A8EaA690AaE2bDFfa5dBEc4dEef31DcC0B19eB1f9Cebe3E2fe9eefBD9a1BDF6FD89b39"
],
"amountPerValidator": "10000000000",
"depositData": [
{
"pubkey": "0xbe5E9c3Bb9eba1BF4C5eC1c1cbcF85ee2CE2fEC66Ce5460C23eF82332A044FDCabF7011F588CCbD77E73CCe6c4accDF0",
"signature": "0x15C9D0Bf74BE4ef12b0008Ed53825Da647E0C0FE21c0EfAE2B36E066bf44A5a9b5De0B70cE19F73D8eC5E7237Dde667FE8a99Ad607BddDC4b2aDd4c4Bc57b10ddfe7f0bFb925b48f4d37Cee8f894cEA365CeeA6c4B25a9Ca7DAbDfFdB2EDd6eB",
"depositDataRoot": "0xFEDdcB470eAA856c57f466e2f4d4F6971efEA1ED38fdB91bD913EEFFb52C8E24",
"withdrawalCredentials": "string",
"amount": "string",
"depositMessageRoot": "string",
"forkVersion": "string",
"eth2NetworkName": "string",
"depositCliVersion": "string"
}
],
"incrementTxs": [],
"createdAt": "2023-08-24T08:14:50.455Z"
},
"error": {}
}
-
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-encodeddepositData
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. -
createdAt
— timestamp of the transaction in the ISO 8601 format.
3. Sign and Broadcast Transaction
Prepare serializeTx
from the previous step to sign 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.
Updated 1 day ago