arrow-left

Only this pageAll pages
gitbookPowered by GitBook
1 of 21

Alluvial

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Who is Alluvial?

Alluvial is a software development company supporting the development of the Liquid Collective protocol. We're focused on the overall growth and maturity of the ecosystem by fostering participation in proof of stake blockchains.

To learn more about the Liquid Collective protocol and how it works, check out Liquid Collective's documentationarrow-up-right.

hashtag
New to Alluvial's documentation?

The Alluvial docs have three key sections:

  1. : This section contains several step by step guides for how technical teams can implement key Liquid Staking flows.

  2. : This section shows all the raw API requests that Liquid Collective Platforms can call.

  3. : This section includes guides for how to interact with the Liquid Collective protocol via other software platforms.

hashtag
Helpful tips

If you are an engineer or technical person, looking to understand the level of effort or work involved in implementing the key flows (ETH staking and LsETH redemptions) then we recommend reviewing the and guides. The is a helpful compliment to these key guides.

Guidesarrow-up-right
APIsarrow-up-right
Third party integration guidesarrow-up-right
stakingarrow-up-right
redemptionarrow-up-right
architecture guidearrow-up-right

APIs

Alluvial exposes several APIs to help developers interact with the Liquid Collective Protocol.

hashtag
API-Reference

Authentication APIchevron-right
Ethereum Data APIchevron-right
Allowlisting APIchevron-right
Redemption APIchevron-right
Reporting APIchevron-right
Discounting APIchevron-right

Discounting API

APIs that allow Platforms to create target discount schedules.

Ethereum Data API

Ethereum Data API is a collection of APIs that expose read data from the Ethereum network.

Redemption API

Redemption API is a collection of APIs that expose read data on redemptions.

To see APIs used in an example implementation check out the Redemption guide (below).

Third Party Integration Guides

Alluvial's APIs can also interact with other third party services, such as those offered by third party custodians that Platforms may use to custody funds staked using Liquid Collective.

Please note that these guides are to support Platforms who are connecting with third party products that are not offered by or in partnership or affiliation with Alluvial. Products and services offered by third parties are subject to separate terms and conditions. Visit the website of the third parties noted in these guides for more information on their offerings.

Supplemental Guides

Secondary Interaction support

hashtag
Pre-read

Review the Authentication Guidearrow-up-right for the Alluvial API.

hashtag
Create an Account object

Platforms that enable secondary protocol interactions, such as trading, lending, or other services, can create an Account object. The Account object is generally associated with a Platform's customer.

Request:

Response:

hashtag
Create a Wallet object

After an Account object is created, associate a Wallet object to an account. You can associate one or many Wallet objects to a given Account object.

Request:

Response:

Your Platform is all set! Wallets added to the On-Platform list will be used to calculate the relevant Protocol Service Fee Rebates.

Reporting API

Reporting API is a collection of APIs Platforms use to get information about Liquid Collective Protocol Service Fees.

hashtag
Public endpoints (no authentication required)

hashtag
Private endpoints ( authentication required)

hashtag
Reward Summary

Public APIs

Alluvial exposes several non-authenticated APIs to support DApps

curl -X 'POST' \
  'https://api.staging.alluvial.finance/v0/platform/accounts' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer 'eyJhbGci…CVm5g'
  -d '{
 "key": "foobar-123"
}'
{
  "id": "4b1d05ed-b498-4847-99a0-c415c6b19f6b",
  "key": "foobar-123",
  "org_id": "org_WaYHN06ay6WoT...",
  "status": "ACTIVE",
  "created_at": "2024-02-09T22:40:28.954304245Z",
  "wallets": []
}
curl -X 'POST' \
  'https://api.staging.alluvial.finance/v0/platform/accounts/4b1d05ed-b498-4847-99a0-c415c6b19f6b/wallets/' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer 'eyJhbGci…CVm5g'
  -D '{
 "address": "0x469b998812B9675b7B2Fb37519f574fEA5ee92E8",
 "allowlisted": "false",
 "type": "ETH"
}'
{
  "id": "421a39a1-e9c3-4a33-81bc-98eff7bfd502",
  "type": "ETH",
  "address": "0x469b998812b9675b7b2fb37519f574fea5ee92e8",
  "status": "NOT_ALLOWLISTED",
  "on_platform": true,
  "created_at": "2024-02-09T22:43:02.249045841Z"
}

Changelog

Alluvial's changelog records changes made to the Alluvial API specification, including new features, improvements, bug fixes, and more.

hashtag
July 9, 2024

  • Discounting APIs are live! These APIs enable adding a new target rate in the event Platforms need to adjust the net Protocol Service Fee rate for specific accounts and/or wallets.

  • Summary APIs are now exposed within the Reporting API. Summary APIs allow for teams to get data for a range of dates rather than a specific day.

hashtag
May 17, 2024

  • Reporting API now exposes an endpoint for Platforms with segregated accounts to get rewards information. You can see examples in our .

hashtag
April 24, 2024

  • Reporting API now exposes an endpoint for Platforms with an omnibus to get rewards information. You can see examples in our .

hashtag
March 25, 2024

hashtag
On-Platform list

  • On-Platform list has been created to allow Platforms that only want to allow for a wallet to take part in secondary actions of LsETH to be accounted for. More information can be found in the guide or guide.

  • When creating a wallet, Platforms that allow for minting and redeeming, but only want to allow a wallet for secondary interactions can add these wallets to the on_platform list.

hashtag
Platform APIs

  • Introduction of . These replace the Depositor APIs that are now marked for .

hashtag
May 5th, 2023

hashtag
Release redeems APIs

  • Expose redemption requests by address via /eth/v0/redeems

  • Expose redemption requests by id via /eth/v0/redeems/{idx}

  • Expose redemption manager (heights) via /eth/v0/redeems_info

This API can be used with the .

hashtag
May 18th, 2023

hashtag
Release projection APIs for LsETH redemptions

  • Expose redeem projected redeemable at timestamp via /eth/v0/redeems/{idx}/projection

  • Expose manager projected fulfilled at timestamp via /eth/v0/redeems_info/projection

This API can be used with the .

hashtag
November 20th, 2023

  • Remove address from Allowlister via PATCH /v0/depositors/{idOrKey}/wallets/{idOrAddress}/remove

Rather than removing the entire Depositor object, Platforms can now remove only the wallet address. This is the recommended approach for most cases where an a Platform needs to revoke a wallet address' Allowlist permissions.

The wallet will is still able to transfer LsETH to other wallets.

Guides

Using Alluvial APIs makes it easy to onboard and interact with the Liquid Collective protocol.

There are two types of Liquid Collective Platforms. Platforms either:

  • Enable mint/redeem: These Platforms enable direct Liquid Collective protocol interactions, including depositing ETH to Ethereum's deposit contract and redeeming LsETH for ETH (minting and redeeming). These Platforms offer KYC/AML and Sanctions Screening procedures for their users, then submit the user's wallet address to Liquid Collective's Allowlist smart contract upon successful completion.

  • Enable secondary interactions: These Platforms do not enable minting, redeeming, or direct Liquid Collective protocol interactions, but do enable secondary protocol interactions such as trading, lending, or other services not required to Allowlist KYC/AML and Sanctions Screened wallet addresses. Users of these Platforms can seamlessly interact with LsETH, and may accrue Ethereum's consensus and execution layer network rewards simply by holding LsETH.

There are two lists that Platforms can interact with:

  • Allowlist: Any address added to this list can mint and/or burn directly with the Liquid Collective protocol. Only wallets that have on-ramped via a mint/redeemed enabled Platform can be added to this list.

  • On-Platform: Platforms that only enable secondary interactions can only add wallets to the On-Platform list, and cannot interact with the Allowlist smart contract. When a wallet address is added to the Allowlist it is also automatically added to the On-Platform list. This list is used for calculating Platform rebates.

Below are two guides for Platforms to add their users to the appropriate lists.

Authentication API

This page shows the process for creating an access token.

  1. When onboarding with Alluvial, you will receive API credentials. These include a client_id and client_secret.

  2. After receiving your credentials use the curl request below, updating the client_id and client_secret with your specific credentials.

hashtag
Staging

Response

hashtag
Production

Request

Response

Mint and Redeem support

hashtag
Pre-read

Review the for the Alluvial API.

hashtag
Onboarding wallets

Architecture

This guide is intended for Platforms to learn about how they can integrate the Liquid Collective protocol with the support of Alluvial's APIs.

To help illustrate how a Platform utilizes the Alluvial APIs to support its Liquid Collective protocol integration, this guide introduces a few fictional characters:

  • Acme Custodian Corp: Financial institution that is a Platform for the Liquid Collective protocol and will offer its customers the ability to participate in the Liquid Collective protocol by staking ETH.

  • Alice: user of Acme Custodian Corp

Authentication

This guide walks users through how to use authenticate requests using the Alluvial APIs.

hashtag
Client Credentials Flow

Below is a ladder diagram showing the flow to create an access token.

This flow involves 3 parties:

reporting guidearrow-up-right
reporting guidearrow-up-right
Mint and Redeemarrow-up-right
Secondary interactionarrow-up-right
Platform and Account APIsarrow-up-right
deprecationarrow-up-right
redemption guidearrow-up-right
redemption guidearrow-up-right
Platforms enabling Mint and Redeem guidearrow-up-right
Platforms enabling secondary interactionsarrow-up-right
curl -X 'POST' \
  'https://auth.staging.alluvial.finance/oauth/token' \
  -H 'content-type: application/json' \
  -d '{
    "audience": "https://api.staging.alluvial.finance",
  "grant_type": "client_credentials",
  "client_id": "<YOUR_CLIENT_ID>",
  "client_secret": "<YOUR_CLIENT_SECRET>"
}'
{
  "access_token": "eyJz93a...k4laUZw",
  "scope": "read:eth-oracle...read:eth-operators",
  "expires_in": 86400,
  "token_type": "Bearer"
}
curl -X 'POST' \
  'https://auth.alluvial.finance/oauth/token' \
  -H 'content-type: application/json' \
  -d '{
    "audience": "https://api.alluvial.finance",
  "grant_type": "client_credentials",
  "client_id": "<YOUR_CLIENT_ID>",
  "client_secret": "<YOUR_CLIENT_SECRET>"
}'
{
  "access_token": "eyJz93a...k4laUWw",
  "scope": "read:eth-oracle...read:eth-operators",
  "expires_in": 86400,
  "token_type": "Bearer"
}
hashtag
Create an Account object

First create an account object for each of your users.

Request:

curl -X 'POST' \
  'https://api.staging.alluvial.finance/v0/platform/accounts

Response:

hashtag
Create Wallet objects

hashtag
Add wallet to Allowlist

Attach a wallet object to each account. You can add the wallet to the Allowlist (on-chain) or the On-Platform list (off-chain).

The first example below shows how to add a wallet address to the Allowlist (which be default is added to the On-Platform list).

circle-info

Use the Alluvial account in UUID in the uri Path

Request:

curl -X 'POST' \
  'https://api.staging.alluvial.finance/v0/platform/accounts/da36a6fa-070d-4cd1-b99a-f2da4f4ccb20/wallets' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer eyJhbGci…CVm5g' \
  -H 'Content-Type: application/json' \
  -d '{
  "address": "0x5210d328bC5651F92F4557EfDE08dd97A36A935c",
  "type": "ETH"
}'
circle-info

The status of the Wallet object upon creation will be NOT_READY. This is because the wallet information will be sent to the Allowlist smart contract to update the Registry. Once the Registry contract is updated, the status will change to ALLOWLISTED.

Once the wallet address is added to the Allowlist it will also automatically be added to the On-Platform list.

Response:

hashtag
Add wallet to On-Platform list

Platforms that enable mint/redeem may also need to add a wallet address to the On-Platform list separately. The following request is for a Platform that enables mint/redeem to add a wallet to the On-Platform list.

Request:

curl -X 'POST' \
  'https://api.staging.alluvial.finance/v0/platform/accounts/da36a6fa-070d-4cd1-b99a-f2da4f4ccb20/wallets' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer eyJhbGci…CVm5g' \
  -H 'Content-Type: application/json' \
  -d '{
  "address": "0x5210d328bC5651F92F4557EfDE08dd97A36A935c",
  "type": "ETH",
  "allowlisted": "false"
}'

Request:

Now that you have an Account object created and Wallet objects associated, the user can stake ETH and mint LsETH. Before depositing, ensure that the Wallet object(s) have a status = ALLOWLISTED.

hashtag
Stake ETH

To complete the staking process, review this guidearrow-up-right.

Authentication Guidearrow-up-right
{
  "id": "da36a6fa-070d-4cd1-b99a-f2da4f4ccb20",
  "key": "FO123",
  "org_id": "org_WaYHN06ay6WoTjcz",
  "status": "ACTIVE",
  "created_at": "2023-03-17T17:24:18.031434748Z",
  "wallets": []
}
{
  "id": "a41c520e-fadd-4c0c-a1ce-d574ee731cee",
  "type": "ETH",
  "address": "0x5210d328bC5651F92F4557EfDE08dd97A36A935c",
  "account_id": "993327a3-1d48-4eff-a9ee-7ec769ec1f64",
  "status": "ALLOWLISTED",
  "allowlisted": true,
  "on_platform": true,
  "created_at": "2024-03-25T18:38:31.427654433Z"
}
{
  "address": "0x5210d328bC5651F92F4557EfDE08dd97A36A935c",
  "created_at": "string",
  "id": "string",
  "status": "NOT_ALLOWLISTED",
  "type": "ETH",
  "on_platform": "true"
}

Bob: user of Acme Custodian Corp

hashtag
Custodial vs. Non-Custodial wallets

A custodial wallet's private key(s) are held by either a 3rd party or by the financial institution that is servicing the wallet account on behalf of the customer. In this example, Alice and Bob have a custodial account with Acme Corp and Acme Corp owns / has access to the private key associated with Alice's and Bob's wallet addresses.

Below is an example of the flow of funds, showing how the staking action by Alice and Bob will flow through Acme's architecture and the Alluvial APIs.

circle-info

Architectural components in the Acme Infrastructure box are for illustrative purposes.

Custodial flow of funds

Non-custodial (or self-managed) wallets are those in which the customer holds the private keys. In this example, Alice is the only one with access to the private key for her wallet.

The largest differences between the two flow of funds diagrams are the wallet ownership and actions (i.e. signing transactions).

circle-info

Architectural components in the Acme Infrastructure box are for illustrative purposes.

Non custodial flow of funds

hashtag
Segregated vs. Omnibus Accounts

hashtag
Segregated account(s)

A segregated account structure is one where each customer at the financial institution (ex. Acme Corp) has their own unique, separate account. In this example, both Alice and Bob have their own unique Ethereum address associated with their individual accounts at Acme Corp.

Segregated accounts

Based on the example segregated account structure, you can see how Acme Corp will map its internal accounts to the technical resources (Organization, Depositor, Wallet) created when interacting with the Alluvial API.

Segregated accounts mapping

hashtag
Omnibus account(s)

An omnibus account is an account structure in which all users' accounts are grouped into a single wallet address.

Omnibus accounts

Below is an image of how to map Acme's architecture to resources (Organization, Depositor, and Wallet) created via Alluvial's API.

Alluvial isn't aware of, and at no time has control over, the underlying account structure Acme implements. Acme will create a Depositor object that represents all of the internal customers.

circle-exclamation

Review the Depositor states (deny, pause, reactivate, and remove)arrow-up-right as applying these states will impact all underlying customers.

Omnibus accounts mapping

Platform Server: the client looking to access the Alluvial API and which has previously been given a Client ID and Client Secret credentials.

  • Alluvial Authorization Server: responsible for validating credentials and generating JWT Access Token.

  • Alluvial API: the target resource to be accessed.

  • circle-exclamation

    To obtain a Client ID and Client Secret reach out to your Alluvial representative.

    hashtag
    Getting Access Token

    To obtain an access token, use the a request below using your client id and secret.

    Request:

    circle-info

    Make sure you are using the correct audience URL. Staging: https://api.staging.alluvial.financearrow-up-right Production: https://api.alluvial.financearrow-up-right

    Response:

    hashtag
    Refreshing Access Token

    Access Token should be reused for every request until it expires, in which case they should go through the Client Credential Flow again to obtain a fresh Access Token.

    hashtag
    Sample request

    To use the access token, pass it via the HTTP header Authorization: Bearer

    If you receive a 2xx response, you are now able to make fully authenticated requests.

    If you receive a 4xx response, check if your access token is expired.

    You are now ready to make requests! Please check out our guides on stakingarrow-up-right and redemptionsarrow-up-right.

    curl  'https://auth.alluvial.finance/oauth/token' \
    --header 'content-type: application/json' \
    --data '{
     "audience": "https://api.staging.alluvial.finance",
     "grant_type": "client_credentials",
     "client_id": "<YOUR_CLIENT_ID>",
     "client_secret": "<YOUR_CLIENT_SECRET>"
    }'
    {
      "access_token": "eyJhbGci…CVm5g",
      "scope": "read:eth-oracle read:eth-contracts read:eth-operators",
      "expires_in": 86400,
      "token_type": "Bearer"
    }
    curl 'https://api.staging.alluvial.finance/v0/wallets/0x2B7ff5d4C14A9Da8d5C9354c7A52aB40DdC1C01e' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer eyJh...b'

    Allowlisting API

    hashtag
    Ethereum

    hashtag
    Platform Account Operations

    hashtag
    Platform Wallet Operations

    hashtag
    Platform Account Wallet Operations

    hashtag
    Solana

    hashtag
    Check Allowlist Status

    Checks whether a Solana wallet address is allowlisted for staking and redemption operations.

    Endpoint: GET https://api.alluvial.finance/sol/v0/allowlist/{address}

    Path Parameters:

    Parameter
    Type
    Description

    Response:

    Response Fields:

    Field
    Type
    Description

    hashtag
    Add Wallet to Allowlist

    Adds a Solana wallet address to the allowlist, granting permissions for staking and/or redemption operations.

    Endpoint: POST https://api.alluvial.finance/sol/v0/allowlist

    Request Body:

    Request Fields:

    Field
    Type
    Required
    Description

    Response:

    Response Fields:

    Field
    Type
    Description
    '
    \
    -H 'accept: application/json' \
    -H 'Authorization: Bearer eyJhbGci…CVm5g' \
    -H 'Content-Type: application/json' \
    -d '{
    "key": "FO123"
    }'

    boolean

    Whether the wallet has permission to stake SOL

    permissions.redemption

    boolean

    Whether the wallet has permission to redeem lsSOL

    Grant permission to stake SOL

    permissions.redemption

    boolean

    Yes

    Grant permission to redeem lsSOL

    boolean

    Whether the wallet has permission to stake SOL

    permissions.redemption

    boolean

    Whether the wallet has permission to redeem lsSOL

    created_at

    string

    ISO 8601 timestamp when the wallet was allowlisted

    address

    string

    Solana wallet address to check

    {
      "address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
      "allowlisted": true,
      "permissions": {
        "staking": true,
        "redemption": true
      }
    }

    address

    string

    The Solana wallet address that was checked

    allowlisted

    boolean

    Whether the wallet is on the allowlist

    {
      "address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
      "permissions": {
        "staking": true,
        "redemption": true
      }
    }

    address

    string

    Yes

    Solana wallet address to add to the allowlist

    permissions.staking

    boolean

    {
      "address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
      "allowlisted": true,
      "permissions": {
        "staking": true,
        "redemption": true
      },
      "created_at": "2025-01-15T10:30:00Z"
    }

    address

    string

    The Solana wallet address that was added

    allowlisted

    boolean

    Confirmation that the wallet is now on the allowlist

    permissions.staking

    Yes

    permissions.staking

    Reporting

    Alluvial's reporting API enables Platforms to request the ETH network rewards that their users have received. Below are two guides:

    1. Platforms with omnibus account structure.

    2. Platforms with segregated account structure.

    hashtag
    Omnibus account structure

    Platforms that support an omnibus structure should use the /eth/v0/rewards endpoint. This will return data in a lots structure. Lots represent LsETH balance changes for a given period. Rewards can then be calculated for each period. Total rewards for a user is the sum of rewards for each lot.

    Below is an example request where a Platform wants to see the rewards for a wallet. Assume that the user has a total balance of 3 but acquired at different dates.

    • The user had 1 LsETH from 2024-04-01 to 2024-04-10. As such this will be the first lot added to the request body.

    • The user then acquired 2 more LsETH, for a total of 3, as of 2024-04-11.

    In our request below assume that the current date for which we want data is til 2024-04-15.

    hashtag
    Request

    hashtag
    Response

    hashtag
    Segregated account structure

    Platforms that support a segregated structure can use two different endpoints to get reward data at the account or wallet level.

    hashtag
    List rewards by account(s)

    Use the endpoint /eth/v0/rewards/accounts to display ETH network rewards at the account level.

    circle-info

    For a range of days, use the endpoint /eth/v0/rewards/accounts/:idOrKey/summary

    hashtag
    Request

    hashtag
    Response

    Below is the response show the aggregated rewards for the account in addition for each address.

    hashtag
    List rewards by wallet(s)

    Use the endpoint /eth/v0/rewards/wallets to display ETH network rewards at the wallet level.

    circle-info

    For a range of days, use the endpoint /eth/v0/rewards/wallets/:idOrKey/summary

    hashtag
    Request

    hashtag
    Response

    Below is the response showing the aggregated rewards for the account in addition for each address.

    hashtag
    Staking Reward Rate

    The Alluvial API provides a staking rewards rate (SRR), which is calculated as a 7 day trailing average.

    To get SRR information, call the endpoint.

    hashtag
    Request

    hashtag
    Response

    Based on providing a specific date of 2024-05-01, the returned SRR is 2.85%.

    hashtag
    Discounting API

    Platforms that want to provide a custom discount to their users can use the Discounting APIs to offload the calculations of a discounted net Protocol Service Fee to Alluvial's enterprise accounting service. Platforms can then use the API to call ETH network rewards, Protocol Service Fees, and end user discounts for one or more wallets or user accounts.

    First, you will set a new target fee rate. This represents the new gross Protocol Service Fee rate that will be calculated for an account and/or wallet.

    For example, the current gross rate is 10%. To offer a user an effective net rate of 8%, you'd set the target fee rate at 0.08, which effectively provides a 2% discount to the associated wallet(s) and/or account(s).

    hashtag
    Request

    The target fee rate is now set at 8%.

    hashtag
    Response

    On each Oracle report, you can use the Reporting APIs to see discounted values for the associated account, including the discounted net Protocol Service Fee, ETH network rewards received adjusted for that Fee, and effective end user discounts.

    hashtag
    Request

    In the response below, you can see that the rebate_eth or rebate_lseth will reflect the amount the wallet is attributed to be reimbursed in order to achieve the the 8% target fee rate (or conversely, a 2% discount on the gross Protocol Service Fee).

    hashtag
    Response

    The discount data is exposed via the following API endpoints:

    • /rewards/wallets

    • /eth/v0/rewards/accounts/:idOrKey/summary

    • /eth/v0/rewards/wallets/:idOrKey/summary

    /protocolarrow-up-right
    Protocol Service Feearrow-up-right
    curl --request POST 'https://api.staging.alluvial.finance/eth/v0/rewards' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer e...g' \
    --data '[
    	{
    		"balance": "1",
    		"from": "2024-04-01",
    		"to": "2024-04-10"
    	},
    	{
    		"balance": "3",
    		"from": "2024-04-11",
    		"to": "2024-04-15"
    	}
    ]'
    {
      "balance": "4",
      "accrued_rewards": "0.0041516089956458",
      "lots": [
        {
          "from": "2024-04-01",
          "to": "2024-04-10",
          "start_conversion_rate": "1.0014257204933798",
          "end_conversion_rate": "1.0023467329617235",
          "balance": "1",
          "accrued_rewards": "0.0009210124683437"
        },
        {
          "from": "2024-04-11",
          "to": "2024-04-15",
          "start_conversion_rate": "1.0026157619809285",
          "end_conversion_rate": "1.0036926274900292",
          "balance": "3",
          "accrued_rewards": "0.0032305965273021"
        }
      ]
    }
    curl --request POST 'https://api.staging.alluvial.finance/eth/v0/rewards/accounts' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Impersonate-Org: org_uLD0aCAXyWYg4WQH' \
    --header 'Authorization: Bearer ey...Qg' \
    --data '{
    	"accounts": [
    		"8f9d6eff-d630-4389-810f-89c4b07b8fc5"
    	],
    	"date": "2024-05-15",
    	"unit": "eth"
    }'
    [
      {
        "account_id": "8f9d6eff-d630-4389-810f-89c4b07b8fc5",
        "totals": {
          "balance_lseth": "0.0000198315414745",
          "rewards_eth": "0.000000000092766089"
        },
        "date": "2024-05-15",
        "wallets": [
          {
            "oracle_report": "1437a7330f02400a5662ed70f5c23b251d76fdb1ede48240d9f1e7bcd70540470000014b",
            "address": "0x7fc2B172EcC8E4609088f341Aa0Fb3841De8A77A",
            "account_id": "8f9d6eff-d630-4389-810f-89c4b07b8fc5",
            "org_id": "org_WaYHN06ay6WoTjcz",
            "date": "2024-05-15",
            "balance_lseth": "0.00000991577073725",
            "rewards_eth": "0.000000000092766089",
            "total_rewards_eth": "0.000000000092766089",
            "conversion_rate": "1.0085131998588114",
            "previous_conversion_rate": "1.0085038444500037",
            "mints_lseth": "0",
            "total_mints_lseth": "0.00000991577073725",
            "burns_lseth": "0",
            "total_burns_lseth": "0",
            "fees_eth": "0.000000000010307343",
            "total_fees_eth": "0.000000000010307343",
            "dao_fees_eth": "0.000000000000979198",
            "total_dao_fees_eth": "0.000000000000979198",
            "provider_fees_eth": "0.000000000000360757",
            "total_provider_fees_eth": "0.000000000000360757",
            "slashing_fees_eth": "0.00000000000030922",
            "total_slashing_fees_eth": "0.00000000000030922",
            "platform_fees_eth": "0.000000000007112067",
            "total_platform_fees_eth": "0.000000000007112067",
            "operator_fees_eth": "0.000000000001546101",
            "total_operator_fees_eth": "0.000000000001546101"
          }
        ]
      }
    ]
    curl --request POST 'https://api.staging.alluvial.finance/eth/v0/rewards/wallets' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Impersonate-Org: org_uLD0aCAXyWYg4WQH' \
    --header 'Authorization: Bearer ey...Qg' \
    --data '{
    	"addresses": [
    		"0x7fc2B172EcC8E4609088f341Aa0Fb3841De8A77A"
    	],
    	"date": "2024-05-15",
    	"unit": "eth"
    }'
    [
      {
        "oracle_report": "1437a7330f02400a5662ed70f5c23b251d76fdb1ede48240d9f1e7bcd70540470000014b",
        "address": "0x7fc2B172EcC8E4609088f341Aa0Fb3841De8A77A",
        "account_id": "8f9d6eff-d630-4389-810f-89c4b07b8fc5",
        "org_id": "org_WaYHN06ay6WoTjcz",
        "date": "2024-05-15",
        "balance_lseth": "0.00000991577073725",
        "rewards_eth": "0.000000000092766089",
        "total_rewards_eth": "0.000000000092766089",
        "conversion_rate": "1.0085131998588114",
        "previous_conversion_rate": "1.0085038444500037",
        "mints_lseth": "0",
        "total_mints_lseth": "0.00000991577073725",
        "burns_lseth": "0",
        "total_burns_lseth": "0",
        "fees_eth": "0.000000000010307343",
        "total_fees_eth": "0.000000000010307343",
        "dao_fees_eth": "0.000000000000979198",
        "total_dao_fees_eth": "0.000000000000979198",
        "provider_fees_eth": "0.000000000000360757",
        "total_provider_fees_eth": "0.000000000000360757",
        "slashing_fees_eth": "0.00000000000030922",
        "total_slashing_fees_eth": "0.00000000000030922",
        "platform_fees_eth": "0.000000000007112067",
        "total_platform_fees_eth": "0.000000000007112067",
        "operator_fees_eth": "0.000000000001546101",
        "total_operator_fees_eth": "0.000000000001546101"
      }
    ]
    curl 'https://api.alluvial.finance/eth/v0/protocol/2024-05-01' \
    --header 'Accept: application/json' \
    --header 'Accept: application/json'
    [
      {
        "oracle_report": "2e39c7e7e0b78c043ac98e190175fa7f057a75197647d4d844864ac06c98aa3400000225",
        "date": "2024-05-01T12:14:47Z",
        "total_protocol_mints_lseth": "89180.704128270784037675",
        "total_protocol_burns_lseth": "6676.332903830493099868",
        "total_protocol_active_keys_count": 2703,
        "rewards_eth": "6.66289490787142415",
        "gross_fee_rate": "0.1",
        "gross_fee_lseth": "0.636483355669561459",
        "conversion_rate": "1.0468294022963504",
        "total_lseth_supply": "82674.954629966742503924",
        "a_srr_7d": "2.85"
      }
    ]
    curl --location --request POST 'https://api.staging.alluvial.finance/v0/platform/accounts/8f9d6eff-d630-4389-810f-89c4b07b8fc5/discount_rate' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer eyJQ' \
    --data '{
      "target_fee_rate": 0.08
    }'
    {
      "account_id": "8f9d6eff-d630-4389-810f-89c4b07b8fc5",
      "target_fee_rate": "0.08",
      "created_at": "2024-06-24T21:27:07.387160077Z"
    }
    curl --location --request POST 'https://api.staging.alluvial.finance/eth/v0/rewards/accounts' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer eyJ...mQ' \
    --data '{
      "accounts": [
        "8f9d6eff-d630-4389-810f-89c4b07b8fc5"
      ],
      "date": "2024-06-22",
      "unit": "lseth"
    }'
    [
      {
        "account_id": "8f9d6eff-d630-4389-810f-89c4b07b8fc5",
        "totals": {
          "balance_lseth": "0.947997263286356641",
          "rewards_eth": "0.001671038079957103"
        },
        "date": "2024-06-22",
        "wallets": [
          {
            "oracle_report": "43306f4695a1d7ed4118c68fecd150e1f071b338815007960e61900d8d9c123e00000046",
            "address": "0x4D1c3ec0B381F012A90f096cD4E8bc7746e4f2eB",
            "account_id": "8f9d6eff-d630-4389-810f-89c4b07b8fc5",
            "org_id": "org_WaYHN06ay6WoTjcz",
            "date": "2024-06-22",
            "balance_lseth": "0.00001",
            "rewards_eth": "0.000000000087955639",
            "total_rewards_eth": "0.000000020987954327",
            "conversion_rate": "1.0106749980064223",
            "previous_conversion_rate": "1.0106662024425232",
            "mints_lseth": "0",
            "total_mints_lseth": "0",
            "burns_lseth": "0",
            "total_burns_lseth": "0",
            "fees_eth": "0.000000000009772849",
            "total_fees_eth": "0.000000002331994927",
            "dao_fees_eth": "0.000000000000928421",
            "total_dao_fees_eth": "0.000000000221539524",
            "provider_fees_eth": "0.00000000000034205",
            "total_provider_fees_eth": "0.000000000081619819",
            "slashing_fees_eth": "0.000000000000293185",
            "total_slashing_fees_eth": "0.00000000006995985",
            "platform_fees_eth": "0.000000000006743266",
            "total_platform_fees_eth": "0.000000001609076496",
            "platform_fees_at_discount_rate_eth": "0",
            "total_platform_fees_at_discount_rate_eth": "0",
            "operator_fees_eth": "0.000000000001465927",
            "total_operator_fees_eth": "0.00000000034979924",
            "gross_protocol_fee_rate": "0",
            "discount_rate": "0",
            "gross_fees_eth": "0.000000000009772849",
            "total_gross_fees_eth": "0.000000002331994927",
            "gross_rewards_eth": "0.000000000097728488",
            "total_gross_rewards_eth": "0.000000000189971905",
            "rebate_eth": "0",
            "total_rebate_eth": "0",
            "rebate_lseth": "0",
            "total_rebate_lseth": "0"
          },
          {
            "oracle_report": "43306f4695a1d7ed4118c68fecd150e1f071b338815007960e61900d8d9c123e00000046",
            "address": "0x7fc2B172EcC8E4609088f341Aa0Fb3841De8A77A",
            "account_id": "8f9d6eff-d630-4389-810f-89c4b07b8fc5",
            "org_id": "org_WaYHN06ay6WoTjcz",
            "date": "2024-06-22",
            "balance_lseth": "0.947987263286356641",
            "rewards_eth": "0.000008338082549768",
            "total_rewards_eth": "0.001671017092002776",
            "conversion_rate": "1.0106749980064223",
            "previous_conversion_rate": "1.0106662024425232",
            "mints_lseth": "0",
            "total_mints_lseth": "5.947997863289656641",
            "burns_lseth": "0",
            "total_burns_lseth": "0.0000006000033",
            "fees_eth": "0.000000926453616641",
            "total_fees_eth": "0.000185668565778085",
            "dao_fees_eth": "0.000000088013093581",
            "total_dao_fees_eth": "0.000017638513748923",
            "provider_fees_eth": "0.000000032425876582",
            "total_provider_fees_eth": "0.000006498399802232",
            "slashing_fees_eth": "0.000000027793608499",
            "total_slashing_fees_eth": "0.000005570056973343",
            "platform_fees_eth": "0.000000639252995482",
            "total_platform_fees_eth": "0.000128111310386881",
            "platform_fees_at_discount_rate_eth": "0",
            "total_platform_fees_at_discount_rate_eth": "0",
            "operator_fees_eth": "0.000000138968042496",
            "total_operator_fees_eth": "0.000027850284866709",
            "gross_protocol_fee_rate": "0",
            "discount_rate": "0",
            "gross_fees_eth": "0.000000926453616641",
            "total_gross_fees_eth": "0.000185668565778085",
            "gross_rewards_eth": "0.000009264536166409",
            "total_gross_rewards_eth": "0.000018009094566287",
            "rebate_eth": "0",
            "total_rebate_eth": "0",
            "rebate_lseth": "0",
            "total_rebate_lseth": "0"
          }
        ]
      }
    ]

    hashtag
    Create a discounted fee rate for an account

    post

    Create a discounted fee rate for an account

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the account to add discounted fee rate to

    Body
    target_fee_ratenumberOptionalExample: 0.05
    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptionalExample: 36cc991e-d4r5-422c-8248-ac356e800fc1
    created_atstringOptionalExample: 2023-12-31T23:59:59Z
    removed_atstringOptionalExample: 2023-12-31T23:59:59Z
    target_fee_ratenumberOptionalExample: 0.05
    chevron-right
    400

    Invalid discount rate" {message:discountRateValidation}

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Account not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    409

    Discounted fee rate already exists for this account. To modify it, please use the update api endpoint.

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    post
    /v0/platform/accounts/{idOrKey}/discount_rate

    hashtag
    Get the discounted fee rate for an account

    get

    Get the discounted fee rate for an account

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the account to get discount rate for

    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptionalExample: 36cc991e-d4r5-422c-8248-ac356e800fc1
    created_atstringOptionalExample: 2023-12-31T23:59:59Z
    removed_atstringOptionalExample: 2023-12-31T23:59:59Z
    target_fee_ratenumberOptionalExample: 0.05
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Account not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /v0/platform/accounts/{idOrKey}/discount_rate

    hashtag
    Update a discounted fee rate for an account

    patch

    Update a discounted fee rate for an account. If the discount rate already exists, it will be updated. A TargetFeeRate of 0.1 means no discount.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the account to update discounted fee rate for

    Body
    target_fee_ratenumberOptionalExample: 0.05
    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptionalExample: 36cc991e-d4r5-422c-8248-ac356e800fc1
    created_atstringOptionalExample: 2023-12-31T23:59:59Z
    removed_atstringOptionalExample: 2023-12-31T23:59:59Z
    target_fee_ratenumberOptionalExample: 0.05
    chevron-right
    304

    Discount rate is already set to the requested value

    application/json
    chevron-right
    400

    Invalid discount rate" {message:discountRateValidation}

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Account not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    patch
    /v0/platform/accounts/{idOrKey}/discount_rate

    hashtag
    Get latest status of the Ethereum protocol

    get

    Get global information about protocol token supplies

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    chevron-right
    200

    OK

    application/json
    active_validator_countintegerOptional

    Count of total validators minus stopped validators on the consensus layer

    Example: 58
    active_validators_eth_balancestringOptional

    Total consensus ETH balance of all validators on the consensus layer (as reported by the Oracle) in Wei

    Example: 128000000000000000000
    block_numberintegerOptional

    Height of the returned data

    Example: 15034284
    collected_rewardsstringOptional

    Total collected rewards

    Example: 3200000000000000000000
    contract_eth_balancestringOptional

    ETH balance on the contract in Wei

    Example: 5000000000000000000
    conversion_ratenumberOptional
    deposit_countintegerOptional

    Number of deposits

    Example: 2
    exited_validators_eth_balancestringOptional

    Total ETH balance of exited validators on the consensus layer (as reported by the Oracle) in Wei

    Example: 128000000000000000000
    exiting_validators_eth_balancestringOptional

    Total ETH balance of exiting validators on the consensus layer (as reported by the Oracle) in Wei

    Example: 128000000000000000000
    funded_validator_countintegerOptional

    Count of funded validators

    Example: 102
    funded_valitor_countintegerOptional

    Previous typo made, keeping for backwards compatibility

    Example: 102
    pending_validator_countintegerOptional

    Count of funded validators and pending activation on the consensus layer (as reported by the Oracle)

    Example: 2
    pending_validators_eth_balancestringOptional

    Total ETH balance of pending validators in GWei

    Example: 64000000000000000000
    rebalance_deposit_to_redeem_modebooleanOptionalExample: true
    skimmed_validators_eth_balancestringOptional

    Total ETH balance of skimmed withdrawals (as reported by the Oracle) in Wei

    Example: 128000000000000000000
    slashing_containment_modebooleanOptionalExample: false
    stopped_validator_countintegerOptional

    Count of stopped LC validators on the consensus layer (as reported by the Oracle)

    Example: 42
    total_eth_balancestringOptional

    Total ETH balance managed by the River protocol in GWei

    Example: 3200000000000000000000
    total_eth_depositedstringOptional

    Total ETH deposited

    Example: 3200000000000000000000
    total_supplystringOptional

    Total LsETH supply

    Example: 3200000000000000000000
    total_validator_countintegerOptional

    Count of all LC validators found on the consensus layer (as reported by the Oracle)

    Example: 100
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/status

    hashtag
    Get status of the Ethereum protocol at a given block number

    get

    Get global information about protocol token supplies at a given block number

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    block_numberintegerRequired

    Block height to query

    Responses
    chevron-right
    200

    OK

    application/json
    active_validator_countintegerOptional

    Count of total validators minus stopped validators on the consensus layer

    Example: 58
    active_validators_eth_balancestringOptional

    Total consensus ETH balance of all validators on the consensus layer (as reported by the Oracle) in Wei

    Example: 128000000000000000000
    block_numberintegerOptional

    Height of the returned data

    Example: 15034284
    collected_rewardsstringOptional

    Total collected rewards

    Example: 3200000000000000000000
    contract_eth_balancestringOptional

    ETH balance on the contract in Wei

    Example: 5000000000000000000
    conversion_ratenumberOptional
    deposit_countintegerOptional

    Number of deposits

    Example: 2
    exited_validators_eth_balancestringOptional

    Total ETH balance of exited validators on the consensus layer (as reported by the Oracle) in Wei

    Example: 128000000000000000000
    exiting_validators_eth_balancestringOptional

    Total ETH balance of exiting validators on the consensus layer (as reported by the Oracle) in Wei

    Example: 128000000000000000000
    funded_validator_countintegerOptional

    Count of funded validators

    Example: 102
    funded_valitor_countintegerOptional

    Previous typo made, keeping for backwards compatibility

    Example: 102
    pending_validator_countintegerOptional

    Count of funded validators and pending activation on the consensus layer (as reported by the Oracle)

    Example: 2
    pending_validators_eth_balancestringOptional

    Total ETH balance of pending validators in GWei

    Example: 64000000000000000000
    rebalance_deposit_to_redeem_modebooleanOptionalExample: true
    skimmed_validators_eth_balancestringOptional

    Total ETH balance of skimmed withdrawals (as reported by the Oracle) in Wei

    Example: 128000000000000000000
    slashing_containment_modebooleanOptionalExample: false
    stopped_validator_countintegerOptional

    Count of stopped LC validators on the consensus layer (as reported by the Oracle)

    Example: 42
    total_eth_balancestringOptional

    Total ETH balance managed by the River protocol in GWei

    Example: 3200000000000000000000
    total_eth_depositedstringOptional

    Total ETH deposited

    Example: 3200000000000000000000
    total_supplystringOptional

    Total LsETH supply

    Example: 3200000000000000000000
    total_validator_countintegerOptional

    Count of all LC validators found on the consensus layer (as reported by the Oracle)

    Example: 100
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/status/{block_number}

    hashtag
    List LsETH balance of several addresses

    get

    List LsETH balance of several addresses It is possible to specify for which block and which addresses to get the balances.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    addressesstringOptional

    Comma separated list of addresses (if empty returns all addresses)

    block_numberintegerOptional

    Block number at which to get balance for (latest by default)

    limitintegerOptional

    Limit of elements to return (100 by default)

    Responses
    chevron-right
    200

    OK

    application/json
    addressstringOptional

    Owner address

    Example: 0x123456789985ca04a69c35978c3a3e778d6ef172
    balancestringOptional

    LsETH balance

    Example: 4200000000000000000000
    block_numberintegerOptional

    Block height of the balance

    Example: 15034284
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/balances

    hashtag
    Get LsETH balance of a given address

    get

    Get LsETH balance of a given address It is possible to specify for which block to get the balance at.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    addressstringRequired

    Account address to query the balance for

    Query parameters
    block_numberintegerOptional

    Block number at which to get balance for (latest by default)

    Responses
    chevron-right
    200

    OK

    application/json
    addressstringOptional

    Owner address

    Example: 0x123456789985ca04a69c35978c3a3e778d6ef172
    balancestringOptional

    LsETH balance

    Example: 4200000000000000000000
    block_numberintegerOptional

    Block height of the balance

    Example: 15034284
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/balances/{address}

    hashtag
    Get LsETH balance history

    get

    Get the LsETH balance history for a given address It returns a balance object for every block a balance change occurred It is possible to filter the history for a range of blocks

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    addressstringRequired

    Address of the balance to query balance for

    Query parameters
    from_blockintegerOptional

    Starting block height to query (0 by default)

    to_blockintegerOptional

    Ending block height to query (latest by default)

    limitintegerOptional

    Limit of elements to return (100 by default)

    Responses
    chevron-right
    200

    OK

    application/json
    addressstringOptional

    Owner address

    Example: 0x123456789985ca04a69c35978c3a3e778d6ef172
    balancestringOptional

    LsETH balance

    Example: 4200000000000000000000
    block_numberintegerOptional

    Block height of the balance

    Example: 15034284
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/balances/{address}/history

    hashtag
    List the smart contracts

    get

    List all the smart contracts addresses used

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    chevron-right
    200

    OK

    application/json
    allowlisterinteger[]Optional
    deployment_blockintegerOptional
    el_fee_recipientinteger[]Optional
    operators_registryinteger[]Optional
    oracleinteger[]Optional
    redeem_managerinteger[]Optional
    riverinteger[]Optional
    withdrawinteger[]Optional
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/contracts

    hashtag
    List the redeem requests

    get

    List the redeem requests for one or multiple owners (addresses)

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    ownerstringRequired

    The address or addresses to query, separated by commas

    Responses
    chevron-right
    200

    OK

    application/json
    claimable_amount_lsethnumberOptional

    The possible amount available to claim in LsETH

    Example: 16.25
    claimed_amount_ethnumberOptional

    The amount already claimed in ETH

    Example: 16.5
    claimed_amount_lsethnumberOptional

    The amount already claimed in LsETH

    Example: 16.25
    heightnumberOptional

    The height is the cumulative sum of all the sizes of preceding redeem requests

    Example: 1024.75
    idintegerOptional

    The ID of the redeem request

    Example: 1048576
    max_redeemable_amount_ethnumberOptional

    The maximum amount of ETH redeemable by this request

    Example: 33
    ownerstringOptional

    The owner of the redeem request

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    requested_atintegerOptional

    Block time

    status_claimstring · enumOptionalPossible values:
    status_satisfactionstring · enumOptionalPossible values:
    timestampstringOptional

    Timestamp

    Example: 2024-01-25 13:07:50.335845 +0000 UTC
    total_amount_lsethnumberOptional

    The amount of the redeem request in LsETH

    Example: 32.5
    withdrawal_event_idintegerOptional

    The withdrawal event ID needed to claim the redeem (or -1 when no withdrawals available)

    Example: 42
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal Error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/redeems

    hashtag
    List a redeem request by id

    get

    List a redeem request by the request id, obtained from /eth/v0/redeems

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idxintegerRequired

    The redeem request id to query

    Responses
    chevron-right
    200

    OK

    application/json
    claimable_amount_lsethnumberOptional

    The possible amount available to claim in LsETH

    Example: 16.25
    claimed_amount_ethnumberOptional

    The amount already claimed in ETH

    Example: 16.5
    claimed_amount_lsethnumberOptional

    The amount already claimed in LsETH

    Example: 16.25
    heightnumberOptional

    The height is the cumulative sum of all the sizes of preceding redeem requests

    Example: 1024.75
    idintegerOptional

    The ID of the redeem request

    Example: 1048576
    max_redeemable_amount_ethnumberOptional

    The maximum amount of ETH redeemable by this request

    Example: 33
    ownerstringOptional

    The owner of the redeem request

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    requested_atintegerOptional

    Block time

    status_claimstring · enumOptionalPossible values:
    status_satisfactionstring · enumOptionalPossible values:
    timestampstringOptional

    Timestamp

    Example: 2024-01-25 13:07:50.335845 +0000 UTC
    total_amount_lsethnumberOptional

    The amount of the redeem request in LsETH

    Example: 32.5
    withdrawal_event_idintegerOptional

    The withdrawal event ID needed to claim the redeem (or -1 when no withdrawals available)

    Example: 42
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not Found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal Error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/redeems/{idx}

    hashtag
    Get a redeem request time projection

    get

    Get a redeem request time projection for becoming redeemable

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idxintegerRequired

    The redeem request id to query

    Responses
    chevron-right
    200

    OK

    application/json
    projected_redeemable_atstringOptional
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not Found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal Error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/redeems/{idx}/projection

    hashtag
    List the redeem manager

    get

    List the withdrawal event height and redeem request height

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    chevron-right
    200

    OK

    application/json
    total_amount_redeem_queue_lsethnumberOptional

    The cumulative sum of the redeem request heights

    total_amount_withdrawal_stack_lsethnumberOptional

    The cumulative sum of the withdrawal event heights

    chevron-right
    500

    Internal Error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/redeems_info

    hashtag
    Get the redeem manager time projection

    get

    Get the redeem manager time projection for being fulfilled

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    chevron-right
    200

    OK

    application/json
    projected_fulfilled_atstringOptional
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal Error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/redeems_info/projection

    hashtag
    Returns validator exit queue info

    get

    Returns validator exit queue info, including time estimates.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    chevron-right
    200

    OK

    application/json
    exit_time_hoursnumberOptional
    mandatory_exit_delay_hoursnumberOptional
    sweep_time_hoursnumberOptional
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/validators/queue

    hashtag
    List latest high-level protocol info

    get

    List latest available high-level protocol

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    unitstringOptional

    Display LsETH values in units of wei or ether. If not present, LsETH is set by default.

    Responses
    chevron-right
    200

    OK

    application/json
    a_srr_7dnumberOptionalExample: 3.95
    conversion_ratenumberOptionalExample: 1.012345
    datestringOptionalExample: 2023-01-02T03:04:05Z
    gross_fee_lsethnumberOptionalExample: 0.1851
    gross_fee_ratenumberOptionalExample: 0.15
    oracle_reportstringOptionalExample: f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef
    protocol_service_fee_ratenumberOptionalExample: 0.11
    rewards_ethnumberOptionalExample: 1.234
    total_eth_stakednumberOptionalExample: 122007944.381
    total_lseth_supplynumberOptionalExample: 120520123.456789
    total_protocol_active_keys_countintegerOptionalExample: 76
    total_protocol_burns_lsethnumberOptionalExample: 32
    total_protocol_mints_lsethnumberOptionalExample: 32
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/protocol

    hashtag
    List high-level protocol info

    get

    List high-level protocol info for a given date

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    datestringRequired

    Date filter by year, month or day (eg. 2023, 2023-12, 2023-12-31). Note: times are UTC

    Query parameters
    unitstringOptional

    Display LsETH values in units of wei or ether. If not present, LsETH is set by default.

    page_sizeintegerOptional

    Number of results per page (1-1000, default 100)

    next_cursorstringOptional

    Cursor returned from previous page

    Responses
    chevron-right
    200

    OK

    application/json
    a_srr_7dnumberOptionalExample: 3.95
    conversion_ratenumberOptionalExample: 1.012345
    datestringOptionalExample: 2023-01-02T03:04:05Z
    gross_fee_lsethnumberOptionalExample: 0.1851
    gross_fee_ratenumberOptionalExample: 0.15
    oracle_reportstringOptionalExample: f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef
    protocol_service_fee_ratenumberOptionalExample: 0.11
    rewards_ethnumberOptionalExample: 1.234
    total_eth_stakednumberOptionalExample: 122007944.381
    total_lseth_supplynumberOptionalExample: 120520123.456789
    total_protocol_active_keys_countintegerOptionalExample: 76
    total_protocol_burns_lsethnumberOptionalExample: 32
    total_protocol_mints_lsethnumberOptionalExample: 32
    block_timestringOptional
    event_idinteger[]Optional
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/protocol/{date}

    hashtag
    List wallet transactions

    get

    List wallet transactions for a given time period and wallet address

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    addressstringRequired

    Wallet address

    Query parameters
    fromstringOptional

    Start date (default: 1 year ago)

    tostringOptional

    End date (default: current time)

    csvstringOptional

    Output as CSV

    page_sizestringOptional

    Page size (default: 100)

    next_cursorstringOptional

    Next cursor

    Responses
    chevron-right
    200

    OK

    application/json
    amount_ethnumberOptionalExample: 10
    amount_lsethnumberOptionalExample: 9.5
    conversion_ratenumberOptionalExample: 0.96
    datestringOptionalExample: 2024-06-21
    finalizedbooleanOptionalExample: true
    transaction_hashstringOptionalExample: 0x5E9E16C6DEB4022399E4FCD387BCB59AC5855762
    transaction_typestringOptionalExample: Deposit
    amountnumberOptional
    blockNumberintegerOptional
    datestringOptional
    eventIDinteger[]Optional
    finalizedbooleanOptional
    newTotalEthSupplynumberOptional
    newTotalSupplynumberOptional
    transactionHashinteger[]Optional
    transactionTypestring · enumOptionalPossible values:
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/wallet/{address}/transactions

    hashtag
    List platform fees

    get

    List all platform fees for a given date

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    datestringRequired

    Date filter by year, month or day (eg. 2023, 2023-12, 2023-12-31). Note: times are UTC

    Query parameters
    unitstringOptional

    Display LsETH values in units of wei or ether. If not present, LsETH is set by default.

    page_sizeintegerOptional

    Number of oracle reports per page (1-1000, default 100)

    next_cursorstringOptional

    Cursor returned from previous page

    Responses
    chevron-right
    200

    OK

    application/json
    conversion_ratenumberOptionalExample: 1.012345
    dao_fees_lsethnumberOptionalExample: 0.00001234567
    dao_fees_ratenumberOptionalExample: 0.0015
    datestringOptionalExample: 2023-01-02T03:04:05Z
    gross_fee_lsethnumberOptionalExample: 0.0001234
    operator_fees_lsethnumberOptionalExample: 0.000123456789
    operator_fees_ratenumberOptionalExample: 0.0035
    oracle_reportstringOptionalExample: f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef
    org_idstringOptionalExample: org_example1234
    fees_lsethnumberOptionalExample: 0.0001234567
    fees_ratenumberOptionalExample: 0.097
    adjusted_total_net_outflows_fees_lsethnumberOptionalExample: 0.0001234567
    adjusted_total_net_outflows_lsethnumberOptionalExample: 0.0001234567
    adjusted_total_net_outflows_transfers_lsethnumberOptionalExample: 0.0001234567
    fees_paid_lsethnumberOptionalExample: 0.0001234567
    off_platform_attributable_fees_lsethnumberOptionalExample: 0.0001234567
    off_platform_balance_lsethnumberOptionalExample: 0.0001234567
    off_platform_fees_lsethnumberOptionalExample: 0.0001234567
    off_platform_gross_fee_lsethnumberOptionalExample: 0.0001234567
    outflow_rationumberOptionalExample: 0.0001234567
    total_burns_lsethnumberOptionalExample: 32.1234
    total_mints_lsethnumberOptionalExample: 32.1234
    total_net_outflows_lsethnumberOptionalExample: 0.0001234567
    total_on_platform_lsethnumberOptionalExample: 0.0001234567
    total_outflows_lsethnumberOptionalExample: 0.0001234567
    total_platform_transfers_in_lsethnumberOptionalExample: 0.0001234567
    total_platform_transfers_out_lsethnumberOptionalExample: 0.0001234567
    on_platform_attributable_fees_lsethnumberOptionalExample: 0.0001234567
    on_platform_fees_lsethnumberOptionalExample: 0.0001234567
    on_platform_lsethnumberOptionalExample: 120520123.456789
    on_platform_rationumberOptionalExample: 0.0001234567
    total_balance_lsethnumberOptionalExample: 0.0001234567
    slashing_coverage_fees_lsethnumberOptionalExample: 0.0000012345678
    slashing_coverage_fees_ratenumberOptionalExample: 0.003
    tech_provider_fees_lsethnumberOptionalExample: 0.0000123456789
    tech_provider_fees_ratenumberOptionalExample: 0.0035
    total_eth_supplynumberOptionalExample: 120520123.456789
    total_lseth_supplynumberOptionalExample: 120520123.456789
    versionintegerOptionalExample: 3
    block_timestringOptional
    event_idinteger[]Optional
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/platforms/{date}

    hashtag
    List operator fees

    get

    List platform operator fees for a given date

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    datestringRequired

    Date filter by year, month or day (eg. 2023, 2023-12, 2023-12-31). Note: times are UTC

    Query parameters
    unitstringOptional

    Display LsETH values in units of wei or ether. If not present, LsETH is set by default.

    page_sizeintegerOptional

    Number of oracle reports per page (1-1000, default 100)

    next_cursorstringOptional

    Cursor returned from previous page

    Responses
    chevron-right
    200

    OK

    application/json
    conversion_ratenumberOptionalExample: 1.012345
    datestringOptionalExample: 2023-01-02T03:04:05Z
    operator_active_keys_countintegerOptionalExample: 5
    operator_active_keys_rationumberOptionalExample: 0.5
    operator_fees_lsethnumberOptionalExample: 0.00006
    oracle_reportstringOptionalExample: f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef
    org_idstringOptionalExample: org_example1234
    total_active_keys_countintegerOptionalExample: 10
    total_operator_fees_lsethnumberOptionalExample: 0.00012
    versionintegerOptionalExample: 3
    block_timestringOptional
    event_idinteger[]Optional
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/operators/{date}

    hashtag
    List rewards

    post

    List rewards for a time period

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Bodyobject[]
    balancestringOptionalExample: 0.382748642252721461
    fromstringOptionalExample: 2024-01-01
    tostringOptionalExample: 2024-01-31
    Responses
    chevron-right
    200

    OK

    application/json
    accrued_rewardsnumberOptionalExample: 0.00003930554936445
    accrued_rewardsnumberOptionalExample: 0.000038075574334017
    balancenumberOptionalExample: 0.3827486422527215
    end_conversion_ratenumberOptionalExample: 1.037253225665527
    fromstringOptionalExample: 2024-01-01
    start_conversion_ratenumberOptionalExample: 1.0371537463463845
    tostringOptionalExample: 2024-01-31
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    post
    /eth/v0/rewards

    hashtag
    List account rewards

    post

    List rewards by account for a specific date

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Body
    accountsstring[]OptionalExample: ["bb3e6114-af15-43a6-9b36-a5ec011d9d95"]
    datestringOptionalExample: 2024-04-11
    unitstringOptionalExample: lseth
    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptionalExample: bb3e6114-af15-43a6-9b36-a5ec011d9d95
    datestringOptionalExample: 2024-04-11
    balance_lsethnumberOptionalExample: 0.3827486422527215
    rewards_ethnumberOptionalExample: 0.00003930554936445
    account_idstringOptionalExample: ab3e5114-af15-45b8-9c43-a5ec011d9d95
    addressstringOptionalExample: 0x30e2a735D692fC28CD31C28F1A8259b4790f9A23
    avg_srr_histnumberOptionalExample: 0.00534633387
    balance_lsethnumberOptionalExample: 0.3827486422527215
    burns_lsethnumberOptionalExample: 0.1
    conversion_ratenumberOptionalExample: 1.037253225665527
    dao_fees_ethnumberOptionalExample: 4.25550536674e-7
    datestringOptionalExample: 2024-04-11
    fees_ethnumberOptionalExample: 0.000006719219000121
    gross_fees_ethnumberOptionalExample: 0.000006264174837104
    gross_protocol_fee_ratenumberOptionalExample: 0.000006264174837104
    gross_rewards_ethnumberOptionalExample: 0.000006264174837104
    mints_lsethnumberOptionalExample: 0.48208860235174045
    operator_fees_ethnumberOptionalExample: 0.000006264174837104
    oracle_reportstringOptionalExample: 68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164
    org_idstringOptionalExample: org_aDL0aCAXyWYgHQ4W
    platform_fees_at_discount_rate_ethnumberOptionalExample: 0.000006264174837104
    platform_fees_ethnumberOptionalExample: 0.00000519619602676
    previous_conversion_ratenumberOptionalExample: 1.0371537463463845
    provider_fees_ethnumberOptionalExample: 1.56781776669e-7
    rebate_ethnumberOptionalExample: 0.000006264174837104
    rebate_lsethnumberOptionalExample: 0.000006264174837104
    rewards_ethnumberOptionalExample: 0.000038075574334017
    slashing_fees_ethnumberOptionalExample: 1.34384380002e-7
    target_fee_ratenumberOptionalExample: 0.08
    total_burns_lsethnumberOptionalExample: 0.109
    total_dao_fees_ethnumberOptionalExample: 4.39297316428e-7
    total_fees_ethnumberOptionalExample: 0.000006936273417258
    total_gross_fees_ethnumberOptionalExample: 0.000006264174837104
    total_gross_rewards_ethnumberOptionalExample: 0.000006264174837104
    total_mints_lsethnumberOptionalExample: 0.49174864225272147
    total_operator_fees_ethnumberOptionalExample: 0.000006264174837104
    total_platform_fees_at_discount_rate_ethnumberOptionalExample: 0.000006264174837104
    total_platform_fees_ethnumberOptionalExample: 0.000005364051442679
    total_provider_fees_ethnumberOptionalExample: 1.61846379739e-7
    total_rebate_ethnumberOptionalExample: 0.000006264174837104
    total_rebate_lsethnumberOptionalExample: 0.000006264174837104
    total_rewards_ethnumberOptionalExample: 0.00003930554936445
    total_slashing_fees_ethnumberOptionalExample: 1.38725468346e-7
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    post
    /eth/v0/rewards/accounts

    hashtag
    List wallet rewards

    post

    Get rewards for a list of wallets on a specific date

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Body
    addressesstring[]OptionalExample: ["0x5d811a9d059dDAB0C18B385ad3b752f734f011cB"]
    datestringOptionalExample: 2024-04-11
    unitstringOptionalExample: eth
    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptionalExample: ab3e5114-af15-45b8-9c43-a5ec011d9d95
    addressstringOptionalExample: 0x30e2a735D692fC28CD31C28F1A8259b4790f9A23
    avg_srr_histnumberOptionalExample: 0.00534633387
    balance_lsethnumberOptionalExample: 0.3827486422527215
    burns_lsethnumberOptionalExample: 0.1
    conversion_ratenumberOptionalExample: 1.037253225665527
    dao_fees_ethnumberOptionalExample: 4.25550536674e-7
    datestringOptionalExample: 2024-04-11
    fees_ethnumberOptionalExample: 0.000006719219000121
    gross_fees_ethnumberOptionalExample: 0.000006264174837104
    gross_protocol_fee_ratenumberOptionalExample: 0.000006264174837104
    gross_rewards_ethnumberOptionalExample: 0.000006264174837104
    mints_lsethnumberOptionalExample: 0.48208860235174045
    operator_fees_ethnumberOptionalExample: 0.000006264174837104
    oracle_reportstringOptionalExample: 68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164
    org_idstringOptionalExample: org_aDL0aCAXyWYgHQ4W
    platform_fees_at_discount_rate_ethnumberOptionalExample: 0.000006264174837104
    platform_fees_ethnumberOptionalExample: 0.00000519619602676
    previous_conversion_ratenumberOptionalExample: 1.0371537463463845
    provider_fees_ethnumberOptionalExample: 1.56781776669e-7
    rebate_ethnumberOptionalExample: 0.000006264174837104
    rebate_lsethnumberOptionalExample: 0.000006264174837104
    rewards_ethnumberOptionalExample: 0.000038075574334017
    slashing_fees_ethnumberOptionalExample: 1.34384380002e-7
    target_fee_ratenumberOptionalExample: 0.08
    total_burns_lsethnumberOptionalExample: 0.109
    total_dao_fees_ethnumberOptionalExample: 4.39297316428e-7
    total_fees_ethnumberOptionalExample: 0.000006936273417258
    total_gross_fees_ethnumberOptionalExample: 0.000006264174837104
    total_gross_rewards_ethnumberOptionalExample: 0.000006264174837104
    total_mints_lsethnumberOptionalExample: 0.49174864225272147
    total_operator_fees_ethnumberOptionalExample: 0.000006264174837104
    total_platform_fees_at_discount_rate_ethnumberOptionalExample: 0.000006264174837104
    total_platform_fees_ethnumberOptionalExample: 0.000005364051442679
    total_provider_fees_ethnumberOptionalExample: 1.61846379739e-7
    total_rebate_ethnumberOptionalExample: 0.000006264174837104
    total_rebate_lsethnumberOptionalExample: 0.000006264174837104
    total_rewards_ethnumberOptionalExample: 0.00003930554936445
    total_slashing_fees_ethnumberOptionalExample: 1.38725468346e-7
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    post
    /eth/v0/rewards/wallets

    hashtag
    List account rewards summary

    get

    Provides a summary of rewards with a breakdown of reward totals for each wallet within the account. NOTE: Daily breakdown for each wallet address within the account is NOT included in the response.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID

    Query parameters
    fromstringOptional

    Start date (default: 1 month ago)

    tostringOptional

    End date (default: current time)

    csvstringOptional

    Export to CSV

    unitstringOptional

    Currency unit

    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptionalExample: ab3e5114-af15-45b8-9c43-a5ec011d9d95
    end_conversion_ratenumberOptionalExample: 1.0454865181649966
    fromstringOptionalExample: 2024-04-01
    org_idstringOptionalExample: org_aDs4aCACyWYgMQ4A
    start_conversion_ratenumberOptionalExample: 1.006282340620787
    tostringOptionalExample: 2024-04-30
    account_idstringOptionalExample: ab3e5114-af15-45b8-9c43-a5ec011d9d95
    addressstringOptionalExample: 0xF523F31Acf07Ff41D2616f9c1b73E762Ba8E5660
    addressstringOptionalExample: 0xF523F31Acf07Ff41D2616f9c1b73E762Ba8E5660
    balance_lsethnumberOptionalExample: 0.00099376738985375
    burns_lsethnumberOptionalExample: 2.22405e-13
    conversion_ratenumberOptionalExample: 1.006282340620787
    dao_fees_ethnumberOptionalExample: 7.86854637e-10
    datestringOptionalExample: 2024-04-01
    fees_at_discount_rate_ethnumberOptionalExample: 4.80412e-13
    fees_ethnumberOptionalExample: 8.282680389e-9
    gross_fees_ethnumberOptionalExample: 8.2826803894e-8
    gross_protocol_fee_ratenumberOptionalExample: 0.000006264174837104
    gross_rewards_ethnumberOptionalExample: 0.000006264174837104
    mints_lsethnumberOptionalExample: 4.4554123505e-8
    operator_fees_ethnumberOptionalExample: 1.242402058e-9
    oracle_reportstringOptionalExample: 68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164
    platform_fees_at_discount_rate_ethnumberOptionalExample: 0.000005236375878362
    platform_fees_ethnumberOptionalExample: 5.715049468e-9
    previous_conversion_ratenumberOptionalExample: 1.0371537463463845
    provider_fees_ethnumberOptionalExample: 2.89893814e-10
    rebate_ethnumberOptionalExample: 0.000006264174837104
    rebate_lsethnumberOptionalExample: 0.000006264174837104
    rewards_ethnumberOptionalExample: 7.4544123505e-8
    slashing_fees_ethnumberOptionalExample: 2.48480412e-10
    target_fee_ratenumberOptionalExample: 0.000006264174837104
    end_conversion_ratenumberOptionalExample: 1.0454865181649966
    fromstringOptionalExample: 2024-04-01
    org_idstringOptionalExample: org_aDs4aCACyWYgMQ4A
    start_conversion_ratenumberOptionalExample: 1.006282340620787
    tostringOptionalExample: 2024-04-01
    total_burns_lsethnumberOptionalExample: 0
    total_dao_fees_ethnumberOptionalExample: 4.34597684399e-7
    total_fees_ethnumberOptionalExample: 0.000006787291484265
    total_gross_fees_ethnumberOptionalExample: 0.000006787291484265
    total_gross_rewards_ethnumberOptionalExample: 0.000045747124673728
    total_mints_lsethnumberOptionalExample: 0.00099376738985375
    total_operator_fees_ethnumberOptionalExample: 8.18961611118e-7
    total_platform_fees_at_discount_rate_ethnumberOptionalExample: 0.000005236375878362
    total_platform_fees_ethnumberOptionalExample: 0.000005236375878362
    total_provider_fees_ethnumberOptionalExample: 1.60114936353e-7
    total_rebate_ethnumberOptionalExample: 0
    total_rebate_lsethnumberOptionalExample: 0
    total_rewards_ethnumberOptionalExample: 0.000038959833189463
    total_slashing_fees_ethnumberOptionalExample: 1.37241374012e-7
    next_cursoranyOptional
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/rewards/accounts/{idOrKey}/summary

    hashtag
    List wallet rewards summary

    get

    List wallet rewards summary with daily reports for a specific time period

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrAddressstringRequired

    Wallet ID or address

    Query parameters
    fromstringOptional

    Start date (default: 1 month ago)

    tostringOptional

    End date (default: current time)

    csvstringOptional

    Export to CSV

    unitstringOptional

    Currency unit

    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptionalExample: ab3e5114-af15-45b8-9c43-a5ec011d9d95
    addressstringOptionalExample: 0xF523F31Acf07Ff41D2616f9c1b73E762Ba8E5660
    addressstringOptionalExample: 0xF523F31Acf07Ff41D2616f9c1b73E762Ba8E5660
    balance_lsethnumberOptionalExample: 0.00099376738985375
    burns_lsethnumberOptionalExample: 2.22405e-13
    conversion_ratenumberOptionalExample: 1.006282340620787
    dao_fees_ethnumberOptionalExample: 7.86854637e-10
    datestringOptionalExample: 2024-04-01
    fees_at_discount_rate_ethnumberOptionalExample: 4.80412e-13
    fees_ethnumberOptionalExample: 8.282680389e-9
    gross_fees_ethnumberOptionalExample: 8.2826803894e-8
    gross_protocol_fee_ratenumberOptionalExample: 0.000006264174837104
    gross_rewards_ethnumberOptionalExample: 0.000006264174837104
    mints_lsethnumberOptionalExample: 4.4554123505e-8
    operator_fees_ethnumberOptionalExample: 1.242402058e-9
    oracle_reportstringOptionalExample: 68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164
    platform_fees_at_discount_rate_ethnumberOptionalExample: 0.000005236375878362
    platform_fees_ethnumberOptionalExample: 5.715049468e-9
    previous_conversion_ratenumberOptionalExample: 1.0371537463463845
    provider_fees_ethnumberOptionalExample: 2.89893814e-10
    rebate_ethnumberOptionalExample: 0.000006264174837104
    rebate_lsethnumberOptionalExample: 0.000006264174837104
    rewards_ethnumberOptionalExample: 7.4544123505e-8
    slashing_fees_ethnumberOptionalExample: 2.48480412e-10
    target_fee_ratenumberOptionalExample: 0.000006264174837104
    end_conversion_ratenumberOptionalExample: 1.0454865181649966
    fromstringOptionalExample: 2024-04-01
    org_idstringOptionalExample: org_aDs4aCACyWYgMQ4A
    start_conversion_ratenumberOptionalExample: 1.006282340620787
    tostringOptionalExample: 2024-04-01
    total_burns_lsethnumberOptionalExample: 0
    total_dao_fees_ethnumberOptionalExample: 4.34597684399e-7
    total_fees_ethnumberOptionalExample: 0.000006787291484265
    total_gross_fees_ethnumberOptionalExample: 0.000006787291484265
    total_gross_rewards_ethnumberOptionalExample: 0.000045747124673728
    total_mints_lsethnumberOptionalExample: 0.00099376738985375
    total_operator_fees_ethnumberOptionalExample: 8.18961611118e-7
    total_platform_fees_at_discount_rate_ethnumberOptionalExample: 0.000005236375878362
    total_platform_fees_ethnumberOptionalExample: 0.000005236375878362
    total_provider_fees_ethnumberOptionalExample: 1.60114936353e-7
    total_rebate_ethnumberOptionalExample: 0
    total_rebate_lsethnumberOptionalExample: 0
    total_rewards_ethnumberOptionalExample: 0.000038959833189463
    total_slashing_fees_ethnumberOptionalExample: 1.37241374012e-7
    next_cursoranyOptional
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/rewards/wallets/{idOrAddress}/summary

    hashtag
    List latest high-level protocol info

    get

    List latest available high-level protocol

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    unitstringOptional

    Display LsETH values in units of wei or ether. If not present, LsETH is set by default.

    Responses
    chevron-right
    200

    OK

    application/json
    a_srr_7dnumberOptionalExample: 3.95
    conversion_ratenumberOptionalExample: 1.012345
    datestringOptionalExample: 2023-01-02T03:04:05Z
    gross_fee_lsethnumberOptionalExample: 0.1851
    gross_fee_ratenumberOptionalExample: 0.15
    oracle_reportstringOptionalExample: f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef
    protocol_service_fee_ratenumberOptionalExample: 0.11
    rewards_ethnumberOptionalExample: 1.234
    total_eth_stakednumberOptionalExample: 122007944.381
    total_lseth_supplynumberOptionalExample: 120520123.456789
    total_protocol_active_keys_countintegerOptionalExample: 76
    total_protocol_burns_lsethnumberOptionalExample: 32
    total_protocol_mints_lsethnumberOptionalExample: 32
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/protocol

    hashtag
    List high-level protocol info

    get

    List high-level protocol info for a given date

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    datestringRequired

    Date filter by year, month or day (eg. 2023, 2023-12, 2023-12-31). Note: times are UTC

    Query parameters
    unitstringOptional

    Display LsETH values in units of wei or ether. If not present, LsETH is set by default.

    page_sizeintegerOptional

    Number of results per page (1-1000, default 100)

    next_cursorstringOptional

    Cursor returned from previous page

    Responses
    chevron-right
    200

    OK

    application/json
    a_srr_7dnumberOptionalExample: 3.95
    conversion_ratenumberOptionalExample: 1.012345
    datestringOptionalExample: 2023-01-02T03:04:05Z
    gross_fee_lsethnumberOptionalExample: 0.1851
    gross_fee_ratenumberOptionalExample: 0.15
    oracle_reportstringOptionalExample: f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef
    protocol_service_fee_ratenumberOptionalExample: 0.11
    rewards_ethnumberOptionalExample: 1.234
    total_eth_stakednumberOptionalExample: 122007944.381
    total_lseth_supplynumberOptionalExample: 120520123.456789
    total_protocol_active_keys_countintegerOptionalExample: 76
    total_protocol_burns_lsethnumberOptionalExample: 32
    total_protocol_mints_lsethnumberOptionalExample: 32
    block_timestringOptional
    event_idinteger[]Optional
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/protocol/{date}

    hashtag
    List wallet rewards public summary

    get

    List rewards for a wallet with daily reports (public info) for a specific time period.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    addressstringRequired

    Wallet address

    Query parameters
    fromstringOptional

    Start date (default: 1 month ago)

    tostringOptional

    End date (default: current time)

    unitstringOptional

    Currency unit

    csvstringOptional

    Export to CSV

    page_sizeintegerOptional

    Page size (default: 100)

    next_cursorstringOptional

    Next cursor (default: empty)

    Responses
    chevron-right
    200

    OK

    application/json
    addressstringOptionalExample: 0x30e2a735D692fC28CD31C28F1A8259b4790f9A23
    addressstringOptionalExample: 0x30e2a735D692fC28CD31C28F1A8259b4790f9A23
    avg_srr_histnumberOptionalExample: 0.00534633387
    balance_lsethnumberOptionalExample: 0.3827486422527215
    burns_lsethnumberOptionalExample: 0.1
    conversion_ratenumberOptionalExample: 1.037253225665527
    datestringOptionalExample: 2024-04-11
    fees_ethnumberOptionalExample: 0.000006719219000121
    mints_lsethnumberOptionalExample: 0.48208860235174045
    oracle_reportstringOptionalExample: 68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164
    previous_conversion_ratenumberOptionalExample: 1.0371537463463845
    rewards_ethnumberOptionalExample: 0.000038075574334017
    total_burns_lsethnumberOptionalExample: 0.109
    total_fees_ethnumberOptionalExample: 0.000006936273417258
    total_mints_lsethnumberOptionalExample: 0.49174864225272147
    total_rewards_ethnumberOptionalExample: 0.00003930554936445
    end_conversion_ratenumberOptionalExample: 1.0454865181649966
    fromstringOptionalExample: 2024-04-01
    start_conversion_ratenumberOptionalExample: 1.006282340620787
    tostringOptionalExample: 2024-04-30
    total_burns_lsethnumberOptionalExample: 0.109
    total_fees_ethnumberOptionalExample: 0.000006936273417258
    total_mints_lsethnumberOptionalExample: 0.49174864225272147
    total_rewards_ethnumberOptionalExample: 0.00003930554936445
    next_cursoranyOptional
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/wallet/{address}/rewards

    hashtag
    Get wallet status

    get

    Provides status information of the wallet (ex. ALLOWLISTED, SUBMITTED, etc...)

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    addressstringRequired

    Wallet address

    Responses
    chevron-right
    200

    OK

    application/json
    allowlistedbooleanOptionalExample: true
    statusstringOptionalExample: ALLOWLISTED| PAUSED | DENIED
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/wallet/{address}/status

    hashtag
    List wallet transactions

    get

    List wallet transactions for a given time period and wallet address

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    addressstringRequired

    Wallet address

    Query parameters
    fromstringOptional

    Start date (default: 1 year ago)

    tostringOptional

    End date (default: current time)

    csvstringOptional

    Output as CSV

    page_sizestringOptional

    Page size (default: 100)

    next_cursorstringOptional

    Next cursor

    Responses
    chevron-right
    200

    OK

    application/json
    amount_ethnumberOptionalExample: 10
    amount_lsethnumberOptionalExample: 9.5
    conversion_ratenumberOptionalExample: 0.96
    datestringOptionalExample: 2024-06-21
    finalizedbooleanOptionalExample: true
    transaction_hashstringOptionalExample: 0x5E9E16C6DEB4022399E4FCD387BCB59AC5855762
    transaction_typestringOptionalExample: Deposit
    amountnumberOptional
    blockNumberintegerOptional
    datestringOptional
    eventIDinteger[]Optional
    finalizedbooleanOptional
    newTotalEthSupplynumberOptional
    newTotalSupplynumberOptional
    transactionHashinteger[]Optional
    transactionTypestring · enumOptionalPossible values:
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/wallet/{address}/transactions

    hashtag
    List the redeem requests

    get

    List the redeem requests for one or multiple owners (addresses)

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    ownerstringRequired

    The address or addresses to query, separated by commas

    Responses
    chevron-right
    200

    OK

    application/json
    claimable_amount_lsethnumberOptional

    The possible amount available to claim in LsETH

    Example: 16.25
    claimed_amount_ethnumberOptional

    The amount already claimed in ETH

    Example: 16.5
    claimed_amount_lsethnumberOptional

    The amount already claimed in LsETH

    Example: 16.25
    heightnumberOptional

    The height is the cumulative sum of all the sizes of preceding redeem requests

    Example: 1024.75
    idintegerOptional

    The ID of the redeem request

    Example: 1048576
    max_redeemable_amount_ethnumberOptional

    The maximum amount of ETH redeemable by this request

    Example: 33
    ownerstringOptional

    The owner of the redeem request

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    requested_atintegerOptional

    Block time

    status_claimstring · enumOptionalPossible values:
    status_satisfactionstring · enumOptionalPossible values:
    timestampstringOptional

    Timestamp

    Example: 2024-01-25 13:07:50.335845 +0000 UTC
    total_amount_lsethnumberOptional

    The amount of the redeem request in LsETH

    Example: 32.5
    withdrawal_event_idintegerOptional

    The withdrawal event ID needed to claim the redeem (or -1 when no withdrawals available)

    Example: 42
    chevron-right
    400

    Bad Request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal Error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/redeems

    hashtag
    Returns validator exit queue info

    get

    Returns validator exit queue info, including time estimates.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    chevron-right
    200

    OK

    application/json
    exit_time_hoursnumberOptional
    mandatory_exit_delay_hoursnumberOptional
    sweep_time_hoursnumberOptional
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /eth/v0/validators/queue

    hashtag
    Create a platform account

    post

    Create a platform account with an ACTIVE status.

    WARNING Integrators should make sure that the depositor has gone through an effective KYC/KYB process and is deemed within appetite to stake their ETH through the Liquid Collective.

    When creating the depositor an integrator should supply a non-empty, unique identifying key (it can typically be an internal user identifier).

    As long as a depositor remains in ACTIVE status, it is possible to attach wallets to it that will automatically be submitted to the protocol on-chain allowlist.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Body
    keystringOptional

    Unique identifier of the account (supplied by the client)

    Example: depositor_example
    Responses
    chevron-right
    201

    Account has been created

    application/json
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    post
    /v0/platform/accounts

    hashtag
    List platform accounts

    get

    List platform accounts

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Responses
    chevron-right
    200

    OK

    application/json
    created_atstringOptional

    Time the account was created

    Example: 2024-01-24T13:07:50.335845Z
    idstringOptional

    Identifier of the account (generated server side)

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    keystringOptional

    Unique key identifying the account (supplied by the client when creating the account)

    Example: depositor_example
    org_idstringOptional

    Organization identifier the account belongs to

    Example: org_28CLGCvsdG7TlOHf
    statusstringOptional

    Status of the account (managed by the integrator)

    Example: ACTIVE | PAUSED | REMOVED | DENIED
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /v0/platform/accounts

    hashtag
    Get platform account

    get

    Get platform account

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the platform account

    Responses
    chevron-right
    200

    OK

    application/json
    created_atstringOptional

    Time the account was created

    Example: 2024-01-24T13:07:50.335845Z
    idstringOptional

    Identifier of the account (generated server side)

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    keystringOptional

    Unique key identifying the account (supplied by the client when creating the account)

    Example: depositor_example
    org_idstringOptional

    Organization identifier the account belongs to

    Example: org_28CLGCvsdG7TlOHf
    statusstringOptional

    Status of the account (managed by the integrator)

    Example: ACTIVE | PAUSED | REMOVED | DENIED
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /v0/platform/accounts/{idOrKey}

    hashtag
    Remove a platform account

    patch

    Set account's status to REMOVED.

    Integrators can call this method for their inactive users to be removed from the liquid staking protocol(s) allowlist.

    Once account's status has been set to REMOVED:

    • It is no longer possible to attach new wallets to the account
    • Alluvial will remove any previously attached wallets from protocol's on-chain allowlist

    Removing a wallet from the protocol allowlist results in disabling the ability to stake or redeem ETH.

    Note that removing a wallet from the allowlist is an asynchronous process that can take some time.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the account to remove

    Responses
    chevron-right
    200

    OK

    application/json
    created_atstringOptional

    Time the account was created

    Example: 2024-01-24T13:07:50.335845Z
    idstringOptional

    Identifier of the account (generated server side)

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    keystringOptional

    Unique key identifying the account (supplied by the client when creating the account)

    Example: depositor_example
    org_idstringOptional

    Organization identifier the account belongs to

    Example: org_28CLGCvsdG7TlOHf
    statusstringOptional

    Status of the account (managed by the integrator)

    Example: REMOVED
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    patch
    /v0/platform/accounts/{idOrKey}/remove

    hashtag
    Pause a platform account

    patch

    Set account's status to PAUSED.

    Once an account's status has been set to PAUSED:

    • If the account has allowlisted wallet they will be unable to stake nor redeem.
    • Wallets will be able to transfer LsETH normally.
    • Accounts won't be able to add new wallets.
    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the account to remove

    Responses
    chevron-right
    200

    OK

    application/json
    created_atstringOptional

    Time the account was created

    Example: 2024-01-24T13:07:50.335845Z
    idstringOptional

    Identifier of the account (generated server side)

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    keystringOptional

    Unique key identifying the account (supplied by the client when creating the account)

    Example: depositor_example
    org_idstringOptional

    Organization identifier the account belongs to

    Example: org_28CLGCvsdG7TlOHf
    statusstringOptional

    Status of the account (managed by the integrator)

    Example: PAUSED
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    patch
    /v0/platform/accounts/{idOrKey}/pause

    hashtag
    Reactivate a platform account

    patch

    Set a PAUSED account's status to ACTIVE.

    This will enable the account to stake and redeem again (if the account has allowlisted wallets), and enable you to add more wallets to the account.

    This is only possible for PAUSED accounts - DENIED or REMOVED accounts cannot be reactivated.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the account to reactivate

    Responses
    chevron-right
    200

    OK

    application/json
    created_atstringOptional

    Time the account was created

    Example: 2024-01-24T13:07:50.335845Z
    idstringOptional

    Identifier of the account (generated server side)

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    keystringOptional

    Unique key identifying the account (supplied by the client when creating the account)

    Example: depositor_example
    org_idstringOptional

    Organization identifier the account belongs to

    Example: org_28CLGCvsdG7TlOHf
    statusstringOptional

    Status of the account (managed by the integrator)

    Example: ACTIVE
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    patch
    /v0/platform/accounts/{idOrKey}/reactivate

    hashtag
    Get platform wallet

    get

    Get platform wallet

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrAddressstringRequired

    Wallet ID or Address of the wallet (address in hex format prefixed with 0x)

    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /v0/platform/wallets/{idOrAddress}

    hashtag
    List platform wallets

    get

    List platform wallets

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Query parameters
    allowlistbooleanOptional

    Enable to only return allowlisted wallets

    on_platformbooleanOptional

    Enable to only return wallets on_platform

    offsetintegerOptional

    Offset for pagination

    limitintegerOptional

    Limit for pagination

    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /v0/platform/wallets

    hashtag
    Add wallet on platform

    post

    Create a wallet attached to an account

    If the account is in ACTIVE status and if the wallet's has the allowlisted property set to true Alluvial will add the wallet address to the protocol on-chain allowlist.

    Adding a wallet to the protocol allowlist results in enabling the wallet to proceed to deposit and redeem ETH on the protocol.

    Note that submitting the wallet to the on-chain allowlist is an asynchronous process that can take some time. The onboarding allows to check the submission status by getting the wallet.

    Important Notes:

    • Alluvial will never ask for private keys of the wallets**
    • You will only be able to create allowlisted wallets if your organization is configured to do so.
    • If your organization is able to allowlist wallets, it method will do so by default.
    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the account to add wallets to

    Body
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Opt out of wallet being added to the OnPlatform list

    Example: true
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    post
    /v0/platform/accounts/{idOrKey}/wallets

    hashtag
    List all the platform account wallets

    get

    List all wallets for a platform account

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the account

    Query parameters
    allowlistbooleanOptional

    Enable to only return allowlisted wallets

    on_platformbooleanOptional

    Enable to only return wallets on_platform

    offsetintegerOptional

    Offset for pagination

    limitintegerOptional

    Limit for pagination

    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    get
    /v0/platform/accounts/{idOrKey}/wallets

    hashtag
    Remove wallet on platform

    patch

    Remove wallet from a given wallet from either the on_platform, the allowlisted, or both.

    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Account ID or Key of the account to remove wallet from

    idOrAddressstringRequired

    Wallet ID or Address of the wallet to be removed

    Query parameters
    allowlistbooleanOptional

    Enable to remove wallet from the allowlist

    on_platformbooleanOptional

    Enable to remove wallet on_platform

    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    patch
    /v0/platform/accounts/{idOrKey}/wallets/{idOrAddress}/remove

    hashtag
    Pause wallet

    patch

    Set wallet's status to PAUSED.

    Once a wallet's status has been set to PAUSED:

    • If the wallet was allowlisted, it will be unable to stake nor redeem.
    • Wallet will be able to transfer LsETH normally.
    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Depositor ID or Key of the depositor to pause wallet from

    idOrAddressstringRequired

    Wallet ID or Address of the wallet to be paused

    Query parameters
    allowlistbooleanOptional

    Enable to pause wallet from the allowlist

    on_platformbooleanOptional

    Enable to pause wallet on_platform

    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    409

    Conflict

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    patch
    /v0/platform/accounts/{idOrKey}/wallets/{idOrAddress}/pause

    hashtag
    Reactivate wallet

    patch

    Set a PAUSED wallet's status to ACTIVE.

    This will enable the wallet to stake and redeem again.

    This action can only be performed under these conditions:

    • The wallet has PAUSED status - DENIED or REMOVED wallets cannot be reactivated.
    • A wallet can only be reactivated if the associated account has an ACTIVE status.
    Authorizations
    AuthorizationstringRequired
    Bearer authentication header of the form Bearer <token>.
    Path parameters
    idOrKeystringRequired

    Depositor ID or Key of the depositor to reactivate wallet from

    idOrAddressstringRequired

    Wallet ID or Address of the wallet to be reactivated

    Query parameters
    allowlistbooleanOptional

    Enable to reactivate wallet from the allowlist

    on_platformbooleanOptional

    Enable to reactivate wallet on_platform

    Responses
    chevron-right
    200

    OK

    application/json
    account_idstringOptional

    The account ID of the wallet

    Example: ac0d0cdf-92bc-4cbe-a180-a2efb2387d16
    addressstringOptional

    Wallet address in hexadecimal format with 0x prefix

    Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    allowlistedbooleanOptional

    Whether the wallet is allowlisted

    Example: true
    created_atstringOptional

    Time the wallet was created

    Example: 2024-01-25T13:07:50.335845Z
    idstringOptional

    Our UUID for this wallet

    Example: dd8eefc8-0cc4-4a27-adc0-e1ebebed598d
    on_platformbooleanOptional

    Whether the wallet is on platform

    Example: true
    originator_org_idstringOptional

    Originator of the wallet, value is an organization ID

    Example: org_ABCDEF
    statusstring · enumOptionalPossible values:
    typestringOptional

    The type of wallet - chain or protocol it exists on

    Example: ETH
    chevron-right
    400

    Bad request

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    401

    Unauthorized

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    403

    Forbidden

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    404

    Not found

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    409

    Conflict

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    chevron-right
    500

    Internal error

    application/json
    messagestringOptionalExample: error message
    statusstringOptionalExample: IR001
    patch
    /v0/platform/accounts/{idOrKey}/wallets/{idOrAddress}/reactivate

    OK

    {
      "account_id": "36cc991e-d4r5-422c-8248-ac356e800fc1",
      "created_at": "2023-12-31T23:59:59Z",
      "removed_at": "2023-12-31T23:59:59Z",
      "target_fee_rate": 0.05
    }
    {
      "account_id": "36cc991e-d4r5-422c-8248-ac356e800fc1",
      "created_at": "2023-12-31T23:59:59Z",
      "removed_at": "2023-12-31T23:59:59Z",
      "target_fee_rate": 0.05
    }
    POST /v0/platform/accounts/{idOrKey}/discount_rate HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 24
    
    {
      "target_fee_rate": 0.05
    }
    GET /v0/platform/accounts/{idOrKey}/discount_rate HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "account_id": "36cc991e-d4r5-422c-8248-ac356e800fc1",
      "created_at": "2023-12-31T23:59:59Z",
      "removed_at": "2023-12-31T23:59:59Z",
      "target_fee_rate": 0.05
    }
    PATCH /v0/platform/accounts/{idOrKey}/discount_rate HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 24
    
    {
      "target_fee_rate": 0.05
    }
    [
      {
        "address": "0x123456789985ca04a69c35978c3a3e778d6ef172",
        "balance": "4200000000000000000000",
        "block_number": 15034284
      }
    ]
    GET /eth/v0/status HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "active_validator_count": 58,
      "active_validators_eth_balance": "128000000000000000000",
      "block_number": 15034284,
      "collected_rewards": "3200000000000000000000",
      "contract_eth_balance": "5000000000000000000",
      "conversion_rate": 1,
      "deposit_count": 2,
      "exited_validators_eth_balance": "128000000000000000000",
      "exiting_validators_eth_balance": "128000000000000000000",
      "funded_validator_count": 102,
      "funded_valitor_count": 102,
      "pending_validator_count": 2,
      "pending_validators_eth_balance": "64000000000000000000",
      "rebalance_deposit_to_redeem_mode": true,
      "skimmed_validators_eth_balance": "128000000000000000000",
      "slashing_containment_mode": false,
      "stopped_validator_count": 42,
      "total_eth_balance": "3200000000000000000000",
      "total_eth_deposited": "3200000000000000000000",
      "total_supply": "3200000000000000000000",
      "total_validator_count": 100
    }
    GET /eth/v0/status/{block_number} HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "active_validator_count": 58,
      "active_validators_eth_balance": "128000000000000000000",
      "block_number": 15034284,
      "collected_rewards": "3200000000000000000000",
      "contract_eth_balance": "5000000000000000000",
      "conversion_rate": 1,
      "deposit_count": 2,
      "exited_validators_eth_balance": "128000000000000000000",
      "exiting_validators_eth_balance": "128000000000000000000",
      "funded_validator_count": 102,
      "funded_valitor_count": 102,
      "pending_validator_count": 2,
      "pending_validators_eth_balance": "64000000000000000000",
      "rebalance_deposit_to_redeem_mode": true,
      "skimmed_validators_eth_balance": "128000000000000000000",
      "slashing_containment_mode": false,
      "stopped_validator_count": 42,
      "total_eth_balance": "3200000000000000000000",
      "total_eth_deposited": "3200000000000000000000",
      "total_supply": "3200000000000000000000",
      "total_validator_count": 100
    }
    GET /eth/v0/balances HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    [
      {
        "address": "0x123456789985ca04a69c35978c3a3e778d6ef172",
        "balance": "4200000000000000000000",
        "block_number": 15034284
      }
    ]
    GET /eth/v0/balances/{address} HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "address": "0x123456789985ca04a69c35978c3a3e778d6ef172",
      "balance": "4200000000000000000000",
      "block_number": 15034284
    }
    GET /eth/v0/balances/{address}/history HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    GET /eth/v0/contracts HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "allowlister": [
        1
      ],
      "deployment_block": 1,
      "el_fee_recipient": [
        1
      ],
      "operators_registry": [
        1
      ],
      "oracle": [
        1
      ],
      "redeem_manager": [
        1
      ],
      "river": [
        1
      ],
      "withdraw": [
        1
      ]
    }
    GET /eth/v0/redeems?owner=text HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    [
      {
        "claimable_amount_lseth": 16.25,
        "claimed_amount_eth": 16.5,
        "claimed_amount_lseth": 16.25,
        "height": 1024.75,
        "id": 1048576,
        "max_redeemable_amount_eth": 33,
        "owner": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
        "requested_at": 1,
        "status_claim": "NOT_CLAIMED",
        "status_satisfaction": "NOT_CLAIMED",
        "timestamp": "2024-01-25 13:07:50.335845 +0000 UTC",
        "total_amount_lseth": 32.5,
        "withdrawal_event_id": 42
      }
    ]
    GET /eth/v0/redeems/{idx} HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "claimable_amount_lseth": 16.25,
      "claimed_amount_eth": 16.5,
      "claimed_amount_lseth": 16.25,
      "height": 1024.75,
      "id": 1048576,
      "max_redeemable_amount_eth": 33,
      "owner": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "requested_at": 1,
      "status_claim": "NOT_CLAIMED",
      "status_satisfaction": "NOT_CLAIMED",
      "timestamp": "2024-01-25 13:07:50.335845 +0000 UTC",
      "total_amount_lseth": 32.5,
      "withdrawal_event_id": 42
    }
    GET /eth/v0/redeems/{idx}/projection HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "projected_redeemable_at": "text"
    }
    GET /eth/v0/redeems_info HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "total_amount_redeem_queue_lseth": 1,
      "total_amount_withdrawal_stack_lseth": 1
    }
    GET /eth/v0/redeems_info/projection HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "projected_fulfilled_at": "text"
    }
    GET /eth/v0/validators/queue HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "exit_time_hours": 1,
      "mandatory_exit_delay_hours": 1,
      "sweep_time_hours": 1
    }
    {
      "data": {
        "address": "0x30e2a735D692fC28CD31C28F1A8259b4790f9A23",
        "daily_reports": [
          {
            "address": "0x30e2a735D692fC28CD31C28F1A8259b4790f9A23",
            "avg_srr_hist": 0.00534633387,
            "balance_lseth": 0.3827486422527215,
            "burns_lseth": 0.1,
            "conversion_rate": 1.037253225665527,
            "date": "2024-04-11",
            "fees_eth": 0.000006719219000121,
            "mints_lseth": 0.48208860235174045,
            "oracle_report": "68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164",
            "previous_conversion_rate": 1.0371537463463845,
            "rewards_eth": 0.000038075574334017,
            "total_burns_lseth": 0.109,
            "total_fees_eth": 0.000006936273417258,
            "total_mints_lseth": 0.49174864225272147,
            "total_rewards_eth": 0.00003930554936445
          }
        ],
        "end_conversion_rate": 1.0454865181649966,
        "from": "2024-04-01",
        "start_conversion_rate": 1.006282340620787,
        "to": "2024-04-30",
        "total_burns_lseth": 0.109,
        "total_fees_eth": 0.000006936273417258,
        "total_mints_lseth": 0.49174864225272147,
        "total_rewards_eth": 0.00003930554936445
      },
      "metadata": {
        "next_cursor": null
      }
    }
    GET /eth/v0/protocol HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "a_srr_7d": 3.95,
      "conversion_rate": 1.012345,
      "date": "2023-01-02T03:04:05Z",
      "gross_fee_lseth": 0.1851,
      "gross_fee_rate": 0.15,
      "oracle_report": "f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef",
      "protocol_service_fee_rate": 0.11,
      "rewards_eth": 1.234,
      "total_eth_staked": 122007944.381,
      "total_lseth_supply": 120520123.456789,
      "total_protocol_active_keys_count": 76,
      "total_protocol_burns_lseth": 32,
      "total_protocol_mints_lseth": 32
    }
    GET /eth/v0/protocol/{date} HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "data": [
        {
          "a_srr_7d": 3.95,
          "conversion_rate": 1.012345,
          "date": "2023-01-02T03:04:05Z",
          "gross_fee_lseth": 0.1851,
          "gross_fee_rate": 0.15,
          "oracle_report": "f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef",
          "protocol_service_fee_rate": 0.11,
          "rewards_eth": 1.234,
          "total_eth_staked": 122007944.381,
          "total_lseth_supply": 120520123.456789,
          "total_protocol_active_keys_count": 76,
          "total_protocol_burns_lseth": 32,
          "total_protocol_mints_lseth": 32
        }
      ],
      "metadata": {
        "next_cursor": {
          "block_time": "text",
          "event_id": [
            1
          ]
        }
      }
    }
    GET /eth/v0/wallet/{address}/rewards HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    GET /eth/v0/wallet/{address}/status HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "allowlisted": true,
      "status": "ALLOWLISTED| PAUSED | DENIED"
    }
    GET /eth/v0/wallet/{address}/transactions HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "data": [
        {
          "amount_eth": 10,
          "amount_lseth": 9.5,
          "conversion_rate": 0.96,
          "date": "2024-06-21",
          "finalized": true,
          "transaction_hash": "0x5E9E16C6DEB4022399E4FCD387BCB59AC5855762",
          "transaction_type": "Deposit"
        }
      ],
      "metadata": {
        "next_cursor": {
          "amount": 1,
          "blockNumber": 1,
          "date": "text",
          "eventID": [
            1
          ],
          "finalized": true,
          "newTotalEthSupply": 1,
          "newTotalSupply": 1,
          "transactionHash": [
            1
          ],
          "transactionType": "Deposit"
        }
      }
    }
    GET /eth/v0/redeems?owner=text HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    [
      {
        "claimable_amount_lseth": 16.25,
        "claimed_amount_eth": 16.5,
        "claimed_amount_lseth": 16.25,
        "height": 1024.75,
        "id": 1048576,
        "max_redeemable_amount_eth": 33,
        "owner": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
        "requested_at": 1,
        "status_claim": "NOT_CLAIMED",
        "status_satisfaction": "NOT_CLAIMED",
        "timestamp": "2024-01-25 13:07:50.335845 +0000 UTC",
        "total_amount_lseth": 32.5,
        "withdrawal_event_id": 42
      }
    ]
    GET /eth/v0/validators/queue HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "exit_time_hours": 1,
      "mandatory_exit_delay_hours": 1,
      "sweep_time_hours": 1
    }
    {
      "data": {
        "account_id": "ab3e5114-af15-45b8-9c43-a5ec011d9d95",
        "end_conversion_rate": 1.0454865181649966,
        "from": "2024-04-01",
        "org_id": "org_aDs4aCACyWYgMQ4A",
        "start_conversion_rate": 1.006282340620787,
        "to": "2024-04-30",
        "wallets": [
          {
            "account_id": "ab3e5114-af15-45b8-9c43-a5ec011d9d95",
            "address": "0xF523F31Acf07Ff41D2616f9c1b73E762Ba8E5660",
            "daily_reports": [
              {
                "address": "0xF523F31Acf07Ff41D2616f9c1b73E762Ba8E5660",
                "balance_lseth": 0.00099376738985375,
                "burns_lseth": 2.22405e-13,
                "conversion_rate": 1.006282340620787,
                "dao_fees_eth": 7.86854637e-10,
                "date": "2024-04-01",
                "fees_at_discount_rate_eth": 4.80412e-13,
                "fees_eth": 8.282680389e-9,
                "gross_fees_eth": 8.2826803894e-8,
                "gross_protocol_fee_rate": 0.000006264174837104,
                "gross_rewards_eth": 0.000006264174837104,
                "mints_lseth": 4.4554123505e-8,
                "operator_fees_eth": 1.242402058e-9,
                "oracle_report": "68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164",
                "platform_fees_at_discount_rate_eth": 0.000005236375878362,
                "platform_fees_eth": 5.715049468e-9,
                "previous_conversion_rate": 1.0371537463463845,
                "provider_fees_eth": 2.89893814e-10,
                "rebate_eth": 0.000006264174837104,
                "rebate_lseth": 0.000006264174837104,
                "rewards_eth": 7.4544123505e-8,
                "slashing_fees_eth": 2.48480412e-10,
                "target_fee_rate": 0.000006264174837104
              }
            ],
            "end_conversion_rate": 1.0454865181649966,
            "from": "2024-04-01",
            "org_id": "org_aDs4aCACyWYgMQ4A",
            "start_conversion_rate": 1.006282340620787,
            "to": "2024-04-01",
            "total_burns_lseth": 0,
            "total_dao_fees_eth": 4.34597684399e-7,
            "total_fees_eth": 0.000006787291484265,
            "total_gross_fees_eth": 0.000006787291484265,
            "total_gross_rewards_eth": 0.000045747124673728,
            "total_mints_lseth": 0.00099376738985375,
            "total_operator_fees_eth": 8.18961611118e-7,
            "total_platform_fees_at_discount_rate_eth": 0.000005236375878362,
            "total_platform_fees_eth": 0.000005236375878362,
            "total_provider_fees_eth": 1.60114936353e-7,
            "total_rebate_eth": 0,
            "total_rebate_lseth": 0,
            "total_rewards_eth": 0.000038959833189463,
            "total_slashing_fees_eth": 1.37241374012e-7
          }
        ]
      },
      "metadata": {
        "next_cursor": null
      }
    }
    GET /eth/v0/protocol HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "a_srr_7d": 3.95,
      "conversion_rate": 1.012345,
      "date": "2023-01-02T03:04:05Z",
      "gross_fee_lseth": 0.1851,
      "gross_fee_rate": 0.15,
      "oracle_report": "f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef",
      "protocol_service_fee_rate": 0.11,
      "rewards_eth": 1.234,
      "total_eth_staked": 122007944.381,
      "total_lseth_supply": 120520123.456789,
      "total_protocol_active_keys_count": 76,
      "total_protocol_burns_lseth": 32,
      "total_protocol_mints_lseth": 32
    }
    GET /eth/v0/protocol/{date} HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    GET /eth/v0/wallet/{address}/transactions HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    GET /eth/v0/platforms/{date} HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    GET /eth/v0/operators/{date} HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    POST /eth/v0/rewards HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 74
    
    [
      {
        "balance": "0.382748642252721461",
        "from": "2024-01-01",
        "to": "2024-01-31"
      }
    ]
    {
      "accrued_rewards": 0.00003930554936445,
      "lots": [
        {
          "accrued_rewards": 0.000038075574334017,
          "balance": 0.3827486422527215,
          "end_conversion_rate": 1.037253225665527,
          "from": "2024-01-01",
          "start_conversion_rate": 1.0371537463463845,
          "to": "2024-01-31"
        }
      ]
    }
    POST /eth/v0/rewards/accounts HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 88
    
    {
      "accounts": [
        "bb3e6114-af15-43a6-9b36-a5ec011d9d95"
      ],
      "date": "2024-04-11",
      "unit": "lseth"
    }
    [
      {
        "account_id": "bb3e6114-af15-43a6-9b36-a5ec011d9d95",
        "date": "2024-04-11",
        "totals": {
          "balance_lseth": 0.3827486422527215,
          "rewards_eth": 0.00003930554936445
        },
        "wallets": [
          {
            "account_id": "ab3e5114-af15-45b8-9c43-a5ec011d9d95",
            "address": "0x30e2a735D692fC28CD31C28F1A8259b4790f9A23",
            "avg_srr_hist": 0.00534633387,
            "balance_lseth": 0.3827486422527215,
            "burns_lseth": 0.1,
            "conversion_rate": 1.037253225665527,
            "dao_fees_eth": 4.25550536674e-7,
            "date": "2024-04-11",
            "fees_eth": 0.000006719219000121,
            "gross_fees_eth": 0.000006264174837104,
            "gross_protocol_fee_rate": 0.000006264174837104,
            "gross_rewards_eth": 0.000006264174837104,
            "mints_lseth": 0.48208860235174045,
            "operator_fees_eth": 0.000006264174837104,
            "oracle_report": "68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164",
            "org_id": "org_aDL0aCAXyWYgHQ4W",
            "platform_fees_at_discount_rate_eth": 0.000006264174837104,
            "platform_fees_eth": 0.00000519619602676,
            "previous_conversion_rate": 1.0371537463463845,
            "provider_fees_eth": 1.56781776669e-7,
            "rebate_eth": 0.000006264174837104,
            "rebate_lseth": 0.000006264174837104,
            "rewards_eth": 0.000038075574334017,
            "slashing_fees_eth": 1.34384380002e-7,
            "target_fee_rate": 0.08,
            "total_burns_lseth": 0.109,
            "total_dao_fees_eth": 4.39297316428e-7,
            "total_fees_eth": 0.000006936273417258,
            "total_gross_fees_eth": 0.000006264174837104,
            "total_gross_rewards_eth": 0.000006264174837104,
            "total_mints_lseth": 0.49174864225272147,
            "total_operator_fees_eth": 0.000006264174837104,
            "total_platform_fees_at_discount_rate_eth": 0.000006264174837104,
            "total_platform_fees_eth": 0.000005364051442679,
            "total_provider_fees_eth": 1.61846379739e-7,
            "total_rebate_eth": 0.000006264174837104,
            "total_rebate_lseth": 0.000006264174837104,
            "total_rewards_eth": 0.00003930554936445,
            "total_slashing_fees_eth": 1.38725468346e-7
          }
        ]
      }
    ]
    POST /eth/v0/rewards/wallets HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 93
    
    {
      "addresses": [
        "0x5d811a9d059dDAB0C18B385ad3b752f734f011cB"
      ],
      "date": "2024-04-11",
      "unit": "eth"
    }
    [
      {
        "account_id": "ab3e5114-af15-45b8-9c43-a5ec011d9d95",
        "address": "0x30e2a735D692fC28CD31C28F1A8259b4790f9A23",
        "avg_srr_hist": 0.00534633387,
        "balance_lseth": 0.3827486422527215,
        "burns_lseth": 0.1,
        "conversion_rate": 1.037253225665527,
        "dao_fees_eth": 4.25550536674e-7,
        "date": "2024-04-11",
        "fees_eth": 0.000006719219000121,
        "gross_fees_eth": 0.000006264174837104,
        "gross_protocol_fee_rate": 0.000006264174837104,
        "gross_rewards_eth": 0.000006264174837104,
        "mints_lseth": 0.48208860235174045,
        "operator_fees_eth": 0.000006264174837104,
        "oracle_report": "68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164",
        "org_id": "org_aDL0aCAXyWYgHQ4W",
        "platform_fees_at_discount_rate_eth": 0.000006264174837104,
        "platform_fees_eth": 0.00000519619602676,
        "previous_conversion_rate": 1.0371537463463845,
        "provider_fees_eth": 1.56781776669e-7,
        "rebate_eth": 0.000006264174837104,
        "rebate_lseth": 0.000006264174837104,
        "rewards_eth": 0.000038075574334017,
        "slashing_fees_eth": 1.34384380002e-7,
        "target_fee_rate": 0.08,
        "total_burns_lseth": 0.109,
        "total_dao_fees_eth": 4.39297316428e-7,
        "total_fees_eth": 0.000006936273417258,
        "total_gross_fees_eth": 0.000006264174837104,
        "total_gross_rewards_eth": 0.000006264174837104,
        "total_mints_lseth": 0.49174864225272147,
        "total_operator_fees_eth": 0.000006264174837104,
        "total_platform_fees_at_discount_rate_eth": 0.000006264174837104,
        "total_platform_fees_eth": 0.000005364051442679,
        "total_provider_fees_eth": 1.61846379739e-7,
        "total_rebate_eth": 0.000006264174837104,
        "total_rebate_lseth": 0.000006264174837104,
        "total_rewards_eth": 0.00003930554936445,
        "total_slashing_fees_eth": 1.38725468346e-7
      }
    ]
    GET /eth/v0/rewards/accounts/{idOrKey}/summary HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    GET /eth/v0/rewards/wallets/{idOrAddress}/summary HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "data": [
        {
          "a_srr_7d": 3.95,
          "conversion_rate": 1.012345,
          "date": "2023-01-02T03:04:05Z",
          "gross_fee_lseth": 0.1851,
          "gross_fee_rate": 0.15,
          "oracle_report": "f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef",
          "protocol_service_fee_rate": 0.11,
          "rewards_eth": 1.234,
          "total_eth_staked": 122007944.381,
          "total_lseth_supply": 120520123.456789,
          "total_protocol_active_keys_count": 76,
          "total_protocol_burns_lseth": 32,
          "total_protocol_mints_lseth": 32
        }
      ],
      "metadata": {
        "next_cursor": {
          "block_time": "text",
          "event_id": [
            1
          ]
        }
      }
    }
    {
      "data": [
        {
          "amount_eth": 10,
          "amount_lseth": 9.5,
          "conversion_rate": 0.96,
          "date": "2024-06-21",
          "finalized": true,
          "transaction_hash": "0x5E9E16C6DEB4022399E4FCD387BCB59AC5855762",
          "transaction_type": "Deposit"
        }
      ],
      "metadata": {
        "next_cursor": {
          "amount": 1,
          "blockNumber": 1,
          "date": "text",
          "eventID": [
            1
          ],
          "finalized": true,
          "newTotalEthSupply": 1,
          "newTotalSupply": 1,
          "transactionHash": [
            1
          ],
          "transactionType": "Deposit"
        }
      }
    }
    {
      "data": [
        {
          "conversion_rate": 1.012345,
          "dao_fees_lseth": 0.00001234567,
          "dao_fees_rate": 0.0015,
          "date": "2023-01-02T03:04:05Z",
          "gross_fee_lseth": 0.0001234,
          "operator_fees_lseth": 0.000123456789,
          "operator_fees_rate": 0.0035,
          "oracle_report": "f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef",
          "org_id": "org_example1234",
          "platform": {
            "fees_lseth": 0.0001234567,
            "fees_rate": 0.097,
            "off_platform_rebate": {
              "adjusted_total_net_outflows_fees_lseth": 0.0001234567,
              "adjusted_total_net_outflows_lseth": 0.0001234567,
              "adjusted_total_net_outflows_transfers_lseth": 0.0001234567,
              "fees_paid_lseth": 0.0001234567,
              "off_platform_attributable_fees_lseth": 0.0001234567,
              "off_platform_balance_lseth": 0.0001234567,
              "off_platform_fees_lseth": 0.0001234567,
              "off_platform_gross_fee_lseth": 0.0001234567,
              "outflow_ratio": 0.0001234567,
              "total_burns_lseth": 32.1234,
              "total_mints_lseth": 32.1234,
              "total_net_outflows_lseth": 0.0001234567,
              "total_on_platform_lseth": 0.0001234567,
              "total_outflows_lseth": 0.0001234567,
              "total_platform_transfers_in_lseth": 0.0001234567,
              "total_platform_transfers_out_lseth": 0.0001234567
            },
            "on_platform_rebate": {
              "on_platform_attributable_fees_lseth": 0.0001234567,
              "on_platform_fees_lseth": 0.0001234567,
              "on_platform_lseth": 120520123.456789,
              "on_platform_ratio": 0.0001234567
            },
            "total_balance_lseth": 0.0001234567
          },
          "slashing_coverage_fees_lseth": 0.0000012345678,
          "slashing_coverage_fees_rate": 0.003,
          "tech_provider_fees_lseth": 0.0000123456789,
          "tech_provider_fees_rate": 0.0035,
          "total_eth_supply": 120520123.456789,
          "total_lseth_supply": 120520123.456789,
          "version": 3
        }
      ],
      "metadata": {
        "next_cursor": {
          "block_time": "text",
          "event_id": [
            1
          ]
        }
      }
    }
    {
      "data": [
        {
          "conversion_rate": 1.012345,
          "date": "2023-01-02T03:04:05Z",
          "operator_active_keys_count": 5,
          "operator_active_keys_ratio": 0.5,
          "operator_fees_lseth": 0.00006,
          "oracle_report": "f071c15d86fd9ae82f62bb4bb04963f14e04045bbcac8b5439984733207821bc000000ef",
          "org_id": "org_example1234",
          "total_active_keys_count": 10,
          "total_operator_fees_lseth": 0.00012,
          "version": 3
        }
      ],
      "metadata": {
        "next_cursor": {
          "block_time": "text",
          "event_id": [
            1
          ]
        }
      }
    }
    {
      "data": {
        "account_id": "ab3e5114-af15-45b8-9c43-a5ec011d9d95",
        "address": "0xF523F31Acf07Ff41D2616f9c1b73E762Ba8E5660",
        "daily_reports": [
          {
            "address": "0xF523F31Acf07Ff41D2616f9c1b73E762Ba8E5660",
            "balance_lseth": 0.00099376738985375,
            "burns_lseth": 2.22405e-13,
            "conversion_rate": 1.006282340620787,
            "dao_fees_eth": 7.86854637e-10,
            "date": "2024-04-01",
            "fees_at_discount_rate_eth": 4.80412e-13,
            "fees_eth": 8.282680389e-9,
            "gross_fees_eth": 8.2826803894e-8,
            "gross_protocol_fee_rate": 0.000006264174837104,
            "gross_rewards_eth": 0.000006264174837104,
            "mints_lseth": 4.4554123505e-8,
            "operator_fees_eth": 1.242402058e-9,
            "oracle_report": "68bbc70ba87b9467831cc3ff56fc114f3659ba9e646042007d1d54f6b95f267d00000164",
            "platform_fees_at_discount_rate_eth": 0.000005236375878362,
            "platform_fees_eth": 5.715049468e-9,
            "previous_conversion_rate": 1.0371537463463845,
            "provider_fees_eth": 2.89893814e-10,
            "rebate_eth": 0.000006264174837104,
            "rebate_lseth": 0.000006264174837104,
            "rewards_eth": 7.4544123505e-8,
            "slashing_fees_eth": 2.48480412e-10,
            "target_fee_rate": 0.000006264174837104
          }
        ],
        "end_conversion_rate": 1.0454865181649966,
        "from": "2024-04-01",
        "org_id": "org_aDs4aCACyWYgMQ4A",
        "start_conversion_rate": 1.006282340620787,
        "to": "2024-04-01",
        "total_burns_lseth": 0,
        "total_dao_fees_eth": 4.34597684399e-7,
        "total_fees_eth": 0.000006787291484265,
        "total_gross_fees_eth": 0.000006787291484265,
        "total_gross_rewards_eth": 0.000045747124673728,
        "total_mints_lseth": 0.00099376738985375,
        "total_operator_fees_eth": 8.18961611118e-7,
        "total_platform_fees_at_discount_rate_eth": 0.000005236375878362,
        "total_platform_fees_eth": 0.000005236375878362,
        "total_provider_fees_eth": 1.60114936353e-7,
        "total_rebate_eth": 0,
        "total_rebate_lseth": 0,
        "total_rewards_eth": 0.000038959833189463,
        "total_slashing_fees_eth": 1.37241374012e-7
      },
      "metadata": {
        "next_cursor": null
      }
    }
    {
      "created_at": "2024-01-24T13:07:50.335845Z",
      "id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "key": "depositor_example",
      "org_id": "org_28CLGCvsdG7TlOHf",
      "status": "ACTIVE"
    }
    {
      "created_at": "2024-01-24T13:07:50.335845Z",
      "id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "key": "depositor_example",
      "org_id": "org_28CLGCvsdG7TlOHf",
      "status": "REMOVED",
      "wallets": [
        {
          "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
          "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
          "allowlisted": true,
          "created_at": "2024-01-25T13:07:50.335845Z",
          "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
          "on_platform": true,
          "originator_org_id": "org_ABCDEF",
          "status": "ALLOWLISTED",
          "type": "ETH"
        }
      ]
    }
    {
      "created_at": "2024-01-24T13:07:50.335845Z",
      "id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "key": "depositor_example",
      "org_id": "org_28CLGCvsdG7TlOHf",
      "status": "ACTIVE",
      "wallets": [
        {
          "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
          "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
          "allowlisted": true,
          "created_at": "2024-01-25T13:07:50.335845Z",
          "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
          "on_platform": true,
          "originator_org_id": "org_ABCDEF",
          "status": "ALLOWLISTED",
          "type": "ETH"
        }
      ]
    }
    {
      "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "allowlisted": true,
      "created_at": "2024-01-25T13:07:50.335845Z",
      "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
      "on_platform": true,
      "originator_org_id": "org_ABCDEF",
      "status": "ALLOWLISTED",
      "type": "ETH"
    }
    {
      "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "allowlisted": true,
      "created_at": "2024-01-25T13:07:50.335845Z",
      "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
      "on_platform": true,
      "originator_org_id": "org_ABCDEF",
      "status": "ALLOWLISTED",
      "type": "ETH"
    }
    {
      "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "allowlisted": true,
      "created_at": "2024-01-25T13:07:50.335845Z",
      "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
      "on_platform": true,
      "originator_org_id": "org_ABCDEF",
      "status": "ALLOWLISTED",
      "type": "ETH"
    }
    {
      "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "allowlisted": true,
      "created_at": "2024-01-25T13:07:50.335845Z",
      "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
      "on_platform": true,
      "originator_org_id": "org_ABCDEF",
      "status": "ALLOWLISTED",
      "type": "ETH"
    }
    POST /v0/platform/accounts HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 27
    
    {
      "key": "depositor_example"
    }
    GET /v0/platform/accounts HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    [
      {
        "created_at": "2024-01-24T13:07:50.335845Z",
        "id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
        "key": "depositor_example",
        "org_id": "org_28CLGCvsdG7TlOHf",
        "status": "ACTIVE | PAUSED | REMOVED | DENIED",
        "wallets": [
          {
            "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
            "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
            "allowlisted": true,
            "created_at": "2024-01-25T13:07:50.335845Z",
            "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
            "on_platform": true,
            "originator_org_id": "org_ABCDEF",
            "status": "ALLOWLISTED",
            "type": "ETH"
          }
        ]
      }
    ]
    GET /v0/platform/accounts/{idOrKey} HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "created_at": "2024-01-24T13:07:50.335845Z",
      "id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "key": "depositor_example",
      "org_id": "org_28CLGCvsdG7TlOHf",
      "status": "ACTIVE | PAUSED | REMOVED | DENIED",
      "wallets": [
        {
          "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
          "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
          "allowlisted": true,
          "created_at": "2024-01-25T13:07:50.335845Z",
          "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
          "on_platform": true,
          "originator_org_id": "org_ABCDEF",
          "status": "ALLOWLISTED",
          "type": "ETH"
        }
      ]
    }
    PATCH /v0/platform/accounts/{idOrKey}/remove HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    PATCH /v0/platform/accounts/{idOrKey}/pause HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    PATCH /v0/platform/accounts/{idOrKey}/reactivate HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    GET /v0/platform/wallets/{idOrAddress} HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "allowlisted": true,
      "created_at": "2024-01-25T13:07:50.335845Z",
      "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
      "on_platform": true,
      "originator_org_id": "org_ABCDEF",
      "status": "ALLOWLISTED",
      "type": "ETH"
    }
    GET /v0/platform/wallets HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    [
      {
        "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
        "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
        "allowlisted": true,
        "created_at": "2024-01-25T13:07:50.335845Z",
        "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
        "on_platform": true,
        "originator_org_id": "org_ABCDEF",
        "status": "ALLOWLISTED",
        "type": "ETH"
      }
    ]
    POST /v0/platform/accounts/{idOrKey}/wallets HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 88
    
    {
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "allowlisted": true,
      "type": "ETH"
    }
    GET /v0/platform/accounts/{idOrKey}/wallets HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    PATCH /v0/platform/accounts/{idOrKey}/wallets/{idOrAddress}/remove HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    PATCH /v0/platform/accounts/{idOrKey}/wallets/{idOrAddress}/pause HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    PATCH /v0/platform/accounts/{idOrKey}/wallets/{idOrAddress}/reactivate HTTP/1.1
    Host: api.alluvial.finance
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "created_at": "2024-01-24T13:07:50.335845Z",
      "id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
      "key": "depositor_example",
      "org_id": "org_28CLGCvsdG7TlOHf",
      "status": "PAUSED",
      "wallets": [
        {
          "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
          "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
          "allowlisted": true,
          "created_at": "2024-01-25T13:07:50.335845Z",
          "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
          "on_platform": true,
          "originator_org_id": "org_ABCDEF",
          "status": "ALLOWLISTED",
          "type": "ETH"
        }
      ]
    }
    [
      {
        "account_id": "ac0d0cdf-92bc-4cbe-a180-a2efb2387d16",
        "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
        "allowlisted": true,
        "created_at": "2024-01-25T13:07:50.335845Z",
        "id": "dd8eefc8-0cc4-4a27-adc0-e1ebebed598d",
        "on_platform": true,
        "originator_org_id": "org_ABCDEF",
        "status": "ALLOWLISTED",
        "type": "ETH"
      }
    ]

    Redemptions

    hashtag
    Goals

    This guide is a technical guide with examples of how to implement Liquid Collective’s redemption workflow into a Platform's workflow. For more information on Liquid Collective’s ETH staking withdrawal architecture, check out Liquid Collective’s LsETH redemption documentationarrow-up-right

    hashtag
    Pre-read

    Review the for the Alluvial API.

    hashtag
    Implementation

    circle-info

    The guide will using the Hoodi network for smart contract calls.

    For this example, the implementation will use both smart contract calls and offchain calls via the Redemption API.

    The Redemption API is an offchain API that exposes:

    • The list of redeem requests for an owner (wallet) including their redemption IDs

    • The status information about redeem requests (including id, redeemed amount, satisfaction status, claim status, etc.)

    • The heights of the withdrawal stack (ETH supplied) and the redeem queue (LsETH queued to redeem). Learn more on different queues & stacks.

    circle-exclamation

    For Contract Addresses: view this . Make sure you use the Contract Address when sending txs.

    For ABIs: This guide uses Hoodi testnet and interacts with two contracts: and . RedeemManger contract is only needed if listening to RedeemManager contract events.

    hashtag
    Create Redemption Request

    The LsETH contract exposes a function called .

    As an Platform, you allow users to submit (or to request that you submit on their behalf) the amount of LsETH they wish to redeem.

    circle-info

    Note: In some cases, the recipient may be different from the message sender. For example: if using an omnibus model, you may have LsETH in a wallet separate from the user’s ETH wallet. In this case, the LsETH wallet will make the requestRedeem, however, the recipient of ETH will be the ETH wallet.

    After successfully calling requestRedeem function an ID will be generated. Keep this redeemRequestId as you will use it later on.

    Below is a code snippet that will call the requestRedeem function.

    circle-info

    Code uses public RPC as its provider to interact with smart contracts and uses Ethers.js

    Contract.json is the ABI associated with the LsETH contract

    hashtag
    RequestedRedeem event

    When creating a requestRedeem, the LsETH contract will emit a RequestedRedeem event. The event contains the redeem request IDs. Additionally, you can use the Redemption API to retrieve redeem request IDs associated with an owner, which is demonstrated later on in this guide.

    Below is a code snippet for listening to the RequestedRedeem event via websocket connection.

    Request:

    circle-info

    Code uses public RPC as its provider to interact with smart contracts and uses Ethers.js

    Contract.json is the ABI associated with the LsETH contract

    run in terminal

    Response:

    As you can see in the response below, the redeem request ID is 18. This is the request ID associated with the request earlier in the “Create Redeem Request” section of this guide.

    circle-info

    The full lifecycle method visual can be seen .

    hashtag
    eth/v0/redeems

    You can use the Redemption API to list the redeemRequests for a given recipient wallet.

    You can get a list of all redemptions associated with a wallet using the curl request below.

    hashtag
    Request

    Response:

    You can see information related to the status of the redemption. Later on, you will see the status update as the redeemRequest becomes satisfied and can be claimed.

    circle-info

    For all status combinations check out this

    hashtag
    Timing projections

    Now that you have a redeem ID, use the projections endpoint to get an estimate of how long it might take for the redeemRequest to be satisfied and become claimable.

    Request:

    Response:

    The response below displays when the redeemRequest is likely to be redeemable. Once redeemable, you can use resolveRedeemRequests to get the matching withdrawal event ID.

    hashtag
    Reported withdrawal event

    A withdrawal event is triggered at the time of the protocol’s Oracle report. Oracles report every 24 hours.

    circle-info

    Withdrawal event IDs are not generated instantly, even if there is enough supply. Withdrawal event IDs will be generated at the next Oracle report after redeem request is submitted. This is by design to ensure a fair redemption process for all Liquid Collective participants.

    Below is an example event.

    Request:

    This event will emit the newly created withdrawal ID, as you can see below:

    Response:

    hashtag
    Resolve redemption request

    In order to see if a redemption request can be satisfied, use the function call.

    Request:

    Response:

    You receive a redeem ID of 10. 10 is the specific withdrawal event ID that is produced when the Liquid Collective Protocol has enough ETH to satisfy (either partial or full) the redemption. This means that the redeemRequest has been satisfied and the corresponding withdrawal event ID was returned.

    circle-info

    This withdrawal event may fully satisfy or partially satisfy the redeem request ID. To ensure redemption requests are fully satisfied prior to claiming, use the /eth/v0/redeems/{idx} endpoint.

    circle-exclamation

    A response of…

    • -1 means that the request is not satisfied yet

    • -2 means that the request is out of bounds

    An alternative method to getting the Withdrawal event ID is using the /eth/v0/redeems/{id} endpoint.

    Request:

    Response:

    The response below indicates that this redemption can be fully satisfied, meaning there is enough supply in the withdrawal stack to fulfill this redemption. This is noted via the "status_satisfaction": "FULLY_SATISFIED" and also the claimable_amount_lseth is equal to the total_amount_lseth.

    For other potential states, check out the at the bottom of the doc.

    hashtag
    Claim redemption requests

    With both a request redeem ID and withdrawal event ID you can submit a claim for the redemption calling the function.

    circle-exclamation

    Before claiming, ensure you have correct Withdrawal event ID. Withdrawal events IDs will change based on redemptions happening on the protocol.

    Request:

    After making a claim there will be two events triggered, which will be inspected next in this guide.

    hashtag
    ClaimedRedeemRequest event

    On successfully claiming a redeemRequest, a ClaimedRedeemRequest event is emitted. This event indicates the amount of LsETH claimed, the amount of ETH sent to the recipient, and the remaining LsETH amount that has been satisfied but not yet claimed.

    A remaining LsETH amount of 0 means the request has been fully claimed. If the amount is greater than 0, the request has been partially claimed and another claim will be required to fully claim the request.

    Request:

    Response:

    hashtag
    SatisfiedRedeemRequest event

    On successfully claiming a redemption request one or more SatisfiedRedeemRequest events are emitted.

    Those events provide details about the withdrawal events that have satisfied a redemption request.

    Request:

    Response:

    hashtag
    eth/v0/redeems

    An alternative approach is to use the Alluvial API to call the /redeems endpoint, as it will return the status of both satisfaction and claim status.

    Request:

    circle-exclamation

    Non-finalized blocks are returned in the Alluvial API.

    Response:

    Below the endpoint returns that this request redeem has been fully satisfied and claimed.

    You are now able to fully implement the redemption process for the Liquid Collective protocol!

    hashtag
    Redemption Information

    The Alluvial API exposes information about both the.

    hashtag
    Redemption height

    Platforms who want visibility into the current supply (amount of withdrawals) and demand (amount of redeems) can use the /redeems_info endpoint.

    Request:

    Response:

    Below you can see that the redeem queue is greater than the withdrawal stack. This indicates that more supply is needed to fulfill the redeem requests. Additional supply can enter via more deposits and/or exiting a validator.

    circle-info

    amounts returned are denominated in LsETH

    In addition to exposing the Withdrawal stack and Redeem queue, Alluvial exposes an estimated time when redeems will be fulfilled.

    Request:

    Response:

    The current projections timestamp logic is:

    • If the timestamp is in the past, it means that there is enough supply to fulfill demand and Alluvial returns the timestamp associated with the latest redeem request.

    • If the timestamp is in the future, it means there isn't enough supply to fulfill demand and time is needed to add supply into the Withdrawal stack.

    circle-info

    This is an estimated time and actual times may vary depending on frequency of deposits and redemptions on the Liquid Collective protocol.

    hashtag
    Appendix

    hashtag
    Full Code

    Full code for making deposit transaction

    triangle-exclamation

    Code is meant for testing purposes and should not be used directly for production workloads.

    hashtag
    /redeems response payloads

    The redemption process is very dynamic. You can see a matrix of all the redeem statuses . Below will show the difference between response payloads when requesting from either:

    • eth/v0/redeems/18

    • eth/v0/redeems?owner=

    hashtag
    NOT_CLAIMED & PENDING_SATISFACTION

    Why would this state happen?

    • This is the initial state for all redeem requests.

    hashtag
    NOT_CLAIMED & PARTIALLY_SATISFIED

    Why would this state happen?

    • This happens when the redemption request can be partially satisfied and the owner has not made a against the redeem request.

    • Notice that the claimable_amount_lseth is greater than 0 but less than the total_amount_lseth.

    hashtag
    NOT_CLAIMED & FULLY_SATISFIED

    Why would this state happen?

    • The amount of supply can fully satisfy the amount of LsETH being redeemed in this request.

    • Notice that total_amount_lseth == claimable_amount_lseth

    hashtag
    PARTIALLY_CLAIMED & PENDING_SATISFACTION

    Why would this state happen?

    • The owner has claimed part of redeem request before the redeem request was fully satisfied. More supply will need to be added, hence the withdrawal_event_id is == -1, whereas before there would have been a positive integer associated with the withdrawal_event_id (ex. 0, 1, 2, etc...).

    • Note that claimed_amount_lseth is equal to previously claimed amount.

    hashtag
    PARTIALLY_CLAIMED & PARTIALLY_SATISFIED

    Why would this state happen?

    • The owner has claimed part of redeem request before the redeem request was fully satisfied. More supply was found, however not enough to fully satisfy this redeem request.

    • In the example below you can see that total_amount_lseth > claimed_amount_lseth + claimable_amount_lseth. There is 40000 LsETH still left to fully satisfy this request.

    hashtag
    PARTIALLY_CLAIMED & FULLY_SATISFIED

    Why would this state happen?

    • The owner has claimed part of redeem request before the redeem request was fully satisfied.

    • In the example below you can see that total_amount_lseth = claimed_amount_lseth + claimable_amount_lseth.

    hashtag
    FULLY_CLAIMED & FULLY_SATISFIED

    Why would this state happen?

    • This is final state for all redeem requests. This indicates that the redeem request has been fully satisfied.

    • total_amount_lseth == claimed_amount_lseth and claimable_amount_lseth == 0

    • withdrawal_event_id

    Time estimates for redemptions (projected and fulfilled)

    -3 means that the request has already been claimed

    reflects this state with the
    -3
    ID.
    Authentication Guidearrow-up-right
    herearrow-up-right
    pagearrow-up-right
    LsETHarrow-up-right
    RedeemManagerarrow-up-right
    requestRedeemarrow-up-right
    herearrow-up-right
    Redeem Status Matrixarrow-up-right
    resolveRedeemRequestsarrow-up-right
    appendixarrow-up-right
    claimRedeemRequestsarrow-up-right
    Withdrawal stack and Redeem queuearrow-up-right
    herearrow-up-right
    claimRedeemRequestarrow-up-right
    index.js
    const { ethers } = require('ethers');
    const Contract = require('./Contract.json');
    
    (async () => {
      const nodeUrl = 'https://ethereum-hoodi-rpc.publicnode.com';
      const provider = new ethers.providers.JsonRpcProvider(nodeUrl);
    
      const signer = new ethers.Wallet('<INSERT WALLET SECRET>', provider);
    
      const LsETHContract = new ethers.Contract(
        Contract.address,
        Contract.abi,
        signer
      );
    
      const walletAddress = '<INSERT WALLET ADDRESS>';
    
      const value = ethers.utils.parseEther('0.000001');
    
      //Get estimate for gas limit
      const redeem_estimation = await LsETHContract.estimateGas.requestRedeem(
        value,
        walletAddress,
        { gasLimit: 1 }
      );
    
      // Create Redeem Request
      let tx = await LsETHContract.requestRedeem(value, walletAddress, {
        gasLimit: redeem_estimation,
      });
      let receipt = await tx.wait();
      console.log(tx);
    })();
    websocket.js
    const ethers = require('ethers');
    const Contract = require('./RedeemManager.json');
    
    async function main() {
      const provider = new ethers.providers.WebSocketProvider(
        'wss://ethereum-hoodi-rpc.publicnode.com',
        17000
      );
    
      const redeemManagerContract = new ethers.Contract(
        Contract.address,
        Contract.abi,
        provider
      );
    
      redeemManagerContract.on(
        'RequestedRedeem',
        (owner, height, amount, maxRedeemableEth, id) => {
          console.log('RequestedRedeem event');
          console.log(`Owner of redeem ${owner}`);
          console.log(`Height ${height.toString()}`);
          console.log(`Amount of LsETH to redeem ${amount.toString()}`);
          console.log(
            `Maximum amount of ETH to redeem ${maxRedeemableEth.toString()}`
          );
          console.log(`Request Redeem ID ${id}`);
        }
      );
    }
    main();
    node websocket.js
    websocket.js
    RequestedRedeem event
    Owner of redeem <WALLET ADDRESS>
    Height 4980971589444881813
    Amount of LsETH to redeem 10000000
    Maximum amount of ETH to redeem 10212074
    Request Redeem ID 18
    index.sh
    curl -X 'GET' \
      'https://api.staging.alluvial.finance/eth/v0/redeems?owner=<WALLET ADDRESS>' \
      -H 'accept: application/json' \
      -H 'Authorization: Bearer e...jk'
    [
      {
        "id": 18,
        "withdrawal_event_id": -1,
        "total_amount_lseth": "10000000",
        "claimed_amount_lseth": "0",
        "claimable_amount_lseth": "0",
        "max_redeemable_amount_eth": "10209790",
        "owner": "<WALLET ADDRESS>",
        "height": "4980971589354881813",
        "status_claim": "NOT_CLAIMED",
        "status_satisfaction": "PENDING_SATISFACTION",
        "requested_at": 9017542
      }
    ]
    index.sh
    curl 'https://api.staging.alluvial.finance/eth/v0/redeems/18/projection' \
      -H 'Authorization: Bearer e...jk'
    {
      "projected_redeemable_at": "2023-05-19T19:16:24Z"
    }
    websocket.js
    redeemManagerContract.on(
      'ReportedWithdrawal',
      (height, amount, ethAmount, id) => {
        console.log('ReportedWithdrawal event');
        console.log(`Height ${height.toString()}`);
        console.log(`Amount of LsETH to redeem ${amount.toString()}`);
        console.log(`ETH amount being withdrawn ${ethAmount.toString()}`);
        console.log(`Withdrawal event ID ${id}`);
      }
    );
    websocket.js
    ReportedWithdrawal event
    Height 4980971589444881813
    Amount of LsETH to redeem 10000000
    ETH amount being withdrawn 10212074
    Withdrawal event ID 10
    index.js
    const { ethers } = require('ethers');
    const Contract = require('./Contract.json');
    
    (async () => {
      const LsETHContract = new ethers.Contract(
        Contract.address,
        Contract.abi,
        provider
      );
    
      let arrRequestId = [18];
    
      let resolveRedeem = await LsETHContract.resolveRedeemRequests(arrRequestId);
      console.log(resolveRedeem.toString());
    })();
    10
    index.sh
    curl 'https://api.staging.alluvial.finance/eth/v0/redeems/18' \
      -H 'Authorization: Bearer e...jk'
    [
      {
        "id": 18,
        "withdrawal_event_id": 10,
        "total_amount_lseth": "10000000",
        "claimed_amount_lseth": "0",
        "claimable_amount_lseth": "10000000",
        "max_redeemable_amount_eth": "10209790",
        "owner": "<WALLET ADDRESS>",
        "height": "4980971589354881813",
        "status_claim": "NOT_CLAIMED",
        "status_satisfaction": "FULLY_SATISFIED",
        "requested_at": 9017542
      }
    ]
    index.js
    const arrRequestId = [18];
    const arrWithdrawalId = [10];
    
    //Get estimate for gas limit
    const claim_estimation = await LsETHContract.estimateGas.claimRedeemRequests(
      arrRequestId,
      arrWithdrawalId,
      { gasLimit: 1 }
    );
    
    const claimRedeemRequests = await LsETHContract.claimRedeemRequests(
      arrRequestId,
      arrWithdrawalId,
      { gasLimit: claim_estimation }
    );
    const receipt = await claimRedeemRequests.wait();
    console.log(claimRedeemRequests);
    websocket.js
    redeemManagerContract.on(
      'ClaimedRedeemRequest',
      (
        redeemRequestId,
        recipient,
        ethAmount,
        lsEthAmount,
        remainingLsEthAmount
      ) => {
        console.log('ClaimedRedeemRequest event');
        console.log(`Redeem Request ID ${redeemRequestId}`);
        console.log(`Recipient of redeem request ${recipient}`);
        console.log(`Amount of ETH ${ethAmount.toString()}`);
        console.log(`Amount of LsETH ${lsEthAmount.toString()}`);
        console.log(`Amount of remaining LsETH ${remainingLsEthAmount.toString()}`);
      }
    );
    websocket.js
    ClaimedRedeemRequest event
    Redeem Request ID 18
    Recipient of redeem request <WALLET ADDRESS>
    Amount of ETH 10209790
    Amount of LsETH 10000000
    Amount of remaining LsETH 0
    websocket.js
    redeemManagerContract.on(
      'SatisfiedRedeemRequest',
      (
        redeemRequestId,
        withdrawalEventId,
        lsEthAmountSatisfied,
        ethAmountSatisfied,
        lsEthAmountRemaining,
        ethAmountExceeding
      ) => {
        console.log('SatisfiedRedeemRequest event');
        console.log(`Redeem Request ID ${redeemRequestId}`);
        console.log(`Withdrawal ID ${withdrawalEventId}`);
        console.log(`Amount of LsETH satisfied ${lsEthAmountSatisfied.toString()}`);
        console.log(`Amount of ETH satisfied  ${ethAmountSatisfied.toString()}`);
        console.log(
          `Amount of LsETH left to satisfy ${lsEthAmountRemaining.toString()}`
        );
        console.log(
          `Amount of ETH added to buffer  ${ethAmountExceeding.toString()}`
        );
      }
    );
    websocket.js
    SatisfiedRedeemRequest event
    Redeem Request ID 18
    Withdrawal ID 10
    Amount of LsETH satisfied 10000000
    Amount of ETH satisfied  10209790
    Amount of LsETH left to satisfy 0
    Amount of ETH added to buffer  163
    index.sh
    curl -X 'GET' \
      'https://api.staging.alluvial.finance/eth/v0/redeems?owner=<WALLET ADDRESS>' \
      -H 'accept: application/json' \
      -H 'Authorization: Bearer e...jk'
    {
      "id": 18,
      "withdrawal_event_id": -3,
      "total_amount_lseth": "10000000",
      "claimed_amount_lseth": "10000000",
      "claimable_amount_lseth": "0",
      "max_redeemable_amount_eth": "10209790",
      "owner": "<WALLET ADDRESS>",
      "height": "4980971589354881813",
      "status_claim": "FULLY_CLAIMED",
      "status_satisfaction": "FULLY_SATISFIED",
      "requested_at": 9017542
    }
    index.sh
    curl -X 'GET' \
      'https://api.staging.alluvial.finance/eth/v0/redeems_info' \
      -H 'accept: application/json' \
      -H 'Authorization: Bearer e...jk'
    index.sh
    {
      "total_amount_withdrawal_stack_lseth": "204462016832064499274",
      "total_amount_redeem_queue_lseth": "237456822758541259805"
    }
    index.sh
    curl -X 'GET' \
      'https://api.staging.alluvial.finance/eth/v0/redeems_info/projection'\
      -H 'accept: application/json' \
      -H 'Authorization: Bearer e...jk'
    index.sh
    {
      "projected_fulfilled_at": "2023-06-15T11:02:24Z"
    }
    index.js
    const { ethers } = require('ethers');
    const Contract = require('../Contract.json');
    const walletAddress = '0xbe79ff177a8F6a0D9656cF47D8687f43666a4d1e';
    
    (async () => {
      const nodeUrl = 'https://ethereum-hoodi-rpc.publicnode.com';
      const provider = new ethers.providers.JsonRpcProvider(nodeUrl);
    
      const gasPrice = await provider.getGasPrice();
    
      const signer = new ethers.Wallet('<INSERT WALLET PRIVATE KEY>', provider);
    
      const riverContract = new ethers.Contract(
        Contract.address,
        Contract.abi,
        signer
      );
    
      const value = ethers.utils.parseEther('0.000000000001');
    
      //Get estimate for gas limit
      const redeem_estimation = await riverContract.estimateGas.requestRedeem(
        value,
        walletAddress,
        { gasLimit: 1 }
      );
    
      // Create Redeem Request
      let tx = await riverContract.requestRedeem(value, walletAddress, {
        gasLimit: redeem_estimation,
      });
    
      // ***** Start resolve redeem function block *****
      // Uncomment when running claimRedeemRequests()
      //let arrRequestId = [18];
    
      //let resolveRedeem = await LsETHContract.resolveRedeemRequests(arrRequestId);
      // console.log(resolveRedeem.toString())
      // ***** Stop resolve redeem function block *****
    
      // ***** Start claiming function block *****
      // Get estimate for gas limit
      // const claim_estimation = await LsETHContract.estimateGas.claimRedeemRequests(arrRequestId, arrWithdrawalId, { gasLimit: 1});
    
      //let arrRequestId = [18];
      //const arrWithdrawalId = [10]
    
      //const claimRedeemRequests = await LsETHContract.claimRedeemRequests(arrRequestId, arrWithdrawalId, { gasLimit: claim_estimation});
      //const receipt = await claimRedeemRequests.wait();
      //console.log(claimRedeemRequests);
      // ***** end claiming function block *****
    })();
    index.sh
    {
      "id": 1,
      "withdrawal_event_id": -1,
      "total_amount_lseth": "1000000",
      "claimed_amount_lseth": "0",
      "claimable_amount_lseth": "0",
      "max_redeemable_amount_eth": "1023507",
      "owner": "<WALLET ADDRESS>",
      "height": "201956822758540259700",
      "status_claim": "NOT_CLAIMED",
      "status_satisfaction": "PENDING_SATISFACTION",
      "requested_at": 9134158
    }
    index.sh
    {
      "id": 1,
      "withdrawal_event_id": 1,
      "total_amount_lseth": "1000000",
      "claimed_amount_lseth": "0",
      "claimable_amount_lseth": "900000",
      "max_redeemable_amount_eth": "1023507",
      "owner": "<WALLET ADDRESS>",
      "height": "201956822758540259700",
      "status_claim": "NOT_CLAIMED",
      "status_satisfaction": "PARTIALLY_SATISFIED",
      "requested_at": 9134158
    }
    index.sh
    {
      "id": 1,
      "withdrawal_event_id": 1,
      "total_amount_lseth": "1000000",
      "claimed_amount_lseth": "0",
      "claimable_amount_lseth": "1000000",
      "max_redeemable_amount_eth": "1023507",
      "owner": "<WALLET ADDRESS>",
      "height": "201956822758540259700",
      "status_claim": "NOT_CLAIMED",
      "status_satisfaction": "FULLY_SATISFIED",
      "requested_at": 9134158
    }
    index.sh
    {
      "id": 1,
      "withdrawal_event_id": -1,
      "total_amount_lseth": "1000000",
      "claimed_amount_lseth": "900000",
      "claimable_amount_lseth": "0",
      "max_redeemable_amount_eth": "1023507",
      "owner": "<WALLET ADDRESS>",
      "height": "201956822758540259700",
      "status_claim": "PARTIALLY_CLAIMED",
      "status_satisfaction": "PENDING_SATISFACTION",
      "requested_at": 9134158
    }
    index.sh
    {
      "id": 1,
      "withdrawal_event_id": 2,
      "total_amount_lseth": "1000000",
      "claimed_amount_lseth": "900000",
      "claimable_amount_lseth": "60000",
      "max_redeemable_amount_eth": "1023507",
      "owner": "<WALLET ADDRESS>",
      "height": "201956822758540259700",
      "status_claim": "PARTIALLY_CLAIMED",
      "status_satisfaction": "PARTIALLY_SATISFIED",
      "requested_at": 9134158
    }
    index.sh
    {
      "id": 1,
      "withdrawal_event_id": 2,
      "total_amount_lseth": "1000000",
      "claimed_amount_lseth": "900000",
      "claimable_amount_lseth": "100000",
      "max_redeemable_amount_eth": "1023507",
      "owner": "<WALLET ADDRESS>",
      "height": "201956822758540259700",
      "status_claim": "PARTIALLY_CLAIMED",
      "status_satisfaction": "FULLY_SATISFIED",
      "requested_at": 9134158
    }
    index.sh
    {
      "id": 1,
      "withdrawal_event_id": -3,
      "total_amount_lseth": "1000000",
      "claimed_amount_lseth": "1000000",
      "claimable_amount_lseth": "0",
      "max_redeemable_amount_eth": "1023507",
      "owner": "<WALLET ADDRESS>",
      "height": "201956822758540259700",
      "status_claim": "FULLY_CLAIMED",
      "status_satisfaction": "FULLY_SATISFIED",
      "requested_at": 9134158
    }

    Fireblocks

    Liquid Collective Platforms can use Fireblocksarrow-up-right to custody digital assets.

    Fireblocks is an easy-to-use platform to create new blockchain-based products and manage day-to-day digital asset operations. Fireblocks provides an MPC-based wallet allowing users to store their digital assets.

    This guide will provide Platforms with a step-by-step process for using Fireblocks to interact with the Liquid Collective protocol.

    circle-info

    Fireblocks' offerings are third-party products that are not offered by or in partnership or affiliation with Alluvial. Products and services offered by Fireblocks and other third parties are subject to separate terms and conditions. Please visit https://www.fireblocks.com/arrow-up-right for more information. Any links provided are for your convenience and informational purposes only. Inclusion of any link does not constitute an endorsement or an approval of any such third-party products by Alluvial or any other Liquid Collective protocol service provider.

    hashtag
    Architecture

    Below is an example architecture for a Platform that uses Fireblocks as a custodian when the Platform's users stake ETH and/or redeem LsETH.

    hashtag
    Implementation

    This implementation will take advantage of the Fireblocks SDK, specifically the Javascript SDK. Please follow the to install the appropriate dependencies.

    circle-info

    This guide uses the Goerli network and the Alluvial Staging API.

    hashtag
    Dependencies

    Create a new Javascript file, such as index.js.

    Define dependencies at top of file.

    hashtag
    Vault & wallet

    Create or use an existing Fireblocks vault.

    Response:

    Next, put digital assets into the Fireblocks account.

    circle-info

    Admin permissions are needed to add ERC-20 digital assets to a Fireblocks account. Please review this information on .

    Define the contract address for Goerli:

    Call the supported digital assets in Fireblocks.

    Response:

    Add the LsETH to the newly created vault.

    Request:

    Response:

    hashtag
    Creating Depositor and Allowlisting

    Now that you have an address associated with your Fireblocks account, you will create a Depositor object and add the wallet address to the Liquid Collective protocol Allowlist via the Alluvial API.

    The steps for onboarding and adding to the Allowlist can be found in the . Come back to this guide once your wallet(s) have been successfully added to the Allowlist.

    hashtag
    Stake ETH

    Now that you have successfully added your wallets to the Allowlist you can continue with staking.

    In order to interact with the Liquid Collective protocol you will need to invoke Smart Contract functions.

    This guide will use the Fireblocks Ethers.js provider, created by the Fireblocks team. To install read the .

    In the index.js file add new dependencies

    The Liquid Collective uses a TUPProxy architecture. Below are the details about the Proxy address and implementation contract.

    Ethereum Network
    Proxy
    Implementation

    Create a separate file called Contract.json.

    In the file, add the ABI for the Liquid Collective protocol:

    • Goerli can be found

    • Mainnet can be found

    Define the ABI address for Goerli.

    Define the EIP-1193 Provider.

    Create a function that calls the deposit function.

    circle-info

    You will need to have ETH in your Fireblocks vault to fund the deposit & gas fee.

    Request:

    circle-exclamation

    Submitting transactions will involve the Fireblocks TAP policy.

    You've successfully staked ETH and should see LsETH returned in your Fireblocks vault.

    Response:

    Now you can implement the LsETH redemption flow, providing your users the ability to redeem their LsETH for ETH.

    hashtag
    Redeem LsETH

    The next step is to allow the allowlisted wallets the ability to redeem their LsETH for ETH, thereby burning their LsETH.

    There is a two-step process to receive the redeemed ETH. First, you will create a RedeemRequest that results in a redemption ID being returned. Once the redemption has been satisfied (full or partial) you can make a claimRedeemRequest call.

    For more information check out .

    hashtag
    Create a redemption request

    The first function you will call is the .

    Request:

    A request redeem ID will be generated.

    You can retrieve the request redeem ID either via the Alluvial API or by listening the the Redeem Manager contract events. More information can be found .

    hashtag
    Resolve redeem request

    In order to get the Withdrawal Event ID, invoke the or call via the .

    The example below will show invoking the resolveRedeemRequest function.

    Request:

    Response:

    111

    The resolveRedeemRequest function returns the status of the Withdrawal Event ID. More can be found .

    You can proceed to make a claim now that you have both your redemption ID (53) and Withdrawal Event ID (111).

    hashtag
    Create a claim request

    To make a claim request provide both the redemption request ID and the Withdrawal Event ID in an array.

    circle-exclamation

    Submitting transactions will involve the Fireblocks TAP policy.

    Request:

    After the claim is processed you will see the the deposit of ETH into your Fireblocks wallet.

    To see the status of the claim you can either listen for events or use the Alluvial API. More information on the claiming process can be found .

    Congratulations! You have now implemented the ETH staking and LsETH redemption flow using a Fireblocks account and SDK.

    Appendix:

    Below is the full code from the snippets above:

    circle-info

    To call a function uncomment the function declaration.

    index.js
    const fs = require('fs');
    const path = require('path');
    const { FireblocksSDK } = require('fireblocks-sdk');
    const { inspect } = require('util');
    index.js
    const createVault = async () => {
      const name = 'LsETH blog';
    
      const vaultAccount = await fireblocks.createVaultAccount(name);
    
      console.log(inspect(vaultAccount, false, null, true));
    };
    createVault();
    index.js
    {
      "id": "6",
      "name": "LsETH blog",
      "hiddenOnUI": false,
      "assets": [],
      "autoFuel": false
    }
    index.js
    const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS;
    index.js
    
    const getAssets = async() => {
    
        const supportedAssets = await fireblocks.getSupportedAssets();
    
        supportedAssets.forEach((asset, index, array) => {
            if (asset.contractAddress == CONTRACT_ADDRESS) {
                console.log(JSON.stringify(asset))
    )
            }
        })
    }
    getAssets();
    index.js
    {
      "id": "LSETH_ETH_TEST3_4E2A",
      "name": "Liquid Staked ETH",
      "type": "ERC20",
      "contractAddress": "0x3ecCAdA3e11c1Cc3e9B5a53176A67cc3ABDD3E46",
      "nativeAsset": "ETH_TEST3",
      "decimals": 18
    }
    index.js
    const addAssetToVault = async () => {
      const vaultWallet = await fireblocks.createVaultAsset(
        6,
        'LSETH_ETH_TEST3_4E2A'
      );
    
      console.log(inspect(vaultWallet, false, null, true));
    };
    addAssetToVault();
    index.js
    {
      "id": "6",
      "address": "<FIREBLOCKS ADDRESS>",
      "legacyAddress": "",
      "tag": ""
    }
    index.js
    const {
      FireblocksWeb3Provider,
      ChainId,
    } = require('@fireblocks/fireblocks-web3-provider');
    const ethers = require('ethers');

    Goerli

    0x3ecCAdA3e11c1Cc3e9B5a53176A67cc3ABDD3E46

    0xF32fC26C9604a380c311e7eC0c5E545917e7934f

    Mainnet

    0x8c1BEd5b9a0928467c9B1341Da1D7BD5e10b6549

    0x48D93d8C45Fb25125F13cdd40529BbeaA97A6565

    Contract.json
    {
      "abi": [ { INSERT ABI FILE HERE } ],
    }
    index.js
    const ABI = require('./Contract.json').abi;
    index.js
    const eip1193Provider = new FireblocksWeb3Provider({
      privateKey: process.env.FIREBLOCKS_API_PRIVATE_KEY_PATH,
      apiKey: process.env.FIREBLOCKS_API_KEY,
      vaultAccountIds: process.env.FIREBLOCKS_VAULT_ACCOUNT_IDS,
      chainId: ChainId.GOERLI,
      // apiBaseUrl: ApiBaseUrl.Sandbox // If using a sandbox workspace
    });
    index.js
    const createDeposit = async () => {
      const provider = new ethers.providers.Web3Provider(eip1193Provider);
      const LsETHContract = new ethers.Contract(
        CONTRACT_ADDRESS,
        ABI,
        provider.getSigner()
      );
    
      const gasPrice = await provider.getGasPrice();
      const deposit_estimation = await LsETHContract.estimateGas.deposit({
        from: FIREBLOCKS_ADDRESS,
        value: ethers.utils.parseUnits('0.00000001', 'ether'),
        gasLimit: ethers.utils.hexlify(1),
        nonce: provider.getTransactionCount(FIREBLOCKS_ADDRESS, 'latest'),
      });
    
      let tx = await LsETHContract.deposit({
        from: FIREBLOCKS_ADDRESS,
        value: ethers.utils.parseUnits('0.000000001', 'ether'),
        gasPrice: gasPrice,
        gasLimit: deposit_estimation,
        nonce: provider.getTransactionCount(FIREBLOCKS_ADDRESS, 'latest'),
      });
      let receipt = await tx.wait();
      console.log(receipt);
    };
    createDeposit();
    index.js
    const getTx = async () => {
      const transactions = await fireblocks.getTransactions({
        txHash: '<INSERT TX HASH>',
      });
    
      console.log(JSON.stringify(transactions));
    };
    getTx();
    index.js
    {
      "id": "LSETH_ETH_TEST3_4E2A",
      "total": "0.000000000974731883",
      "balance": "0.000000000974731883",
      "lockedAmount": "0",
      "available": "0.000000000974731883",
      "pending": "0",
      "frozen": "0",
      "staked": "0",
      "blockHeight": "9212224",
      "blockHash": "0xc1d94ab995a5db95ddaa10b85ef47b24a38b9ea7249ac7c64bb46a1288fa33bc"
    }
    index.js
    const createRedeemRequest = async () => {
      const provider = new ethers.providers.Web3Provider(eip1193Provider);
      const LsETHContract = new ethers.Contract(
        CONTRACT_ADDRESS,
        ABI,
        provider.getSigner()
      );
    
      const value = ethers.utils.parseEther('0.000001');
    
      const redeem_estimation = await LsETHContract.estimateGas.requestRedeem(
        value,
        FIREBLOCKS_ADDRESS,
        { gasLimit: 1 }
      );
    
      const tx = await LsETHContract.requestRedeem(value, FIREBLOCKS_ADDRESS, {
        gasLimit: redeem_estimation,
      });
    
      let receipt = await tx.wait();
      console.log(receipt);
    };
    createRedeemRequest();
    index.js
    const resolveRedeemRequest = async () => {
      const provider = new ethers.providers.Web3Provider(eip1193Provider);
      const LsETHContract = new ethers.Contract(
        CONTRACT_ADDRESS,
        ABI,
        provider.getSigner()
      );
    
      const value = ethers.utils.parseEther('0.000001');
    
      const arrRequestId = [53];
    
      const resolveRedeem = await LsETHContract.resolveRedeemRequests(arrRequestId);
      console.log(resolveRedeem.toString());
    };
    resolveRedeemRequest();
    index.js
    const createClaimRedeemRequest = async () => {
      const provider = new ethers.providers.Web3Provider(eip1193Provider);
      const LsETHContract = new ethers.Contract(
        CONTRACT_ADDRESS,
        ABI,
        provider.getSigner()
      );
    
      const arrRequestId = [53];
      const arrWithdrawalId = [111];
    
      const claim_estimation = await LsETHContract.estimateGas.claimRedeemRequests(
        arrRequestId,
        arrWithdrawalId,
        { gasLimit: 1 }
      );
      const claimRedeemRequests = await LsETHContract.claimRedeemRequests(
        arrRequestId,
        arrWithdrawalId,
        { gasLimit: claim_estimation }
      );
      const receipt = await claimRedeemRequests.wait();
      console.log(claimRedeemRequests);
    };
    createClaimRedeemRequest();
    index.js
    //General dependencies
    require('dotenv').config();
    const fs = require('fs');
    const path = require('path');
    const { inspect } = require('util');
    
    //Fireblocks SDKs
    const { FireblocksSDK } = require('fireblocks-sdk');
    const {
      FireblocksWeb3Provider,
      ChainId,
    } = require('@fireblocks/fireblocks-web3-provider');
    
    const ethers = require('ethers');
    
    const baseUrl = 'https://api.fireblocks.io';
    const apiSecret = fs.readFileSync(path.resolve('./fb.key'), 'utf8');
    const apiKey = process.env.API_KEY;
    
    const ABI = require('./Contract.json').abi;
    const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS;
    const FIREBLOCKS_ADDRESS = process.env.FIREBLOCKS_ADDRESS;
    
    const fireblocks = new FireblocksSDK(apiSecret, apiKey, baseUrl);
    
    const eip1193Provider = new FireblocksWeb3Provider({
      apiBaseUrl: baseUrl,
      privateKey: apiSecret,
      apiKey: apiKey,
      vaultAccountIds: 3,
      chainId: ChainId.GOERLI,
    });
    
    const createVault = async () => {
      const name = 'LsETH blog';
    
      const vaultAccount = await fireblocks.createVaultAccount(name);
    
      console.log(inspect(vaultAccount, false, null, true));
    };
    
    //createVault()
    
    const getAssets = async () => {
      const supportedAssets = await fireblocks.getSupportedAssets();
    
      supportedAssets.forEach((asset, index, array) => {
        if (asset.contractAddress == CONTRACT_ADDRESS) {
          console.log(JSON.stringify(asset));
        }
      });
    };
    
    //getAssets()
    
    const addAssetToVault = async () => {
      const vaultWallet = await fireblocks.createVaultAsset(
        6,
        'LSETH_ETH_TEST3_4E2A'
      );
    
      console.log(inspect(vaultWallet, false, null, true));
    };
    //addAssetToVault()
    
    const createDeposit = async () => {
      const provider = new ethers.providers.Web3Provider(eip1193Provider);
      const LsETHContract = new ethers.Contract(
        CONTRACT_ADDRESS,
        ABI,
        provider.getSigner()
      );
    
      const gasPrice = await provider.getGasPrice();
      const deposit_estimation = await LsETHContract.estimateGas.deposit({
        from: FIREBLOCKS_ADDRESS,
        value: ethers.utils.parseUnits('0.00000001', 'ether'),
        gasLimit: ethers.utils.hexlify(1),
        nonce: provider.getTransactionCount(FIREBLOCKS_ADDRESS, 'latest'),
      });
    
      let tx = await LsETHContract.deposit({
        from: FIREBLOCKS_ADDRESS,
        value: ethers.utils.parseUnits('0.000000001', 'ether'),
        gasPrice: gasPrice,
        gasLimit: deposit_estimation,
        nonce: provider.getTransactionCount(FIREBLOCKS_ADDRESS, 'latest'),
      });
      let receipt = await tx.wait();
      console.log(receipt);
    };
    //createDeposit()
    
    const getTx = async () => {
      const transactions = await fireblocks.getTransactions({
        txHash:
          '0x124e9ef06e38ab0e3ff78d066f8f2eea54b18210390a229c251a0d578853ae20',
      });
    
      console.log(JSON.stringify(transactions));
    };
    //getTx()
    
    const getBalance = async () => {
      const vaultAsset = await fireblocks.getVaultAccountAsset(
        3,
        'LSETH_ETH_TEST3_4E2A'
      );
      console.log(JSON.stringify(vaultAsset));
    };
    //getBalance()
    
    const createRedeemRequest = async () => {
      const provider = new ethers.providers.Web3Provider(eip1193Provider);
      const LsETHContract = new ethers.Contract(
        CONTRACT_ADDRESS,
        ABI,
        provider.getSigner()
      );
    
      const value = ethers.utils.parseEther('0.000001');
    
      const redeem_estimation = await LsETHContract.estimateGas.requestRedeem(
        value,
        FIREBLOCKS_ADDRESS,
        { gasLimit: 1 }
      );
    
      const tx = await LsETHContract.requestRedeem(value, FIREBLOCKS_ADDRESS, {
        gasLimit: redeem_estimation,
      });
    
      let receipt = await tx.wait();
      console.log(receipt);
    };
    //createRedeemRequest();
    
    const resolveRedeemRequest = async () => {
      const provider = new ethers.providers.Web3Provider(eip1193Provider);
      const LsETHContract = new ethers.Contract(
        CONTRACT_ADDRESS,
        ABI,
        provider.getSigner()
      );
    
      const value = ethers.utils.parseEther('0.000001');
    
      const arrRequestId = [53];
    
      const resolveRedeem = await LsETHContract.resolveRedeemRequests(arrRequestId);
      console.log(resolveRedeem.toString());
    };
    //resolveRedeemRequest();
    
    const createClaimRedeemRequest = async () => {
      const provider = new ethers.providers.Web3Provider(eip1193Provider);
      const LsETHContract = new ethers.Contract(
        CONTRACT_ADDRESS,
        ABI,
        provider.getSigner()
      );
    
      const arrRequestId = [53];
      const arrWithdrawalId = [111];
    
      const claim_estimation = await LsETHContract.estimateGas.claimRedeemRequests(
        arrRequestId,
        arrWithdrawalId,
        { gasLimit: 1 }
      );
      const claimRedeemRequests = await LsETHContract.claimRedeemRequests(
        arrRequestId,
        arrWithdrawalId,
        { gasLimit: claim_estimation }
      );
      const receipt = await claimRedeemRequests.wait();
      console.log(claimRedeemRequests);
    };
    //createClaimRedeemRequest();
    Fireblocks Javascript Guidearrow-up-right
    the Fireblocks websitearrow-up-right
    staking guidearrow-up-right
    Fireblocks documentationarrow-up-right
    herearrow-up-right
    herearrow-up-right
    Liquid Collective's redemption documentationarrow-up-right
    requestRedeemarrow-up-right
    herearrow-up-right
    resolveRedeemRequestarrow-up-right
    Alluvial APIarrow-up-right
    herearrow-up-right
    herearrow-up-right
    Architecture

    Staking

    hashtag
    Goals

    This guide shows you how to Stake ETH using the Liquid Collective Protocol and receive LsETH in return.

    By the end of this guide you will:

    • Have an understanding of the Liquid Collective protocol

    • Stake ETH

    hashtag
    Pre-read

    Review the for the Alluvial API.

    hashtag
    Dependencies

    • : You will use Ether.js, a popular library for interacting with Smart Contracts to query blockchain information and send transactions.

    • Application Binary Interface (ABI): The ABI for the River smart contract will be used to READ /WRITE to the contract.

    • Hoodi ETH: You will be accessing the Hoodi testnet, ensure you have a wallet with HoodiETH.

    After reading both guides, come back to continue the implementation of the staking workflow.

    hashtag
    Implementation

    hashtag
    Import libraries

    In the backend (Node.js) application you will need to import one library.

    app.js

    circle-info

    Full code implementation can be see in Appendix, at bottom of the guide.

    Next, add information about the RPC node Provider being used. This example uses this example you are using , but there are several options for platforms to host an RPC node.

    hashtag
    Staking transaction

    You can now create the transaction object. In the example below, you are transferring 0.0000001 from address 0xbe79ff177a8F6a0D9656cF47D8687f43666a4d1e to the River address.

    circle-exclamation

    Gas Limit uses a built in Ethers.js function. You may need to manually adjust when network has high demand. The code uses the estimateGas function.

    Great job! You have successfully staked ETH. You can use the transaction hash returned to view more details.

    Congratulations! You've now staked ETH, received LsETH, and retrieved your balance. As a next step, review the guide on how to implement .

    hashtag
    Appendix

    hashtag
    Full Code

    Full code for making deposit transaction

    triangle-exclamation

    Code is meant for testing purposes and should not be used directly for production workloads.

    Authentication Guidearrow-up-right
    Ethers.jsarrow-up-right
    Chainstackarrow-up-right
    redemptionsarrow-up-right
    const { ethers } = require('ethers');
    const Contract = require('./Contract.json');
    (async () => {
      const nodeUrl = 'https://ethereum-hoodi-rpc.publicnode.com';
      const provider = new ethers.providers.JsonRpcProvider(nodeUrl);
    
      const gasPrice = await provider.getGasPrice();
    
      const signer = new ethers.Wallet('<INSERT WALLET KEY>', provider);
    
      const LsETHContract = new ethers.Contract(
        Contract.address,
        Contract.abi,
        signer
      );
    
      const walletAddress = '<INSERT WALLET ADDRESS>';
    })();
    // Get estimate for gas limit
    const deposit_estimation = await LsETHContract.estimateGas.deposit({
      from: walletAddress,
      value: ethers.utils.parseUnits('0.00000001', 'ether'),
      gasLimit: ethers.utils.hexlify(1),
      nonce: provider.getTransactionCount(walletAddress, 'latest'),
    });
    
    // Deposit tx
    let tx = await LsETHContract.deposit({
      from: walletAddress,
      value: ethers.utils.parseUnits('0.00000001', 'ether'),
      gasPrice: gasPrice,
      gasLimit: deposit_estimation,
      nonce: provider.getTransactionCount(walletAddress, 'latest'),
    });
    let receipt = await tx.wait();
    console.log(receipt);
    index.js
    const { ethers } = require('ethers');
    const Contract = require('./Contract.json');
    const walletAddress = '0xbe79ff177a8F6a0D9656cF47D8687f43666a4d1e'(async () => {
      const nodeUrl = 'https://ethereum-hoodi-rpc.publicnode.com';
      const provider = new ethers.providers.JsonRpcProvider(nodeUrl);
    
      const gasPrice = await provider.getGasPrice();
    
      const signer = new ethers.Wallet('<INSERT WALLET KEY>', provider);
    
      const LsETHContract = new ethers.Contract(
        Contract.address,
        Contract.abi,
        signer
      );
    
      const walletAddress = '<INSERT WALLET ADDRESS>';
    
      const value = ethers.utils.parseEther('0.000000000001');
    
      const deposit_estimation = await LsETHContract.estimateGas.deposit({
        from: walletAddress,
        value: ethers.utils.parseUnits('0.00000001', 'ether'),
        gasLimit: ethers.utils.hexlify(1),
        nonce: provider.getTransactionCount(walletAddress, 'latest'),
      });
    
      let tx = await LsETHContract.deposit({
        from: walletAddress,
        value: ethers.utils.parseUnits('0.00000001', 'ether'),
        gasPrice: gasPrice,
        gasLimit: deposit_estimation,
        nonce: provider.getTransactionCount(walletAddress, 'latest'),
      });
      let receipt = await tx.wait();
      console.log(receipt);
    })();
    Contract.json
    {
      "address": "0x1d8b30cC38Dba8aBce1ac29Ea27d9cFd05379A09",
      "abi": [
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_from",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_operator",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_allowance",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "_value",
              "type": "uint256"
            }
          ],
          "name": "AllowanceTooLow",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "BalanceTooLow",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "account",
              "type": "address"
            }
          ],
          "name": "Denied",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "EmptyDeposit",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "ErrorOnDeposit",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InconsistentPublicKeys",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InconsistentSignatures",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidArgument",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidCall",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "currentValidatorsExitedBalance",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "newValidatorsExitedBalance",
              "type": "uint256"
            }
          ],
          "name": "InvalidDecreasingValidatorsExitedBalance",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "currentValidatorsSkimmedBalance",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "newValidatorsSkimmedBalance",
              "type": "uint256"
            }
          ],
          "name": "InvalidDecreasingValidatorsSkimmedBalance",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidEmptyString",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "epoch",
              "type": "uint256"
            }
          ],
          "name": "InvalidEpoch",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidFee",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "version",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "expectedVersion",
              "type": "uint256"
            }
          ],
          "name": "InvalidInitialization",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidPublicKeyCount",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "requested",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "received",
              "type": "uint256"
            }
          ],
          "name": "InvalidPulledClFundsAmount",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidSignatureCount",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "providedValidatorCount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "depositedValidatorCount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lastReportedValidatorCount",
              "type": "uint256"
            }
          ],
          "name": "InvalidValidatorCountReport",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidWithdrawalCredentials",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidZeroAddress",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "NoAvailableValidatorKeys",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "NotEnoughFunds",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "NullTransfer",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "SliceOutOfBounds",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "SliceOverflow",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "prevTotalEthIncludingExited",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "postTotalEthIncludingExited",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "timeElapsed",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "relativeLowerBound",
              "type": "uint256"
            }
          ],
          "name": "TotalValidatorBalanceDecreaseOutOfBound",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "prevTotalEthIncludingExited",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "postTotalEthIncludingExited",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "timeElapsed",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "annualAprUpperBound",
              "type": "uint256"
            }
          ],
          "name": "TotalValidatorBalanceIncreaseOutOfBound",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "caller",
              "type": "address"
            }
          ],
          "name": "Unauthorized",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_from",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_to",
              "type": "address"
            }
          ],
          "name": "UnauthorizedTransfer",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "ZeroMintedShares",
          "type": "error"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "owner",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "spender",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "Approval",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "validatorCount",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "validatorTotalBalance",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "bytes32",
              "name": "roundId",
              "type": "bytes32"
            }
          ],
          "name": "ConsensusLayerDataUpdate",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "version",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "bytes",
              "name": "cdata",
              "type": "bytes"
            }
          ],
          "name": "Initialize",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "epoch",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsSkimmedBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsExitedBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsExitingBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint32",
                  "name": "validatorsCount",
                  "type": "uint32"
                },
                {
                  "internalType": "uint32[]",
                  "name": "stoppedValidatorCountPerOperator",
                  "type": "uint32[]"
                },
                {
                  "internalType": "bool",
                  "name": "rebalanceDepositToRedeemMode",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "slashingContainmentMode",
                  "type": "bool"
                }
              ],
              "indexed": false,
              "internalType": "struct IOracleManagerV1.ConsensusLayerReport",
              "name": "report",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "rewards",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "pulledELFees",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "pulledRedeemManagerExceedingEthBuffer",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "pulledCoverageFunds",
                  "type": "uint256"
                }
              ],
              "indexed": false,
              "internalType": "struct IOracleManagerV1.ConsensusLayerDataReportingTrace",
              "name": "trace",
              "type": "tuple"
            }
          ],
          "name": "ProcessedConsensusLayerReport",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "pulledSkimmedEthAmount",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "pullExitedEthAmount",
              "type": "uint256"
            }
          ],
          "name": "PulledCLFunds",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "name": "PulledCoverageFunds",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "name": "PulledELFees",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "name": "PulledRedeemManagerExceedingEth",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "redeemManagerDemand",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "suppliedRedeemManagerDemand",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "suppliedRedeemManagerDemandInEth",
              "type": "uint256"
            }
          ],
          "name": "ReportedRedeemManager",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "_collector",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "_oldTotalUnderlyingBalance",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "_oldTotalSupply",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "_newTotalUnderlyingBalance",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "_newTotalSupply",
              "type": "uint256"
            }
          ],
          "name": "RewardsEarned",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "admin",
              "type": "address"
            }
          ],
          "name": "SetAdmin",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "allowlist",
              "type": "address"
            }
          ],
          "name": "SetAllowlist",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "oldAmount",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "newAmount",
              "type": "uint256"
            }
          ],
          "name": "SetBalanceCommittedToDeposit",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "oldAmount",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "newAmount",
              "type": "uint256"
            }
          ],
          "name": "SetBalanceToDeposit",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "oldAmount",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "newAmount",
              "type": "uint256"
            }
          ],
          "name": "SetBalanceToRedeem",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "annualAprUpperBound",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "relativeLowerBound",
              "type": "uint256"
            }
          ],
          "name": "SetBounds",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "collector",
              "type": "address"
            }
          ],
          "name": "SetCollector",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "coverageFund",
              "type": "address"
            }
          ],
          "name": "SetCoverageFund",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "depositContract",
              "type": "address"
            }
          ],
          "name": "SetDepositContractAddress",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "oldDepositedValidatorCount",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "newDepositedValidatorCount",
              "type": "uint256"
            }
          ],
          "name": "SetDepositedValidatorCount",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "elFeeRecipient",
              "type": "address"
            }
          ],
          "name": "SetELFeeRecipient",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            }
          ],
          "name": "SetGlobalFee",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "minNetAmount",
              "type": "uint256"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "maxRelativeAmount",
              "type": "uint256"
            }
          ],
          "name": "SetMaxDailyCommittableAmounts",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "string",
              "name": "metadataURI",
              "type": "string"
            }
          ],
          "name": "SetMetadataURI",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "operatorRegistry",
              "type": "address"
            }
          ],
          "name": "SetOperatorsRegistry",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "oracleAddress",
              "type": "address"
            }
          ],
          "name": "SetOracle",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "pendingAdmin",
              "type": "address"
            }
          ],
          "name": "SetPendingAdmin",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "address",
              "name": "redeemManager",
              "type": "address"
            }
          ],
          "name": "SetRedeemManager",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint64",
              "name": "epochsPerFrame",
              "type": "uint64"
            },
            {
              "indexed": false,
              "internalType": "uint64",
              "name": "slotsPerEpoch",
              "type": "uint64"
            },
            {
              "indexed": false,
              "internalType": "uint64",
              "name": "secondsPerSlot",
              "type": "uint64"
            },
            {
              "indexed": false,
              "internalType": "uint64",
              "name": "genesisTime",
              "type": "uint64"
            },
            {
              "indexed": false,
              "internalType": "uint64",
              "name": "epochsToAssumedFinality",
              "type": "uint64"
            }
          ],
          "name": "SetSpec",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "totalSupply",
              "type": "uint256"
            }
          ],
          "name": "SetTotalSupply",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": false,
              "internalType": "bytes32",
              "name": "withdrawalCredentials",
              "type": "bytes32"
            }
          ],
          "name": "SetWithdrawalCredentials",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "Transfer",
          "type": "event"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "depositor",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "name": "UserDeposit",
          "type": "event"
        },
        {
          "stateMutability": "payable",
          "type": "fallback"
        },
        {
          "inputs": [],
          "name": "DEPOSIT_SIZE",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "PUBLIC_KEY_LENGTH",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "SIGNATURE_LENGTH",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "_DEPOSIT_SIZE",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "acceptAdmin",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_spender",
              "type": "address"
            }
          ],
          "name": "allowance",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_spender",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_value",
              "type": "uint256"
            }
          ],
          "name": "approve",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            }
          ],
          "name": "balanceOf",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            }
          ],
          "name": "balanceOfUnderlying",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "uint32[]",
              "name": "_redeemRequestIds",
              "type": "uint32[]"
            },
            {
              "internalType": "uint32[]",
              "name": "_withdrawalEventIds",
              "type": "uint32[]"
            }
          ],
          "name": "claimRedeemRequests",
          "outputs": [
            {
              "internalType": "uint8[]",
              "name": "claimStatuses",
              "type": "uint8[]"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "decimals",
          "outputs": [
            {
              "internalType": "uint8",
              "name": "",
              "type": "uint8"
            }
          ],
          "stateMutability": "pure",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_spender",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_subtractableValue",
              "type": "uint256"
            }
          ],
          "name": "decreaseAllowance",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "deposit",
          "outputs": [],
          "stateMutability": "payable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_recipient",
              "type": "address"
            }
          ],
          "name": "depositAndTransfer",
          "outputs": [],
          "stateMutability": "payable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "_maxCount",
              "type": "uint256"
            }
          ],
          "name": "depositToConsensusLayer",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getAdmin",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getAllowlist",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getBalanceToDeposit",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getBalanceToRedeem",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getCLSpec",
          "outputs": [
            {
              "components": [
                {
                  "internalType": "uint64",
                  "name": "epochsPerFrame",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "slotsPerEpoch",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "secondsPerSlot",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "genesisTime",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "epochsToAssumedFinality",
                  "type": "uint64"
                }
              ],
              "internalType": "struct CLSpec.CLSpecStruct",
              "name": "",
              "type": "tuple"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getCLValidatorCount",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getCLValidatorTotalBalance",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getCollector",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getCommittedBalance",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getCoverageFund",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getCurrentEpochId",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getCurrentFrame",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "_startEpochId",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "_startTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "_endTime",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getDailyCommittableLimits",
          "outputs": [
            {
              "components": [
                {
                  "internalType": "uint128",
                  "name": "minDailyNetCommittableAmount",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "maxDailyRelativeCommittableAmount",
                  "type": "uint128"
                }
              ],
              "internalType": "struct DailyCommittableLimits.DailyCommittableLimitsStruct",
              "name": "",
              "type": "tuple"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getDepositedValidatorCount",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getELFeeRecipient",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getExpectedEpochId",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "_epochId",
              "type": "uint256"
            }
          ],
          "name": "getFrameFirstEpochId",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getGlobalFee",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getLastCompletedEpochId",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getLastConsensusLayerReport",
          "outputs": [
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "epoch",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsSkimmedBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsExitedBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsExitingBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint32",
                  "name": "validatorsCount",
                  "type": "uint32"
                },
                {
                  "internalType": "bool",
                  "name": "rebalanceDepositToRedeemMode",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "slashingContainmentMode",
                  "type": "bool"
                }
              ],
              "internalType": "struct IOracleManagerV1.StoredConsensusLayerReport",
              "name": "",
              "type": "tuple"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getMetadataURI",
          "outputs": [
            {
              "internalType": "string",
              "name": "",
              "type": "string"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getOperatorsRegistry",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getOracle",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getPendingAdmin",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getRedeemManager",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getReportBounds",
          "outputs": [
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "annualAprUpperBound",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "relativeLowerBound",
                  "type": "uint256"
                }
              ],
              "internalType": "struct ReportBounds.ReportBoundsStruct",
              "name": "",
              "type": "tuple"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getTime",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "getWithdrawalCredentials",
          "outputs": [
            {
              "internalType": "bytes32",
              "name": "",
              "type": "bytes32"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_spender",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_additionalValue",
              "type": "uint256"
            }
          ],
          "name": "increaseAllowance",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_depositContractAddress",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_elFeeRecipientAddress",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "_withdrawalCredentials",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "_oracleAddress",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_systemAdministratorAddress",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_allowlistAddress",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_operatorRegistryAddress",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_collectorAddress",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_globalFee",
              "type": "uint256"
            }
          ],
          "name": "initRiverV1",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_redeemManager",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "_epochsPerFrame",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "_slotsPerEpoch",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "_secondsPerSlot",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "_genesisTime",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "_epochsToAssumedFinality",
              "type": "uint64"
            },
            {
              "internalType": "uint256",
              "name": "_annualAprUpperBound",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "_relativeLowerBound",
              "type": "uint256"
            },
            {
              "internalType": "uint128",
              "name": "_minDailyNetCommittableAmount_",
              "type": "uint128"
            },
            {
              "internalType": "uint128",
              "name": "_maxDailyRelativeCommittableAmount_",
              "type": "uint128"
            }
          ],
          "name": "initRiverV1_1",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "initRiverV1_2",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "_epoch",
              "type": "uint256"
            }
          ],
          "name": "isValidEpoch",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "name",
          "outputs": [
            {
              "internalType": "string",
              "name": "",
              "type": "string"
            }
          ],
          "stateMutability": "pure",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_newAdmin",
              "type": "address"
            }
          ],
          "name": "proposeAdmin",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "_lsETHAmount",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "_recipient",
              "type": "address"
            }
          ],
          "name": "requestRedeem",
          "outputs": [
            {
              "internalType": "uint32",
              "name": "_redeemRequestId",
              "type": "uint32"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "uint32[]",
              "name": "_redeemRequestIds",
              "type": "uint32[]"
            }
          ],
          "name": "resolveRedeemRequests",
          "outputs": [
            {
              "internalType": "int64[]",
              "name": "withdrawalEventIds",
              "type": "int64[]"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "sendCLFunds",
          "outputs": [],
          "stateMutability": "payable",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "sendCoverageFunds",
          "outputs": [],
          "stateMutability": "payable",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "sendELFees",
          "outputs": [],
          "stateMutability": "payable",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "sendRedeemManagerExceedingFunds",
          "outputs": [],
          "stateMutability": "payable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_newAllowlist",
              "type": "address"
            }
          ],
          "name": "setAllowlist",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "components": [
                {
                  "internalType": "uint64",
                  "name": "epochsPerFrame",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "slotsPerEpoch",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "secondsPerSlot",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "genesisTime",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "epochsToAssumedFinality",
                  "type": "uint64"
                }
              ],
              "internalType": "struct CLSpec.CLSpecStruct",
              "name": "_newValue",
              "type": "tuple"
            }
          ],
          "name": "setCLSpec",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_newCollector",
              "type": "address"
            }
          ],
          "name": "setCollector",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "epoch",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsSkimmedBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsExitedBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "validatorsExitingBalance",
                  "type": "uint256"
                },
                {
                  "internalType": "uint32",
                  "name": "validatorsCount",
                  "type": "uint32"
                },
                {
                  "internalType": "uint32[]",
                  "name": "stoppedValidatorCountPerOperator",
                  "type": "uint32[]"
                },
                {
                  "internalType": "bool",
                  "name": "rebalanceDepositToRedeemMode",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "slashingContainmentMode",
                  "type": "bool"
                }
              ],
              "internalType": "struct IOracleManagerV1.ConsensusLayerReport",
              "name": "_report",
              "type": "tuple"
            }
          ],
          "name": "setConsensusLayerData",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_newCoverageFund",
              "type": "address"
            }
          ],
          "name": "setCoverageFund",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "components": [
                {
                  "internalType": "uint128",
                  "name": "minDailyNetCommittableAmount",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "maxDailyRelativeCommittableAmount",
                  "type": "uint128"
                }
              ],
              "internalType": "struct DailyCommittableLimits.DailyCommittableLimitsStruct",
              "name": "_dcl",
              "type": "tuple"
            }
          ],
          "name": "setDailyCommittableLimits",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_newELFeeRecipient",
              "type": "address"
            }
          ],
          "name": "setELFeeRecipient",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "_newFee",
              "type": "uint256"
            }
          ],
          "name": "setGlobalFee",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "string",
              "name": "_metadataURI",
              "type": "string"
            }
          ],
          "name": "setMetadataURI",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_oracleAddress",
              "type": "address"
            }
          ],
          "name": "setOracle",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "annualAprUpperBound",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "relativeLowerBound",
                  "type": "uint256"
                }
              ],
              "internalType": "struct ReportBounds.ReportBoundsStruct",
              "name": "_newValue",
              "type": "tuple"
            }
          ],
          "name": "setReportBounds",
          "outputs": [],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "_underlyingAssetAmount",
              "type": "uint256"
            }
          ],
          "name": "sharesFromUnderlyingBalance",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "symbol",
          "outputs": [
            {
              "internalType": "string",
              "name": "",
              "type": "string"
            }
          ],
          "stateMutability": "pure",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "totalSupply",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [],
          "name": "totalUnderlyingSupply",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_to",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_value",
              "type": "uint256"
            }
          ],
          "name": "transfer",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_from",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_to",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_value",
              "type": "uint256"
            }
          ],
          "name": "transferFrom",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "_shares",
              "type": "uint256"
            }
          ],
          "name": "underlyingBalanceFromShares",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "stateMutability": "payable",
          "type": "receive"
        }
      ]
    }