Skip to main content

Ethereum / Aggregated Staking

The Ethereum Aggregated Staking flow allows you to stake ETH to multiple validators at once. There are two ways:

To stake ETH as per this method you do not need validators.


Option 2: Bring Your Validators

This is the way to stake ETH if you already have validators.


Create New Aggregated Staking Flow

To initiate the aggregated staking process, create a new flow with a POST request to /api/v1/flows.

URL

https://eth-slate.datahub.figment.io/api/v1/flows

Request

  • flowobject
    • network_code* — string Network this flow operates on (ex. ethereum).
    • chain_code* — string Chain this flow operates on (ex. goerli).
    • operation* — string The operation to perform (ex. aggregated_staking).
    • versionstring API version to use (ex. v1).

Response

  • idstring ID of the newly created flow.
  • operationstring The Staking API operation being performed by this flow.
  • statestring The current state of the flow.
  • actionsarray It includes the name & inputs of all next possible actions.
    • assign_staking_data — Use this action to generate an aggregated deposit transaction to stake your ETH. The assign_staking_data action indicates eleven fields for data collection.
      • funding_account_address — The wallet from which the ETH will originate
      • depositsarray of validator deposit data:
        • validator_pub_key — The public key of the validator to which the ETH will be deposited.
        • withdrawal_credentials — The withdrawal address for the given validator.
        • signature — A BLS proof of possession, i.e. a proof that the private key corresponding to the validator_pub_key is known by the signer.
        • deposit_data_root — Uniquely identifies the set of deposits made so far.
        • genesis_fork_version — The fork version of Ethereum you used as an input to create signature.
      • gas_limit — Adjust the gas limit.
      • gas_price — Adjust the gas price.
      • estimated_active_at : string A high fidelity estimation of when a given validator will become active.
      • withdrawal_address — The withdrawal address into which you want to receive your ETH after withdrawal.
      • amount — The amount of ETH you want to stake. Must be a multiple of 32.
  • To proceed with Option 1 (On-demand ETH staking) you only need funding_account_address, withdrawal_address and amount.
  • To proceed with Option 2 (Bring your validators) you only need funding_account_address and deposits data.
Request
Example Response
{
"id": "7d0c5354-72f0-4bac-bc29-b7384d0321a8",
"operation": "aggregated_staking",
"state": "initialized",
"actions": [
{
"name": "assign_staking_data",
"inputs": [
{
"name": "funding_account_address",
"display": "Funding Account Address",
"description": "",
"type": "string",
"validations": [
{
"type": "presence",
"options": {}
},
{
"type": "hex",
"options": {}
}
],
"array": false,
"default_value": null
},
{
"name": "deposits",
"display": "Deposits",
"description": "",
"type": "array_of_validator_deposit_data",
"validations": [
{
"type": "array",
"options": {
"allow_empty": true,
"allow_duplicates": false
}
},
{
"type": "length",
"options": {
"maximum": 100,
"message": "cannot fund more than 100 validators in single transaction"
}
},
{
"type": "array_of_objects",
"options": {
"merge_array_errors": true
}
}
],
"array": true,
"default_value": null,
"element_type": "validator_deposit_data",
"inputs": [
{
"name": "validator_pub_key",
"display": "Validator Pub Key",
"description": "",
"type": "hex",
"validations": [
{
"type": "presence",
"options": {}
},
{
"type": "hex",
"options": {}
}
],
"array": false,
"default_value": null
},
{
"name": "withdrawal_credentials",
"display": "Withdrawal Credentials",
"description": "",
"type": "hex",
"validations": [
{
"type": "presence",
"options": {}
},
{
"type": "hex",
"options": {}
}
],
"array": false,
"default_value": null
},
{
"name": "signature",
"display": "Signature",
"description": "",
"type": "hex",
"validations": [
{
"type": "presence",
"options": {}
},
{
"type": "hex",
"options": {}
}
],
"array": false,
"default_value": null
},
{
"name": "deposit_data_root",
"display": "Deposit Data Root",
"description": "",
"type": "hex",
"validations": [
{
"type": "presence",
"options": {}
},
{
"type": "hex",
"options": {}
}
],
"array": false,
"default_value": null
},
{
"name": "genesis_fork_version",
"display": "Genesis Fork Version",
"description": "",
"type": "hex",
"validations": [
{
"type": "acceptable_genesis_fork_version",
"options": {}
}
],
"array": false,
"default_value": null
}
]
},
{
"name": "gas_limit",
"display": "Gas Limit",
"description": "",
"type": "string",
"validations": [
{
"type": "numericality",
"options": {
"allow_blank": true,
"only_integer": true,
"greater_than": 0
}
}
],
"array": false,
"default_value": null
},
{
"name": "gas_price",
"display": "Gas Price",
"description": "",
"type": "string",
"validations": [
{
"type": "numericality",
"options": {
"allow_blank": true,
"greater_than": 0
}
},
{
"type": "precision",
"options": {
"allow_blank": true,
"max": 9
}
}
],
"array": false,
"default_value": null
},
{
"name": "withdrawal_address",
"display": "Withdrawal Address",
"description": "",
"type": "string",
"validations": [],
"array": false,
"default_value": null
},
{
"name": "amount",
"display": "Amount",
"description": "",
"type": "decimal",
"validations": [],
"array": false,
"default_value": null
}
]
}
],
"data": {
"deposits": [],
"funding_account_address": null,
"withdrawal_address": null,
"amount": null,
"validators_to_provision": null,
"gas_price": null,
"gas_limit": null,
"estimated_active_at": null,
"transactions": []
},
"network_code": "ethereum",
"chain_code": "goerli",
"created_at": "2023-04-06T06:37:06.055Z",
"updated_at": "2023-04-06T06:37:06.055Z"
}


Submit Aggregated Staking Data (Option 1: On Demand Validators)

After collecting the required inputs, send a PUT request to /api/v1/flows/[:flow_id]/next proceed to the next step.

URL

https://eth-slate.datahub.figment.io/api/v1/flows/[:flow_id]/next

Request

  • name* : assign_staking_data
  • inputs* : object
    • funding_account_address* : string The wallet from which the ETH will originate
    • withdrawal_address* : hex Your withdrawal address.
    • amount* : number The amount of ETH to stake. Must be a multiple of 32.
    • gas_limit : Adjust the gas limit
    • gas_price : Adjust the gas price

Response

The aggregated staking flow will provision enough validators to stake your full amount, even if your organization has not pre-provisioned enough validators for it. This is an async process, and may require you to await a webhook indicating provision success before proceeding. Alternatively you can poll the flow until status aggregated_deposit_tx_signature is reached. Therefore, there are two possible returned states:

  • awaiting_provision : The Staking API is communicating with internal systems to provision validators for your org.
  • aggregated_deposit_tx_signature — Your organization has enough validators available to proceed to transaction signing. This is either because there are preprovisioned validators available for your org, or the Staking API has provisioned validators for you and has advanced out of the awaiting_provision state.

When the flow is in aggregated_deposit_tx_signature, it will include an unsigned transaction payload to stake to your organization's validators. This transaction-ready state indicates three possible actions:

Notes

Within the data object, the field estimated_active_at provides a high fidelity estimation of when a given validator will become active.

Request
Example Response
{
"id": "7d0c5354-72f0-4bac-bc29-b7384d0321a8",
"operation": "aggregated_staking",
"state": "awaiting_provision",
"actions": [
{
"name": "wait",
"estimated_state_change_at": "2023-04-06T06:44:08.345Z",
"inputs": []
}
],
"data": {
"deposits": [],
"funding_account_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"withdrawal_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"amount": "32.0",
"validators_to_provision": 1,
"gas_price": null,
"gas_limit": null,
"estimated_active_at": "2023-04-08T12:10:21.412Z",
"transactions": []
},
"network_code": "ethereum",
"chain_code": "goerli",
"created_at": "2023-04-06T06:37:06.055Z",
"updated_at": "2023-04-06T06:39:07.287Z"
}


Submit Aggregated Staking Data (Option 2: Bring Your Validators)

After collecting the required inputs, PUT /api/v1/flows/[:flow_id]/next to move on to the next step.

URL

https://eth-slate.datahub.figment.io/api/v1/flows/[:flow_id]/next

Request

  • name* : assign_staking_data
  • inputs* : object.
    • funding_account_address* : string The wallet from which the ETH will originate.
    • deposits* : array An array of validator deposit data:
      • validator_pub_key* : string The public key of the validator to which the ETH will be deposited.
      • withdrawal_credentials* : string The withdrawal address for the given validator.
      • signature* : string A BLS proof of possession i.e., a proof that the private key corresponding to the validator_pub_key is known by the signer.
      • deposit_data_root* : string Uniquely identifies the set of deposits made so far.
      • genesis_fork_version : There are currently five possible values for both Goerli and Mainnet. For Goerli they are: 0x00001020, 0x01001020, 0x02001020, 0x03001020, 0x04001020. For Mainnet they are; 0x00000000, 0x01000000, 0x02000000, 0x03000000, 0x04000000.
    • gas_price : string The gas price for the transaction.
    • gas_limit : string The gas limit for the transaction.

Response

The aggregated staking flow will provision enough validators to stake your full amount, even if your organization has not pre-provisioned enough validators for it. This is an async process, and may require you to await a webhook indicating provision success before proceeding. Alternatively you can poll the flow until status aggregated_deposit_tx_signature is reached. Therefore, there are two possible returned states:

  • awaiting_provision : The Staking API is communicating with internal systems to provision validators for your org.
  • aggregated_deposit_tx_signature : Your organization has enough validators available to proceed to transaction signing. This is either because there are preprovisioned validators available for your org, or the Staking API has provisioned validators for you and has advanced out of the awaiting_provision state.

When the flow is in aggregated_deposit_tx_signature, it will include an unsigned transaction payload to stake to your organization's validators. This transaction-ready state indicates three possible actions:

Notes

Within the data object, the field estimated_active_at provides a high fidelity estimation of when a given validator will become active.

Request
Example Response
{
"id": "7d0c5354-72f0-4bac-bc29-b7384d0321a8",
"operation": "aggregated_staking",
"state": "awaiting_provision",
"actions": [
{
"name": "wait",
"estimated_state_change_at": "2023-04-06T06:44:08.345Z",
"inputs": []
}
],
"data": {
"deposits": [
{
"validator_pub_key": "0x9855d353352eefb56929801e0d376cf6e5973d18c39424fe42c829cb62a6ff17648e6fdbf0c7259d25d09e17769cf276",
"withdrawal_credentials": "0x010000000000000000000000b458d87418e6020260c92e18b11b64f1ed6fff30",
"signature": "0x94c7e3414664f4dbd1cc8d326de278ee0e4fcf4bc74fb1ea74216bab8c644ddc4fd1ed59dca7db60959f81d4dd5dd8271175113fbc0decb19486f885a5e2bc440a5b3b33184be66dd069290ebe7f47024d2799ea7b1c1eb829cc018b8334fdb0",
"deposit_data_root": "0x348de8001f6b5ce424f93ca0ca090ad1986ee5969991fa02af345980e874ade6",
"genesis_fork_version": "0x00001020"
}
],
"funding_account_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"withdrawal_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"amount": "32.0",
"validators_to_provision": 1,
"gas_price": null,
"gas_limit": null,
"estimated_active_at": "2022-04-08T12:10:21.412Z",
"transactions": []
},
"network_code": "ethereum",
"chain_code": "goerli",
"created_at": "2023-04-06T06:37:06.055Z",
"updated_at": "2023-04-06T06:39:07.287Z"
}


Submit Signed Aggregated Deposit Transaction for Broadcast

Before broadcasting the transaction, you must sign the transaction_payload you received in the previous step. After signing the transaction, send a PUT request to /api/v1/flows/[:flow_id]/next with the signed payload. The Staking API will broadcast the transaction to the Ethereum network.

URL

https://eth-slate.datahub.figment.io/api/v1/flows/[:flow_id]/next

Request

  • name* : sign_aggregated_deposit_tx
  • inputs* : object
    • transaction_payload* : Signed transaction payload from the previous step's response.
    • signatures : array of object The signatures array can be used instead of sending a transaction payload when the signing keys are kept in a custodial solution, such as Fireblocks. Refer to the guide Signing Transactions with the Fireblocks API for details.

Response

  • id : string ID of the flow.
  • operation : string The Staking API operation being performed by this flow.
  • state : string The current state of the flow.
    • aggregated_deposit_tx_broadcasting : Transaction broadcasting to the network.
    • activating : Transaction has been confirmed and stake is now activating.
    • active : Stake is active and earning rewards.
  • actions : array It includes the name & inputs of all next possible actions.
  • data : object Flow & transaction data.
    • estimated_active_at : string A high fidelity estimation of when a given validator will become active.
Request
Example Response
{
"id": "7d0c5354-72f0-4bac-bc29-b7384d0321a8",
"operation": "aggregated_staking",
"state": "aggregated_deposit_tx_broadcasting",
"actions": [
{
"name": "wait",
"estimated_state_change_at": "2023-04-06T06:45:19.485Z",
"inputs": []
}
],
"data": {
"withdrawal_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"validators_to_provision": 1,
"estimated_active_at": "2022-04-08T12:10:21.412Z",
"transactions": [
{
"code": "aggregated_deposit",
"amount": "32.0",
"raw": "0x02f902d805028459682f0085293dc82d66830116fa943e30fc2cc800af86e88b69d32d9daf7eccb3a5208901bc16d674ec800000b902a44f498c730000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000309855d353352eefb56929801e0d376cf6e5973d18c39424fe42c829cb62a6ff17648e6fdbf0c7259d25d09e17769cf27600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020010000000000000000000000b458d87418e6020260c92e18b11b64f1ed6fff3000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006094c7e3414664f4dbd1cc8d326de278ee0e4fcf4bc74fb1ea74216bab8c644ddc4fd1ed59dca7db60959f81d4dd5dd8271175113fbc0decb19486f885a5e2bc440a5b3b33184be66dd069290ebe7f47024d2799ea7b1c1eb829cc018b8334fdb00000000000000000000000000000000000000000000000000000000000000001348de8001f6b5ce424f93ca0ca090ad1986ee5969991fa02af345980e874ade6c0",
"signing_payload": "0xbf2cd8a721c4845f9a13813c680ba205f166da1d5a6e0e42f92baca723feb5d0",
"signed": "0x02f9031b05028459682f0085293dc82d66830116fa943e30fc2cc800af86e88b69d32d9daf7eccb3a5208901bc16d674ec800000b902a44f498c730000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000309855d353352eefb56929801e0d376cf6e5973d18c39424fe42c829cb62a6ff17648e6fdbf0c7259d25d09e17769cf27600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020010000000000000000000000b458d87418e6020260c92e18b11b64f1ed6fff3000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006094c7e3414664f4dbd1cc8d326de278ee0e4fcf4bc74fb1ea74216bab8c644ddc4fd1ed59dca7db60959f81d4dd5dd8271175113fbc0decb19486f885a5e2bc440a5b3b33184be66dd069290ebe7f47024d2799ea7b1c1eb829cc018b8334fdb00000000000000000000000000000000000000000000000000000000000000001348de8001f6b5ce424f93ca0ca090ad1986ee5969991fa02af345980e874ade6c001a0e65fa70c0c8224d19a18fffaabd4f1d76773d6e86aa1b95e416d10b2fe799738a07c8430f7f6e566e0647fd2295c0ba1b2e0d8f7cd212b7bae9aa0365f69d590a9",
"hash": "0xfd0160813b6fe74b68c35e17d15b2dea59d6544fbbd761d8705764fe7dda17ff",
"status": null,
"error": null,
"signatures": [
{
"account_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"signature": ""
}
],
"block_time": null,
"inputs": {
"funding_account_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"gas_price": null,
"gas_limit": null,
"deposits": [
{
"validator_pub_key": "0x9855d353352eefb56929801e0d376cf6e5973d18c39424fe42c829cb62a6ff17648e6fdbf0c7259d25d09e17769cf276",
"withdrawal_credentials": "0x010000000000000000000000b458d87418e6020260c92e18b11b64f1ed6fff30",
"signature": "0x94c7e3414664f4dbd1cc8d326de278ee0e4fcf4bc74fb1ea74216bab8c644ddc4fd1ed59dca7db60959f81d4dd5dd8271175113fbc0decb19486f885a5e2bc440a5b3b33184be66dd069290ebe7f47024d2799ea7b1c1eb829cc018b8334fdb0",
"deposit_data_root": "0x348de8001f6b5ce424f93ca0ca090ad1986ee5969991fa02af345980e874ade6",
"genesis_fork_version": "0x00001020"
}
],
"amount": "32.0"
}
}
]
},
"network_code": "ethereum",
"chain_code": "goerli",
"created_at": "2023-04-06T06:37:06.055Z",
"updated_at": "2023-04-06T06:44:18.777Z"
}


Get Aggregated Staking Flow Status

To get the current state of the existing flow, send a GET request to /api/v1/flows/[:flow_id] using the flow ID from the previous step.

URL

https://eth-slate.datahub.figment.io/api/v1/flows/[:flow_id]

Request

  • None

Response

  • id : string ID of the flow.
  • operation : string The Staking API operation being performed by this flow.
  • state : string The current state of the flow.
    • aggregated_deposit_tx_broadcasting : Transaction is broadcasting and not confirmed yet.
    • activating : The validator is in the activation queue and will join the active set.
    • active : The validator has successfully joined the active set.
    • Refer to the Ethereum Validator Lifecycle guide for more information.
  • actions : array It includes the name & inputs of all next possible actions.
  • data : object Flow & transaction data.
    • estimated_active_at : string A high fidelity estimation of when the validator will become active.
Request
Example Response
{
"id": "7d0c5354-72f0-4bac-bc29-b7384d0321a8",
"operation": "aggregated_staking",
"state": "active",
"actions": [],
"data": {
"withdrawal_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"validators_to_provision": 1,
"estimated_active_at": "2023-04-06T22:44:54.112Z",
"transactions": [
{
"code": "aggregated_deposit",
"amount": "32.0",
"raw": "0x02f902d805028459682f0085293dc82d66830116fa943e30fc2cc800af86e88b69d32d9daf7eccb3a5208901bc16d674ec800000b902a44f498c730000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000309855d353352eefb56929801e0d376cf6e5973d18c39424fe42c829cb62a6ff17648e6fdbf0c7259d25d09e17769cf27600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020010000000000000000000000b458d87418e6020260c92e18b11b64f1ed6fff3000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006094c7e3414664f4dbd1cc8d326de278ee0e4fcf4bc74fb1ea74216bab8c644ddc4fd1ed59dca7db60959f81d4dd5dd8271175113fbc0decb19486f885a5e2bc440a5b3b33184be66dd069290ebe7f47024d2799ea7b1c1eb829cc018b8334fdb00000000000000000000000000000000000000000000000000000000000000001348de8001f6b5ce424f93ca0ca090ad1986ee5969991fa02af345980e874ade6c0",
"signing_payload": "0xbf2cd8a721c4845f9a13813c680ba205f166da1d5a6e0e42f92baca723feb5d0",
"signed": "0x02f9031b05028459682f0085293dc82d66830116fa943e30fc2cc800af86e88b69d32d9daf7eccb3a5208901bc16d674ec800000b902a44f498c730000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000309855d353352eefb56929801e0d376cf6e5973d18c39424fe42c829cb62a6ff17648e6fdbf0c7259d25d09e17769cf27600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020010000000000000000000000b458d87418e6020260c92e18b11b64f1ed6fff3000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006094c7e3414664f4dbd1cc8d326de278ee0e4fcf4bc74fb1ea74216bab8c644ddc4fd1ed59dca7db60959f81d4dd5dd8271175113fbc0decb19486f885a5e2bc440a5b3b33184be66dd069290ebe7f47024d2799ea7b1c1eb829cc018b8334fdb00000000000000000000000000000000000000000000000000000000000000001348de8001f6b5ce424f93ca0ca090ad1986ee5969991fa02af345980e874ade6c001a0e65fa70c0c8224d19a18fffaabd4f1d76773d6e86aa1b95e416d10b2fe799738a07c8430f7f6e566e0647fd2295c0ba1b2e0d8f7cd212b7bae9aa0365f69d590a9",
"hash": "0xfd0160813b6fe74b68c35e17d15b2dea59d6544fbbd761d8705764fe7dda17ff",
"status": "confirmed",
"error": null,
"signatures": [
{
"account_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"signature": ""
}
],
"block_time": "2023-04-06T06:44:24.000Z",
"inputs": {
"funding_account_address": "0xB458D87418e6020260C92e18b11b64F1ed6fFF30",
"gas_price": null,
"gas_limit": null,
"deposits": [
{
"validator_pub_key": "0x9855d353352eefb56929801e0d376cf6e5973d18c39424fe42c829cb62a6ff17648e6fdbf0c7259d25d09e17769cf276",
"withdrawal_credentials": "0x010000000000000000000000b458d87418e6020260c92e18b11b64f1ed6fff30",
"signature": "0x94c7e3414664f4dbd1cc8d326de278ee0e4fcf4bc74fb1ea74216bab8c644ddc4fd1ed59dca7db60959f81d4dd5dd8271175113fbc0decb19486f885a5e2bc440a5b3b33184be66dd069290ebe7f47024d2799ea7b1c1eb829cc018b8334fdb0",
"deposit_data_root": "0x348de8001f6b5ce424f93ca0ca090ad1986ee5969991fa02af345980e874ade6",
"genesis_fork_version": "0x00001020"
}
],
"amount": "32.0"
}
}
]
},
"network_code": "ethereum",
"chain_code": "goerli",
"created_at": "2023-04-06T06:37:06.055Z",
"updated_at": "2023-04-06T22:44:54.133Z"
}