Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 176 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

Live

Loading...

Overview

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Tokenomics

Loading...

Loading...

Loading...

Node Operations

Loading...

Loading...

Oracles

Loading...

Loading...

Platforms

Loading...

Technical Reference

Loading...

Smart Contracts

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Components

Loading...

Loading...

Loading...

Loading...

Loading...

Interfaces

Loading...

Loading...

Loading...

Loading...

IRedeemManagerV1

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Libraries

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

State

OperatorsRegistry

Loading...

Loading...

Loading...

Loading...

AllowList

Loading...

Loading...

Loading...

Oracle

Loading...

Loading...

Loading...

Loading...

Loading...

RedeemManager

Loading...

Loading...

Loading...

Loading...

River

Loading...

BalanceToDeposit

BalanceToRedeem

Loading...

Loading...

Slashing Coverage

Three layers of slashing coverage are available for every participant staking through the Liquid Collective protocol

Slashing Coverage Program Summary: 3 layers of coverage

1. Nexus Mutual Coverage

2. Slashing Coverage Treasury

Liquid Collective’s Slashing Coverage Treasury allocates a percentage of all network rewards to provide coverage for slashing coverage deductibles on network-wide slashing incidents. The Treasury continues to accrue network rewards unless deployed.

3. Node Operator Commitment

Node operators supporting Liquid Collective's active set provide coverage for deductibles, up to a cap, against slashing incidents and missed rewards incurred due to the fault of their infrastructure.

Slashing Coverage Fund

The Slashing Coverage Fund is in charge of injecting coverage funds into the system. In the case of a slashing event on one of the validators of the system, the Slashing Coverage Fund can be supplied with ETH to be used to repay slashing losses. When funds are sent to the Slashing Coverage Fund, the system will attempt to pull everything until the fund is empty.

The amount pulled is always capped by the reporting upper bound, just like the execution layer fees. This means that the supplied ETH will probably be injected in the system in multiple oracle report rounds.

Slashing Coverage Fund Contract

Fund Supply

Funds are supplied to the Slashing Coverage Fund contract when a qualified slashing event has occurred.

Partners assigned with a deductible can reimburse by posting the deductible (in ETH) to Liquid Collective's CoverageFund smart contract. ETH in the CoverageFund contract are periodically pulled into the system, accounted into the Conversion Rate, and eventually introduced into the staking flow.

Liquid Collective's CoverageFund contract is designed to only accept ETH from allowlisted accounts with a specific DONATOR permission.

When pulling funds from the CoverageFund contract the system does not mint any new LsETH and so the operation results in a replacement of any shortfalls that may have occurred from a slashing event, which applies to every LsETH holder.

Fund Distribution

  • No fees are taken on the received funds

  • The funds are entirely distributed to LsETH holders

  • No new LsETH are minted

  • Funds are distributed by increasing the Conversion Rate of LsETH

Funds from the CoverageFund contract are pulled into the system upon successful Oracle reports after Execution Layer fees have been pulled and rewards have been accounted, so no fee is charged on the cover funds pulled.

The amount pulled from the CoverageFund contract respects the Conversion Rate's variation bounds, so a slashing reimbursement cannot disrupt the Conversion Rate. On every Oracle report the system accounts for network rewards (CL + EL) then collects the gross fee, then attempts to pull funds from the CoverageFund contract up to the authorized maximum to remain within Conversion Rate's variation bounds.

In other words, if ETH is available in the contract, River will attempt to pull as much ETH as possible, up to the upper bound allowed by the Oracle contract. This smoothing mechanism means that it may take multiple Oracle cycles for Slashing Coverage Funds to be pulled entirely into the system, ensuring a gradual variation of the Conversion Rate.

Architecture

Liquid Collective's protocol architecture on Ethereum

Smart Contracts

River

River is the core smart contract in the protocol. River manages:

  • LsETH Token

  • User Deposits: River allows users to perform ETH deposits and receive receipt tokens (mint LsETH) in return.

Oracle

The Oracle contract is responsible for feeding the River contract with the balance position of the validator nodes on the consensus layer. It relies on a set of Oracle Operators that periodically report data from the consensus layer to the execution layer; it is currently configured to report every 24 hours.

The Oracle contract helps synchronize a quorum of Oracle Operators to report the same consensus layer data. In particular, the Oracle contract makes sure that the core River contract receives data only after the Oracle contract has received identical reports from a quorum of Oracle Operators.

Node Operators Registry

The Node Operators Registry:

  • Manages Node Operators that have been approved to receive ETH delegation

  • Enables Node Operators to register validators

  • Selects the next validators to receive delegation, attempting even distribution so all Node Operators get a fair delegation

Allowlist

The Allowlist contract manages the permissions of who can deposit to the protocol. The protocol requires participants to use an allowlisted wallet to deposit ETH and redeem LsETH.

ELFeeRecipient

The ELFeeRecipient contract is the contract that receives execution layer fees, including priority fees and MEV network rewards.

Withdraw

The Withdraw contract is the contract that perceives withdrawn funds resulting from both validator’s full and partial exits. All Liquid Collective validator keys have their withdrawal credentials set to the address of the Withdraw contract. Withdrawn funds are automatically pushed to the Withdraw contract by design of the Ethereum protocol. Funds on the Withdraw contract are periodically pulled by River contract on every Oracle report.

Upgradeability

The Liquid Collective protocol smart contract was upgraded to enable LsETH redemptions in May of 2023. Liquid Collective upgradability relies on the upgradeable proxy pattern enabling any functional upgrade to the smart contracts.

  • In its current form, the River smart contract always sets the validator withdrawal credentials to the address of the Liquid Collective Withdraw contract, which is an upgradeable proxy Smart Contract.

  • Upgradability of both contracts is governed in a decentralized fashion by the protocol's administrators through the Liquid Collective DAO.

Queues, stacks, and buffers

Redemption Queue

The Liquid Collective protocol’s Redemption Queue facilitates the satisfaction of redemption requests in the same order as they have been requested. The first-in-first-out Redemption Queue is intended to protect against a race for claims in the event of high withdrawal demand.

Redemption Buffer

The Liquid Collective protocol’s Redemption Buffer holds ETH that is pending to be supplied for redemption satisfactions.

Withdrawal Stack

The Liquid Collective protocol’s Withdrawal Stack automatically facilitates the movement of ETH to the protocol’s Redemption Buffer. This ETH may be sourced by validator exits from the consensus layer or rebalanced from the protocol’s Deposit Buffer.

Deposit Buffer

The Liquid Collective protocol’s Deposit Buffer holds ETH pending to be deposited to Ethereum’s consensus layer, or that can be rebalanced to the Withdrawal Stack to programmatically facilitate redemption satisfactions. This ETH may be sourced from user deposits, network rewards (consensus layer & execution layer), the protocol’s Slashing Coverage Program, or rebalanced from the protocol’s Withdrawal Stack.

Staking Amounts

Users can deposit and stake any amount of ETH

Liquid Collective allows users to deposit and stake any amount of ETH, not just 32 ETH (the minimum required to operate a full validator). Deposited ETH are gathered into an ETH smart contract account as fungible bulk. ETH in the account are regularly delegated to validators in a round-robin manner as the account reaches a balance of 32 ETH.

Self-custody

The Liquid Collective protocol is non-custodial. Deposited ETH is sent by the protocol to the Ethereum deposit contract. LsETH is also self-custodied, so LsETH holders have complete control over their LsETH and can pick any preferred custody solution.

Roles & Staking Infrastructure

The roles in Liquid Collective's Ethereum implementation, and staking infrastructure overview.

Key roles in Liquid Collective

Platforms

Platforms provide a seamless on-ramp and access for users to interact with the Liquid Collective protocol. There are two types of Liquid Collective Platforms. Platforms either enable minting and redemption of LsETH, or enable secondary interactions.

Wallet and Custody Providers

Wallet Providers and Custody Providers offer LsETH token storage and signing infrastructure. Wallet and Custody Providers enable Platforms to easily access and distribute LsETH to their users through custody and/or embedded minting services. In some cases, these Providers and Platforms are the same entities.

Service Providers

Service Providers provide development, consulting, attestation, legal, or technological services to the Liquid Collective. Liquid Collective seeks to collaborate with existing web3 teams in the development of the protocol’s liquid staking offering.

Node Operators

Node Operators run the Ethereum validator infrastructure on Liquid Collective, registering validator keys with the protocol, performing validation duties, and earning network rewards for doing so. Liquid Collective does not run validator infrastructure, but instead delegates that critical task to proven Node Operators that meet high performance standards.

Oracle Operators

Infrastructure providers, operating a daemon app to report Ethereum consensus layer data to the Liquid Collective protocol. This data is necessary so the Liquid Collective protocol can account for the network rewards earned by validators.

Liquid Collective's Ethereum staking infrastructure

Liquid Collective is designed to provide a secure and enterprise-grade liquid staking solution which necessitates sanctions checks on the protocol’s active validator set. Liquid Collective Node Operators must meet certain protocol performance and compliance requirements, and have the capacity to scale to a large number of validator nodes.

Liquid Collective works only with security-focused Node Operators that institute best practices to generate network rewards, including:

  • operating multi-region, multi-client infrastructure

  • offering technical support teams

  • maintaining security posturing (including double-sign protection)

To reduce the risk impact of validator operations, and to increase decentralization, Liquid Collective delegates tokens to multiple independent validator Node Operators. The staked tokens are distributed across Node Operators in a round-robin manner so that the Liquid Collective protocol is supported by a broad and dispersed active validator set. As a result, the risk is distributed, which should minimize staked ETH exposure to any one operator.

ETH Liquid Staking Documentation

This documentation is specific to Liquid Collective's Ethereum liquid staking protocol and its ETH liquid staking token, Liquid Staked ETH (LsETH).

ETH liquid staking with Liquid Collective

Liquid staking enables participants to contribute to the security and decentralization of proof of stake networks, while providing increased liquidity and capital efficiency.

Read on for Liquid Collective's ETH liquid staking protocol documentation.

LsETH (cToken)

Liquid Staked ETH, Liquid Collective's liquid staking token

LsETH User Agreement

The LsETH User Agreement is a legal agreement that outlines the terms and conditions of using the Liquid Collective protocol and holding LsETH. It contains important information about the protocol's token specifications and ownership characteristics, protocol service fees, slashing and slashing coverage, AML/KYC compliance, and risks associated with staking on Ethereum via the Liquid Collective protocol.

Each unit of LsETH is designed to serve as an electronic document of title to a corresponding amount of fungible ETH within the protocol. The LsETH User Agreement provides that LsETH is a cryptographic receipt that evidences legal and beneficial ownership of a corresponding amount of ETH, which is subject to increase as a result of the accrual of Ethereum network rewards.

cToken

Because of the cToken design, LsETH's Conversion Rate may fluctuate. Depositors in the cToken model do not receive more or less tokens as their staked tokens accrue network rewards or penalties. Instead, the conversion rate for each cToken owned by the depositor will increase or decrease (i.e, the LsETH will evidence legal and beneficial ownership of more or less ETH) in an amount that reflects accrued network rewards or penalties. This is in contrast to other token models, such as aTokens, which issue new net network reward tokens on a unit basis.

Conversion Rate

The internal Conversion Rate is the rate at which Liquid Collective redeems LsETH from/to ETH on deposits and redemptions. In other words, the Conversion Rate is the amount of ETH for which LsETH can be redeemed. The Conversion Rate is independent of the price at which ETH or LsETH may trade on the open market.

The value of LsETH is bound to this internal Conversion Rate which fluctuates over time according to the network rewards earned by the validators. The Conversion Rate is computed as the total balance of staked ETH over the total supply of LsETH. If accrued network rewards are greater than penalties and fees, the internal Conversion Rate will increase to reflect the net network rewards collected by the protocol.

The Conversion Rate is updated every 24 hours at Oracle Report Time, which is when Liquid Collective accounts for network rewards earned.

Formula

At first deposit, the conversionRate is set to 1.

What can you do with LsETH?

  • Hold LsETH and accrue network rewards

  • Exchange LsETH for another token

  • Use LsETH as collateral to participate in a wide range of DeFi and dapp activities

What are the tax implications?

DISCLAIMER: This information is intended for informational purposes only and is not, and shall not be construed, to be any form of tax advice. All liquid staking participants are strongly encouraged to consult with their tax advisers to fully understand the tax implications of staking and liquid staking.

While the status of liquid staking activities under the Internal Revenue Code of 1986, as amended, remains uncertain, certain market views have developed around the U.S. tax consequences of liquid staking, including the following:

  • Depositing ETH and receiving LsETH may not be deemed a taxable event. Unlike a traditional token exchange (e.g., trading ETH for another token), depositing ETH may not be a token exchange because LsETH is a receipt token that evidences legal and beneficial ownership of the deposited ETH.

  • Additionally, because LsETH is based on the cToken model, the accrual of network rewards may not be deemed taxable events, especially when compared to the unit incremental basis in aToken models (or standard staking) for the accrual of network rewards.

Deposits & Redemptions

Staking ETH to mint LsETH, and redeeming LsETH for ETH, on Liquid Collective

Liquid Collective users can deposit ETH to stake on Ethereum. Users can also redeem LsETH for the underlying staked ETH plus network rewards earned, and minus any fees or penalties.

Deposit and Redemption Buffers

The Liquid Collective protocol automatically maintains ETH Deposit and Redemption Buffers. These buffers are designed to ensure that flows in and out of the protocol are managed efficiently between Ethereum’s execution and consensus layers, which enables seamless redemptions of LsETH for ETH via automatic rebalancing.

The protocol’s Deposit Buffer includes ETH pending to be deposited to Ethereum’s consensus layer, while the Redemption Buffer includes ETH pending to be supplied for redemptions.

  • ETH deposits enter the Deposit Buffer to be programmatically staked in Ethereum’s consensus layer

  • Ethereum execution layer fees received by Liquid Collective validators automatically enter the Deposit Buffer to be programmatically staked

  • Ethereum consensus layer network rewards received by Liquid Collective validators automatically enter the Deposit Buffer to be programmatically staked

  • Withdrawn validator consensus layer ETH from validator full exits, or slashed validator exits, automatically enter the Redemption Buffer to fund LsETH redemptions

Queues, stacks, and buffers

In addition to the Liquid Collective protocol’s Deposit and Redemption Buffers, the protocol’s Withdrawal Stack, along with Ethereum’s activation and exit queues, play an important role in deposits and redemptions on the Liquid Collective protocol.

Visualization of Withdrawal Stack, Redemption Queue, and Deposit and Redemption Buffers

Below is a step-by-step diagram showing how a request will flow through the protocol’s buffers and stacks.

Deposit ETH

When a user deposits ETH they receive the LsETH receipt token at the current Conversion Rate, which evidences legal and beneficial ownership of the staked token, plus network rewards received and minus any fees or penalties.

Deposited ETH automatically enters the Liquid Collective protocol’s Deposit Buffer. As ETH in the Deposit Buffer reaches a fungible bulk of 32 ETH it is programmatically staked, funding new validator keys and being pushed to Etheruem’s activation queue.

LsETH are minted on deposit, so depositing does not affect the Conversion Rate.

Example

Assuming

  • totalETHSupply = 125 ETH

  • totalLsETHSupply = 100 LsETH

So conversionRate = 125 / 100 = 1.25

A user deposits 10 ETH and receives 10 / 1.25 = 8 LsETH

And the new conversionRate = (125+10) / (100+8) = 1.25 remains unchanged

Note: Figures above are just examples and do not reflect reality or projections.

Interface level smart contract flow

For more technical audiences, a sequence diagram showing the interaction between smart contracts is included below:

Here is a sample transaction hash on mainnet: Deposit: 0xace4dc0272645d9e0120f25a478d1b7375cc42dd4b1c0369bd00d02847e54e25 Oracle Report: 0x67d44ab16ece7c2adcc97b538359f4c21fc10a09413d7014962c5dc5b79e4cb0

Redeem LsETH

The LsETH receipt token can be redeemed for ETH at the current Conversion Rate, to effectively withdraw the staked token plus network rewards received and minus any fees or penalties.

Redemption requests on the Liquid Collective protocol cannot be canceled once they have been made. This is because validator exits cannot be canceled on Ethereum once they have been triggered.

Three-stage redemption process

LsETH redemptions take place via a three-stage process performed programmatically by the Liquid Collective protocol:

  1. Request: the LsETH holder requests a redemption via a Platform (e.g. in the Coinbase Prime app), surrendering the amount of LsETH that they would like to redeem. This LsETH will eventually be burned.

  2. Satisfaction: after the protocol completes any required validator exits and the corresponding amount of ETH is withdrawn as according to the protocol Conversion Rate, the request is satisfied and can be claimed at any time.

  3. Claim: the redemption request is claimed, triggering the actual transfer of ETH to the redeemer.

Redemption architecture

When a LsETH holder requests a redemption the request is added to the protocol’s Redemption Queue. On each Oracle report, completed approximately every 24 hours, the protocol assesses the unsupplied ETH demand for redemptions.

When there is unsupplied ETH demand:

  • The Liquid Collective protocol programmatically rebalance's ETH between the deposit and Redemption Buffers to preserve capital efficiency by minimizing consensus layer operations. The protocol prioritizes moving ETH from the Deposit Buffer to the Redemption Buffer to satisfy the unsupplied redemption requests.

  • All Liquid Collective validator keys have their withdrawal credentials set to the address of Liquid Collective’s Withdraw contract, which is automatically pulled to the Redemption Buffer upon Oracle report. The withdrawn ETH is then used by the protocol to satisfy the unsupplied redemptions.

  1. A user decides they want to redeem their LsETH for ETH via the Liquid Collective protocol

  2. A user's redemption request is enqueued in the Redemption Queue pending satisfaction

  3. On each Oracle report, the Liquid Collective protocol evaluates pending LsETH redemption requests and programmatically pulls any ETH from the Deposit Buffer to the Redemption Buffer to satisfy the requests

    • If the balance in the Deposit Buffer is insufficient to satisfy all pending redemption requests the Liquid Collective protocol initiates the exit of a corresponding amount of ETH by programmatically requesting Node Operators to submit validator exits

  4. Any redemption request that has been satisfied by the Buffer can be immediately claimed by the user

  5. For redemption requests that require a validator exit to satisfy, the validator key enters Ethereum’s exit queue, waits the full network withdrawal time, and, once exited, the validator’s ETH balance is automatically sent by Ethereum to Liquid Collective’s withdrawal address

  6. On the Oracle report following the validator exit, the withdrawn ETH satisfies pending redemption requests

  7. The user can now claim their ETH

Most stakers can complete this process easily via their preferred Liquid Collective Platform (e.g. in the Coinbase Prime app). At the protocol level, at a high level this request process is executed via interacting with the LsETH contract interface.

  • To indicate whether the request has been satisfied, the redeem request id can be submitted along with calling the resolveRedeemRequests function to return withdrawal events corresponding to that redeem request id.

  • Once satisfied, the request can be claimed by calling ClaimRedeemRequests along with the redeem request id and corresponding withdrawal event id, which returns a list of claim statuses.

Interface level smart contract flow

For more technical audiences, a sequence diagram showing the interaction between smart contracts is included below:

Here is a sample transaction hash on mainnet: Request Redeem: 0x996bab264e831a12618c9e942b2d30a410c62db908c16efbd9fc5e44e30b1f5c Oracle Report: 0x67d44ab16ece7c2adcc97b538359f4c21fc10a09413d7014962c5dc5b79e4cb0

Redeem status matrix

Redemptions and the Conversion Rate

When users request to redeem LsETH, they will receive ETH based on the available ETH from exited validators or pending deposits, up to the user's LsETH balance multiplied by the protocol conversion rate at the time of the request. If pending deposits are insufficient to fulfill the redemption request, the protocol initiates validator exits to cover the redemption. At the time of the redemption request, the protocol assumes ownership of the user’s LsETH, and the user will no longer be eligible to receive future network rewards. Once validators have fully exited and their effective balance is available, the final ETH amount is determined by the proportion of LsETH being redeemed relative to the total ETH available to withdraw. This means the user remains exposed to penalties and slashing risks until the validators have fully exited.

Example

Assuming

  • totalETHSupply = 162 ETH

  • totalLsETHSupply = 108 LsETH

So conversionRate = 162 / 108 = 1.5

A user converts 8 LsETH and receives 8 * 1.5 = 12 ETH

And the new conversionRate = (162-12) / (108-8) = 1.5 remains unchanged

Note: Figures above are just examples and do not reflect reality or projections.

Interface level smart contract flow

For more technical audiences, a sequence diagram showing the interaction between smart contracts is included below:

Here is a sample transaction hash on mainnet: Request Redeem: 0xd8c39cf80d388c8ce55b519336b5f53074805156b5d416e96116c90dc73b2577 Oracle Report: 0x67d44ab16ece7c2adcc97b538359f4c21fc10a09413d7014962c5dc5b79e4cb0

Slashing Coverage enables certain Liquid Collective partners to reimburse LsETH holders following a slashing incident. Liquid Collective's Slashing Coverage Program is included in the ; as such, participation in the program requires no further action than holding LsETH.

includes three layers of coverage: Nexus Mutual Coverage, the Slashing Coverage Treasury, and the Node Operator Commitment. The program covers both network-wide events—such as network outages—and node operator failures.

You can find more details about Liquid Collective's Slashing Coverage Program in .

is the leading provider of decentralized crypto-native protection, having secured billions of dollars in value held in smart contracts. Nexus Mutual’s bespoke Slashing Coverage for Liquid Collective is fully scalable coverage that dynamically adjusts with the protocol's assets on platform (AoP) and provides access to Nexus Mutual's slashing coverage directly from a user's custody account at platforms such as Coinbase or Bitcoin Suisse.

The Slashing Coverage Fund contract enables the . The contract receives the funds to distribute for the slashing coverage, which are used to cover losses that may occur on the consensus layer due to slashing events. The contract acts as a temporary buffer for funds that can be pulled in case of a loss.

Computation and assignation of deductibles following a slashing incident are performed off-chain according to .

Consensus Layer Deposits: River orchestrates the delegation of ETH to validators and deposits to the official .

Each staker retains legal and beneficial ownership of an amount of ETH that is equivalent to the amount of ETH that was deposited by the staker, as evidenced by its . Receipt tokens like LsETH evidence legal and beneficial ownership of the deposited token, and ownership of the token is maintained throughout the life of the receipt token.

The teams building and operating Liquid Collective work together to ensure the smooth functioning of the protocol and provide a seamless and secure Ethereum staking experience. You can learn more about Liquid Collective's approach to working with these roles in our .

In the Liquid Collective protocol's Platforms are also referred to as Allowlisters, as Platforms that enable minting and redemption currently function as the agents responsible for adding users to the Allowlist.

You can learn more about Liquid Collective Platforms in the .

Examples of Liquid Collective Service Providers include , , , and Hypernative.

You can learn more about Liquid Collective Node Operators in the .

Oracles report to Liquid Collective's core contract on the balance of underlying staked tokens plus accrued staking rewards, minus any slashing penalties. This information informs for deposit and withdrawal (when supported, after withdrawals are enabled on Ethereum), alongside supporting DeFi reporting.

Node Operators in Liquid Collective's active set also support the protocol's by providing coverage for deductibles, up to a cap, against slashing incidents and missed rewards incurred due to the fault of their infrastructure.

You can find in-depth technical documentation on Liquid Collective's Ethereum validator infrastructure in .

is a decentralized liquid staking protocol. Multi-chain capable, Liquid Collective launched Ethereum liquid staking first and aims to implement liquid staking for other networks in the future.

For general Liquid Collective documentation, visit Liquid Collective's core documentation .

When a user deposits a token (ETH) into the Liquid Collective protocol, they receive a liquid staking token, that evidences legal and beneficial ownership of the staked ETH as well as any network rewards that accrue to the staked ETH, minus protocol service fees and network slashing penalties, if any. The receipt token can be transferred, stored, traded, and utilized in decentralized finance (DeFi) or supported decentralized apps (dapps).

LsETH is able to represent both staked ETH and any network rewards earned by following the , supporting LsETH's composability while providing participants with the ability to control their network reward flow

Liquid Collective offers to every participant via the to mitigate the risk of Node Operator failures and network outages

Liquid Collective's reduces correlation by spreading stake round-robin across a distributed network of Node Operators

All code deployed to mainnet has been

Liquid Collective is designed to provide users with protections over protocol access via know-your-customer (KYC) and anti-money-laundering (AML) verification with to facilitate compliance

LsETH is a fungible receipt token based on the Ethereum ERC-20 model. When a user deposits ETH to the Liquid Collective protocol, they receive an equivalent amount of LsETH that evidences their legal and beneficial ownership of the deposited ETH, as well as any network rewards that accrue to the ETH as a result of staking minus protocol service fees and network slashing penalties, if any.

Ethereum mainnet: Verify the . The LsETH contract address is: 0x8c1BEd5b9a0928467c9B1341Da1D7BD5e10b6549

Base L2: Verify the . The LsETH contract address is: 0xB29749498954A3A821ec37BdE86e386dF3cE30B6

By obtaining LsETH, participants agree to the terms of the , which remains in effect for as long as the participant holds LsETH.

To ensure open transparency into the agreement's terms, the LsETH User Agreement is additionally both encoded into the metadata of the LsETH smart contract and stored on-chain in IPFS .

You can learn more about the LsETH User Agreement and its innovations in our .

LsETH implements the , which uses a floating conversion rate—a.k.a. the protocol conversion rate—between a receipt token (e.g. LsETH) and the staked tokens to reflect the value of accrued network rewards, penalties, and fees associated with the staked tokens.

Note: Depending on the amount of ETH the protocol's Deposit Buffer, a validator may need to be exited from Ethereum to service a LsETH redemption request. When a validator is exited, it is subject to the Ethereum network's variable exit and withdrawal queues, which can take minutes to days. It's recommended to review the current maximum .

Funds from Liquid Collective’s Slashing Coverage Program enter the Deposit Buffer according to the to be programmatically staked

For those that want to view a stack trace, we recommend using a tool like .

If there is still unsupplied redemption demand, the protocol requests validator exits by signaling Node Operators. Upon receiving this request, the appropriate number of validators are entered to Ethereum’s exit queue, where they are subject to .

When a redemption request is submitted by calling the requestRedeem function, a redeem request id is returned by either using the or subscribing to RequestedRedeem events.

For those that want to view a stack trace, we recommend using a tool like .

Platforms can learn more about this process in the

For those that want to view a stack trace, we recommend using a tool like .

LsETH User Agreement
Liquid Collective's Slashing Coverage Program
this blog post
Nexus Mutual
Liquid Collective Slashing Coverage Program
Liquid Collective's Slashing Coverage Program
Ethereum deposit contract
LsETH receipt token
post
Ethereum architecture
Platform Operations documentation
Alluvial
Exiger
Rated
Node Operations documentation
Slashing Coverage Program
Node Operations Validator Infrastructure
Liquid Collective
here
Liquid Staked ETH (LsETH)
audited by leading security experts
permissioning
diversified Node Operator set
conversionRate=totalETHSupplytotalLsETHSupplyconversionRate = \frac{totalETHSupply}{totalLsETHSupply}conversionRate=totalLsETHSupplytotalETHSupply​
LsETH's Conversion Rate
ERC-20 cToken model
slashing coverage
LsETH User Agreement

Status Satisfaction

Status Claim

Meaning

PENDING_SATISFACTION

NOT_CLAIMED

Redeem is in process of being satisfied and cannot be claimed yet.

FULLY_SATISFIED

NOT_CLAIMED

Redeem request is fully satisfied thus can be claimed.

FULLY_SATISFIED

FULLY_CLAIMED

Redeem was fully claimed after getting fully satisfied. All funds have been sent to the recipient and redeem can not be claimed again.

PARTIALLY_SATISFIED

NOT_CLAIMED

Redeem request is partially satisfied and thus can be partially claimed and will require to claim again later on. User may decide to either a) claim now to receive part of the funds and proceed with other claim(s) later on, or b) wait for the request to be FULLY_SATISFIED so that only a single claim is required.

PENDING_SATISFACTION

PARTIALLY_CLAIMED

Request was partially claimed and is pending satisfaction for the remaining part. The request can not be claimed yet.

FULLY_SATISFIED

PARTIALLY_CLAIMED

Request was partially claimed and is now fully satisfied so can be claimed again to collect the remaining part.

PARTIALLY_SATISFIED

PARTIALLY_CLAIMED

Request was partially claimed and is now partially satisfied, thus can be partially claimed and will require another claim later.

Oracle Infrastructure

Oracle operations on Liquid Collective report on consensus layer data

Members

The Oracle holds a list of the Oracle Operators' members who are expected to periodically report Consensus Layer data. These addresses can be checked via an off-chain naive search request.

The Oracle contract is configured such that a representative subset of those Operators are required to report the same Consensus Layer (also referred to as Beacon Chain) data before the Oracle contract reports to the River contract.

Quorum Synchronization

The Oracle is set to report Consensus Layer data to the River contract at configurable Consensus Layer epochs. For each reporting epoch, the Oracle contract expects a quorum of Oracle Operators to report the identical Consensus Layer data before reporting to the River contract.

Epochs

The Oracle contract is configurable so data is reported from a starting epoch and then for every epoch at a given interval.

In the current deployment, this interval is configured so consensus layer data is reported approximately every 24 hours.

Quorum

The Oracle contract holds a configurable quorum value that indicates the minimum number of Oracle Operators that must report identical Consensus Layer data before reporting the data to the River contract.

At each reporting epoch, every Oracle Operator is expected to collect Consensus Layer data and report it to the Oracle contract through a transaction. The Oracle contract counts the reported consensus layer balance sum of Liquid Collective validators, the reported count of validators, and the number of similar reports from Oracle Operators, along with the count of report variants.

Any changes to the quorum, such as removing Oracle Operators from the members list, clears all of the reporting data for that epoch. Remaining Oracle Operators that had already submitted reports for that epoch would need to report again for the same epoch.

Once receiving a quorum of identical reports, the Oracle contract publishes the data to the River contract, at which point the River contract can compute and distribute network rewards.

Reports

The Oracle contract aims to report the following data to the River contract:

  • Epoch - The epoch for which the Consensus Layer data corresponds to.

  • Validators Count – The count of active Liquid Collective validators on the Consensus Layer (either in status active or active_ongoing). This is necessary so River can compute the number of validators in pending status that have been staked to on the Deposit Contract but are not yet active on the Consensus Layer.

  • Validators Balance – The total ETH balance of active Liquid Collective validators on the Consensus Layer.

Sanity Checks

The Oracle contract is responsible for performing certain sanity checks on the reported data, providing a layer of security to the protocol in case Oracle Operators behave maliciously.

First, the Oracle contract makes sure that the Oracle Operator's reported transactions are for the correct expected epoch.

Second, it makes sure that the validators' reported balances are coherent. In particular, the Oracle contract:

  • Forbids Oracle Operators from reporting earned rewards that would exceed some configurable upper bound of APY. This upper bound takes into account the APY delta between updates extrapolated on a yearly time frame.

  • Forbids Oracle Operators from reporting a balance that would have decreased more than some configurable lower bound of fees or penalties. This lower bound is based on the relative balance decrease.

The execution layer fees are taken into account in these sanity checks as they are the product of a Node Operator's work, just like consensus layer fees.

Oracle Data

The Oracle contract receives reports from the Oracle Operators and updates the following data for the River contract:

  • Validators Count – The count of active Liquid Collective validators on the Consensus Layer (either in status active or posterior). This count is necessary to compute the count of Liquid Collective validators in pending status that have been funded and deposited to the Deposit Contract but are not yet active on the Consensus Layer.

  • Validators Balance – The total ETH balance of active Liquid Validators on the Consensus Layer.

Each time a new report is processed, if Liquid Collective's validators have collectively earned a positive network reward, then this network reward is distributed between parties involved in the Liquid Collective protocol by increasing the Conversion Rate for LsETH.

cToken
LsETH token address on Etherscan here
LsETH token address on Basescan here
LsETH User Agreement
here
post
cToken model
exit queue and withdraw queue times here
Slashing Coverage Program
Tenderly
Ethereum’s exit queue timeline
Alluvial /redeems endpoint
Tenderly
Platform redemption guide
Tenderly

Name

Owner

Role

Activation Queue

Ethereum Consensus Protocol

Exit Queue

Ethereum Consensus Protocol

Redemption Queue

Liquid Collective Protocol

The Liquid Collective protocol’s Redemption Queue facilitates the satisfaction of redemption requests in the same order as they have been requested. The first-in-first-out Redemption Queue is intended to protect against a race for claims in the event of high withdrawal demand.

Withdrawal Stack

Liquid Collective Protocol

The Liquid Collective protocol’s Withdrawal Stack automatically facilitates the movement of ETH to the protocol’s Redemption Buffer. This ETH may be sourced by validator exits from the consensus layer or rebalanced from the protocol’s Deposit Buffer.

Redemption Buffer

Liquid Collective Protocol

The Liquid Collective protocol’s Redemption Buffer holds ETH that is pending to be supplied for redemption satisfactions.

Deposit Buffer

Liquid Collective Protocol

The Liquid Collective protocol’s Deposit Buffer holds ETH pending to be deposited to Ethereum’s consensus layer, or that can be rebalanced to the Withdrawal Stack to programmatically facilitate redemption satisfactions. This ETH may be sourced from user deposits, network rewards (consensus layer & execution layer), the protocol’s Slashing Coverage Program, or rebalanced from the protocol’s Withdrawal Stack.

Rewards, Fees, & Socialization

The collection and socialization of Ethereum network rewards and Liquid Collective protocol fees

Because of LsETH's cToken design, the Conversion Rate may fluctuate. In contrast to other token models, such as aTokens, that issue new net network reward tokens on a unit basis, stakers on the Liquid Collective protocol will not receive more or less tokens as they receive network rewards or penalties.

Instead, the Conversion Rate for each unit of LsETH owned by the depositor will increase or decrease (i.e., the LsETH will evidence legal and beneficial ownership of more or less ETH) in an amount that reflects accrued network rewards.

Protocol Service Fee

Network reward collection & Conversion Rate variation

Every day the Liquid Collective protocol accounts for Ethereum network rewards including consensus layer network rewards and execution layer fees minus possible penalties, which results in updating the data reflecting the total supply of ETH.

If network rewards have been earned on a given day, then the protocol collects the Protocol Service Fee as a percentage of the earned network rewards. The Protocol Service Fee is collected by minting LsETH, which results in an increase in the total supply of LsETH.

Under normal validator operations, the protocol earns network rewards; as such the total supply of ETH increases and the Conversion Rate increases accordingly.

In a scenario where validators are penalized or slashed, depending on the magnitude of the incurred penalties, the total ETH supply could decrease, and the Conversion Rate would decrease accordingly.

Example

Assuming

  • totalETHSupply = 125 ETH

  • totalLsETHSupply = 100

  • protocolFee = 10%

So conversionRate = 125 / 100 = 1.25

Today the protocol earns 10 ETH thus the protocol fee is 10% * 10 ETH / 1.25 = 0.8 LsETH

And the new conversionRate = (125+10) / (108+0.8) = 1.58

Note: Figures above are just examples and do not reflect reality or projections.

Calculating rewards and fees

Each time the Oracle contract reports consensus layer data to the River contract, the protocol programmatically distributes network rewards including consensus layer network rewards and execution layer fees.

Fees received by validators for the execution of transactions are distributed on the execution layer directly. The Liquid Collective protocol automatically stakes the execution layer fees to increase the protocol’s overall potential reward rate by increasing the number of validators in the protocol's active set.

Network reward computation

Each time the Oracle reports consensus layer data, the River smart contract:

  • Pulls execution layer fees from the EL Fee Recipient contract

  • Updates consensus layer data including the Liquid Collective active validators count and total Liquid Collective active validators balance

The network reward is computed as:

reward=(activeValidatorsCountold−activeValidatorsCountnew)∗32 ETH+(totalActiveValidatorsBalancenew−totalActiveValidatorsBalanceold)+pulledExecLayerFeesreward = \\(activeValidatorsCount_{old} - activeValidatorsCount_{new})*32 \, ETH \\ + (totalActiveValidatorsBalance_{new} - totalActiveValidatorsBalance_{old}) \\ + pulledExecLayerFeesreward=(activeValidatorsCountold​−activeValidatorsCountnew​)∗32ETH+(totalActiveValidatorsBalancenew​−totalActiveValidatorsBalanceold​)+pulledExecLayerFees

EL Fee Recipient Contract

The EL Fee Recipient Contract receives all of the execution layer fees including transaction fees and MEV priority fees. The River contract periodically pulls that ETH on every Oracle report.

Network reward distribution

If the earned reward is positive, it is distributed between:

  • LsETH holders receive 85% of the network rewards, proportional to their LsETH holdings, through an accrual of the Conversion Rate

  • Collector that receives the Protocol Service Fee via minting LsETH, which is currently set at 10%

Reward and penalty socialization

Liquid Collective socializes network rewards and penalties between holders proportionally to their LsETH balance. The protocol aims to enforce fairness between participants, making sure that no participant gets treated favorably compared to others.

This means that stakers on Liquid Collective are exposed to the performance of all validators across Liquid Collective as a whole.

Examples:

  • If a validator receives a massive MEV network reward, then this network reward is socialized amongst every LsETH holder.

  • If a validator gets slashed, then the penalty is socialized amongst every LsETH holder.

This socialization of network rewards and penalties is realized by the LsETH Conversion Rate which applies to every LsETH holder equally. Every 24 hours, Oracle reports the new balance of staked ETH across the protocol accounting for accrued network rewards and penalties, resulting in updating the Conversion Rate, which applies to every LsETH holder.

Validator Infrastructure

Decentralized set of approved enterprise-grade Node Operators reduces the risks of validator operations

Validator Infrastructure

The Ethereum protocol requires validators to operate according to a pre-defined set of rules, and Node Operators are economically incentivized to follow those rules.

  • Under proper operational conditions, validators collect network rewards by proposing blocks and signing attestations

  • Under improper operational conditions, validators can miss network rewards, get penalized, or in worst case scenarios, get slashed

Liquid Collective is designed to provide a secure and enterprise-grade liquid staking solution which necessitates sanctions checks on the protocol’s active validator set. Liquid Collective works only with security-focused Node Operators that institute best practices to generate network rewards, including operating multi-region and multi-client infrastructure, technical support teams, and security posturing (including double-sign protection).

To reduce the risk impact of validator operations, and to increase decentralization, Liquid Collective delegates tokens to multiple independent validator Node Operators. The staked tokens are distributed across Node Operators in a round-robin manner so that the Liquid Collective protocol is supported by a broad and dispersed active validator set. As a result, the risk is distributed, which should minimize staked ETH exposure.

Validator Node Operations

The Operators Registry contract provides facilities for Node Operators to register and manage validator keys on the Liquid Collective protocol. River regularly delegates ETH to Node Operators by funding and depositing validator keys to the Consensus Layer.

Before submitting validator keys for the first time, a Node Operator must complete Liquid Collective's Node Operator approval to be approved on the Operators Registry contracts. This one-time approval enables the Node Operator to register validator keys.

Generate Validator Key

For each validator key to be submitted to the Operators Registry contract, a Node Operator is required to:

  • Generate the corresponding DepositMessage and BLS12-381 signature as per the Ethereum 2.0 specifications

  • Set the fee recipient to the EL Fee Recipient contract, responsible for collecting execution layer network rewards

The protocol sets the validator's withdrawal credentials to the Liquid Collective Withdrawal contract address when the protocol initiates a deposit transaction for the validator.

Operator Registry Check

Once generated, the Node Operator registers one or more validator keys on the Operator Registry. The Liquid Foundation conducts a sanity check on the keys for compliance with the above requirements, before increasing the operator limit to make validator keys eligible to receive ETH to stake from the Liquid Collective protocol.

Activating Validators

Once a validator has been registered as eligible to receive ETH, its validators keys can be funded at any time. The Liquid Collective protocol regularly programmatically selects eligible validator keys, funds them, and deposits them to the official Ethereum deposit contract. Once deposited, validator keys enter the activation queue as per the standard Ethereum staking procedure.

Node Operator CLI

The Node Operator Command Line Interface is part of the tooling Liquid Collective provides to Node Operators to facilitate protocol operations. The application provides various commands to facilitate Node Operators' management of their validator keys.

Protocol Metadata

Liquid Collective protocol metadata

Liquid Collective protocol smart contracts expose a metadata URI that resolves to an IPFS directory containing resource files about the protocol.

Metadata directory contains different public resources such as:

  • Protocol Terms & Conditions

  • Marketing resources such as Liquid Collective logo pack

  • Security Audits reports

  • etc.

Any user can access the metadata by getting the IPFS URI from the River smart contracts and then retrieving the metadata directory from IPFS.

Operate an Oracle

Operator running Oracle

Oracle Operators are responsible for periodically reporting consensus layer data to the Liquid Collective protocol.

In particular, they are responsible for reporting network rewards earned by validators on the consensus layer so those network rewards can be accounted for, accruing the value of the LsETH token (cToken) by increasing the Conversion Rate.

The Oracle smart contract is responsible for synchronizing Oracle Operators.

Oracle Operators

Oracle operators are responsible for periodically reporting consensus layer data to the execution layer.

In particular, they are responsible for reporting network rewards earned by validators on the consensus layer so those network rewards can be accounted for, accruing the value of the LsETH token (cToken) by increasing the Conversion Rate.

The Oracle smart contract is responsible for synchronizing Oracle operators. In particular it:

  • Lists the addresses of Oracle members that are expected to report

  • Sets the next target epoch to be reported by Oracle members

  • Expects a quorum of Oracle members to report the same data at the target epoch before forwarding it to the River contract

Oracle reports consist of:

  • The count of validators on the consensus layer

  • The total balance of those validators on the consensus layer

Oracle Operator Procedure

Oracle Operators interested in participating in the Oracle set should go through the following procedure:

  1. One-Time Protocol Onboarding

    1. Oracle Operator generates a wallet to be used as Operator members

    2. Oracle member address gets approved on the Oracle smart contract

  2. Ongoing Operations

    1. Oracle Operator configures and runs the Oracle daemon in its infrastructure connecting self-managed Ethereum EL and CL clients

    2. Oracle Operator makes sure that the Operator member account always has a sufficient ETH balance to pay for gas fees implied by report transactions

Oracle Daemon

Description

To facilitate operations, Oracle Operators are recommended to use the Oracle daemon which is an open-source application maintained by Liquid Collective. While the Oracle daemon is recommended, it is not mandatory, and Oracle Operators can opt-out of it and use their own preferred solution.

The Oracle daemon is a long-living application that:

  • Continuously listens for event logs emitted by the Operators Registry contract

  • Calls the Oracle contract to get the next target epoch to report

  • Exposes various metrics about the activity of the Oracle

When the target epoch to report is reached, it:

  • Collects consensus layer data for the target epoch

  • Generates a report from the collected data (validators count and total balance on the consensus layer)

  • Sends the report transaction to the Oracle contract

The Oracle daemon can optionally run in --dry-mode in which case it does not send report transactions to the chain.

Architecture

The Oracle daemon needs to be connected to:

  • Ethereum Execution Layer RPC endpoint

    • to listen for event logs emitted by the Operator registry contract (in particular events when validator keys get funded)

    • to aggregate all withdrawals data since the Shapella fork

    • to call the Oracle contract for the next epoch to report

  • Ethereum Consensus Layer HTTP endpoint

    • to query validator data

The Oracle Daemon also needs access to a private key for signing report transactions. This wallet corresponds to the oracle member address that has been approved on the oracle contract.

Since the Shapella fork, it has become necessary to retrieve withdrawals for all Liquid Collective validators. However, there is no available API for this task. One solution is to read all blocks, but this consumes a large number of requests. An alternative solution is to implement a stateful approach.

As a result, we have decided to introduce a new flag in the lceth CLI, --data-dir, which stores the state of withdrawals. The stored state encompasses all withdrawals and their corresponding blocks. (The estimated size of the storage is approximately 4 GB.)

Dependencies

  • A synced Execution Layer client with JSON-RPC endpoint enabled. All implementations are supported (Geth, Erigon, Besu, etc.)

  • A synced Consensus Layer client with API endpoint enabled. All implementations are supported (Prysm, Teku, Lighthouse, etc.)

Installation

The recommended installation is to use the public Docker image public.ecr.aws/alluvial/liquid-collective/lceth:latest

It is also possible to build the binary from sources and run it.

Estimated gas cost

Sending an Oracle report uses about 100,000 gas for a regular report and ~300,000 gas when reaching the quorum.

Let's estimate how much in gas fees an Oracle Operator should pay per year, considering:

  • the protocol expects 1 report per day

  • the average gas price is 30 gwei

  • there are 5 oracle operators

  • the quorum is 3

  • all operators use an implementation which alternates submissions order

This means that each day there is a 2/5 probability of sending a regular report and a 1/5 probability of sending a report that reaches quorum:

(365 _ 2/5 _ 100000 + 365 _ 1/5 _ 300000) * 30 = 1 095 000 000 Gwei = 1.09 ETH / year

Guidelines

Protocol onboarding

Generate Oracle member wallet

To generate such a wallet you can use the following command:

Once generated you should securely store the key file and password for later usage, as you will need it each time you will run the Oracle daemon.

Submit Oracle member

Submit the Oracle member address to the administrator to get it approved on the Oracle contract members list.

On-going operations

Oracle has become stateful; be sure to choose an appropriate data directory using the --data-dir flag.

Dry-Run Mode

In dry run the Oracle daemon collects data and generates reports but does not send transactions to the Oracle contract.

It is recommended to use dry run mode when:

  • You are not an Oracle Operator and you are only interested in collecting Oracle metrics data

  • You are an Oracle Operator and you want to first test in dry run before running in live mode

To run the oracle in dry-run mode, you can run:

Live Mode

In live mode, the daemon runs full capabilities and sends transactions to the chain for every epoch to be reported.

In live mode, you need the daemon to have access to the Oracle member wallet that will be used to sign report transactions.

Top up Oracle Operator account

Before starting the daemon you should make sure that the Oracle Operator account has been topped-up with ETH so it can pay for the gas fees for the report transactions.

After starting the daemon, an Oracle Operator should make sure that the Oracle member account always has a sufficient balance of ETH to send report transactions.

Oracle Operators are responsible for paying for the gas implied by the report transaction.

To run the daemon in live mode, you can run:

Oracle Daemon Command

Monitoring and Metrics

The Oracle service exposes a health endpoint that exposes routes for monitoring:

  • /live Liveness endpoint

  • /ready Readiness endpoint

  • /metrics Prometheus metrics

Platform Operations

Platforms provide a seamless on-ramp and access for users to interact with the Liquid Collective protocol.

Platforms provide a seamless on-ramp and access for users to interact with the Liquid Collective protocol. There are two types of Liquid Collective Platforms.

Platforms that enable LsETH minting and redemption

  • These Platforms enable direct Liquid Collective protocol interactions, including depositing ETH to Ethereum's deposit contract and redeeming LsETH for ETH (minting and redeeming).

  • They conduct know-your-customer (KYC) and anti money laundering (AML) checks on their users, and submit approved user addresses to Liquid Collective's Allowlist.

  • These Platforms then provide a path to deposit and withdraw staked tokens.

In other words, KYC'd users who utilize a Platform's services can deposit to Liquid Collective and mint LsETH.

[!NOTE] Users, also called stakers, are entities interested in staking ETH using the Liquid Collective protocol to mint the LsETH receipt token in return, evidencing their legal and beneficial ownership of the staked ETH plus rewards accrued and minus any fees or penalties. Before depositing ETH and minting LsETH, a user needs to go through an effective KYC/AML and sanctions screening process. After successfully completing the KYC/AML and sanctions screening process with a Platform, the user's wallet address can be added to Liquid Collective's Allowlist smart contract, authorizing deposit and redemption transactions.

Platforms that 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 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.

By default, LsETH holders can transfer LsETH.

Enterprise integration APIs

RedeemManagerV1

Alluvial Finance Inc.

Redeem Manager (v1)

This contract handles the redeem requests of all users

Methods

claimRedeemRequests

Claims the rewards of the provided redeem request ids

Parameters

Returns

claimRedeemRequests

Claims the rewards of the provided redeem request ids

Parameters

Returns

getBufferedExceedingEth

Retrieve the amount of redeemed LsETH pending to be supplied with withdrawn ETH

Returns

getRedeemDemand

Retrieve the amount of LsETH waiting to be exited

Returns

getRedeemRequestCount

Retrieve the global count of redeem requests

Returns

getRedeemRequestDetails

Retrieve the details of a specific redeem request

Parameters

Returns

getRiver

Retrieve River address

Returns

getWithdrawalEventCount

Retrieve the global count of withdrawal events

Returns

getWithdrawalEventDetails

Retrieve the details of a specific withdrawal event

Parameters

Returns

initializeRedeemManagerV1

Parameters

initializeRedeemManagerV1_2

pullExceedingEth

Pulls exceeding buffer eth

Parameters

reportWithdraw

Reports a withdraw event from River

Parameters

requestRedeem

Creates a redeem request

Parameters

Returns

requestRedeem

Creates a redeem request using msg.sender as recipient

Parameters

Returns

resolveRedeemRequests

Resolves the provided list of redeem request ids

The result is an array of equal length with ids or error code-1 means that the request is not satisfied yet-2 means that the request is out of bounds-3 means that the request has already been claimedThis call was created to be called by an off-chain interface, the output could then be used to perform the claimRewards call in a regular transaction

Parameters

Returns

version

Retrieves the version of the contract

Returns

Events

ClaimedRedeemRequest

Emitted when a redeem request claim has been processed and matched at least once and funds are sent to the recipient

Parameters

Initialize

Emitted when the contract is properly initialized

Parameters

ReportedWithdrawal

Emitted when a withdrawal event is created

Parameters

RequestedRedeem

Emitted when a redeem request is created

Parameters

SatisfiedRedeemRequest

Emitted when a redeem request has been satisfied and filled (even partially) from a withdrawal event

Parameters

SetRedeemDemand

Emitted when the redeem demand is set

Parameters

SetRiver

Emitted when the River address is set

Parameters

Errors

ClaimInitiatorIsDenied

Thrown when the claim initiator is denied

ClaimRecipientIsDenied

Thrown when the claim recipient is denied

ClaimRedeemFailed

Thrown when the payment after a claim failed

Parameters

DoesNotMatch

Thrown when the redeem request and withdrawal event are not matching during claim

Parameters

IncompatibleArrayLengths

Thrown when the provided arrays don't have matching lengths

InvalidInitialization

An error occurred during the initialization

Parameters

InvalidZeroAddress

The address is zero

InvalidZeroAmount

Thrown When a zero value is provided

RecipientIsDenied

Thrown when the recipient of redeemRequest is denied

RedeemRequestAlreadyClaimed

Thrown when the redeem request id is already claimed

Parameters

RedeemRequestOutOfBounds

Thrown when the provided redeem request id is out of bounds

Parameters

TransferError

Thrown when a transfer error occurred with LsETH

Unauthorized

The operator is unauthorized for the caller

Parameters

WithdrawalEventOutOfBounds

Thrown when the withdrawal request id if out of bounds

Parameters

WithdrawalExceedsRedeemDemand

Thrown when the provided withdrawal event exceeds the redeem demand

Parameters

Deployment Addresses

Liquid Collective deployment addresses

Ethereum’s Activation Queue rate limits the number of new validators that can be activated on the network to protect the network’s stability. The Activation Queue can result in a waiting time to activate stake on Ethereum. Learn more .

Ethereum’s Exit Queue rate limits the speed at which validators can leave the network to protect the network’s stability, and to ensure that slashing penalties are applied as necessary. The Exit Queue can result in a waiting time to withdraw stake from Ethereum. Learn more .

Every 24 hours, Oracles report the new balance of staked ETH from accrued network rewards or fees. The is computed as the total balance of staked ETH over the total supply of LsETH. If accrued network rewards are greater than penalties and fees, the protocol Conversion Rate increases to reflect the net Ethereum network rewards collected by the protocol.

The Liquid Collective protocol charges a Protocol Service Fee set at 10.0% of network rewards. Liquid Collective’s service fee is split amongst split amongst Node Operators, Platforms, Wallet & Custody Providers, Service Providers, the protocol’s , and the Liquid Collective DAO, which comprises a broad and dispersed community of protocol participants. All service fees are distributed in LsTokens, which are the native receipt tokens of the protocol (e.g. LsETH).

Node Operators in Liquid Collective's active set also support the protocol's by providing coverage for deductibles, up to a cap, against slashing incidents and missed rewards incurred due to the fault of their infrastructure.

To see a step by step workflow for the Node Operator CLI, check out the guide.

Below is an example of an RPC call to get Liquid Collective metadata URI using

The Liquid Collective protocol currently uses Alluvial's API services to facilitate Platform onboarding. Platform guides can be found in the .

Platforms offering KYC procedures for their users may submit user wallet addresses using the to register the addresses with the Liquid Collective Allowlist contract.

Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Contract
Mainnet
Holesky
here
here
Conversion Rate
Slashing Coverage Treasury
$ cast call 0x8c1BEd5b9a0928467c9B1341Da1D7BD5e10b6549 "getMetadataURI()(string)"
ipfs://QmZrpoUUKZ2n5Pd3EAG38HRHjNh66MRBFMMBqsFUVS6NpB
env KEYSTORE_PASSWORD={password to encrypt the key file} lceth eth1keys generate
docker run \
  --env "KEYSTORE_PASSWORD={password to encrypt the key file}" \
  -v "keystore:/data/keystore" \
  public.ecr.aws/alluvial/liquid-collective/lceth eth1keys generate
env ETH_EL_ADDR={ethereum execution layer rpc endpoint} \
ETH_CL_ADDR={ethereum consensus layer endpoint} \
lceth oracle run --dry-run --data-dir ./data
docker run \
  -e ETH_EL_ADDR={ethereum execution layer rpc endpoint}
  -e ETH_CL_ADDR={ethereum consensus layer endpoint} \
  -e ORACLE_DATA_DIR="/data" \
  -v "data:/data" \
  public.ecr.aws/alluvial/liquid-collective/lceth \
  oracle run --dry-run --data-dir ./data
env ETH_EL_ADDR={ethereum execution layer rpc endpoint} \
ETH_CL_ADDR={ethereum consensus layer endpoint} \
KEYSTORE_PASSWORD={password used to encrypt the Oracle member key file} \
ORACLE_MEMBER_ADDR={address of the Oracle member wallet} \
ORACLE_DATA_DIR="/data" \
lceth oracle run
docker run \
  -e ETH_EL_ADDR={ethereum execution layer rpc endpoint}
  -e ETH_CL_ADDR={ethereum consensus layer endpoint} \
  -e ORACLE_DATA_DIR="/data" \
  -e KEYSTORE_PASSWORD={password used to encrypt the Oracle member key file} \
  -e ORACLE_MEMBER_ADDR={address of the Oracle member wallet} \
  -v "data:/data" \
  -v "keystore:/keystore" \
  public.ecr.aws/alluvial/liquid-collective/lceth \
  oracle run
Run Oracle reporter deamon

Usage:
  lceth oracle run [flags]

Flags:
      --eth-cl-addr string          Address of the Ethereum consensus layer node to connect to [env: ETH_CL_ADDR]
      --dry-run                     Run oracle reporter without attempting to submit on-chain reports [env: ORACLE_DRY_RUN]
      --gas-limit int               Set gas limit when submitting reports [env: ORACLE_GAS_LIMIT] (default 600000)
      --member-addr string          Ethereum address of the oracle operator used to sign and submit reports [env: ORACLE_MEMBER_ADDR]
      --report-distance int         Maximum count of epochs after frame start where oracle has to report [env: ORACLE_REPORT_DISTANCE]
      --withdrawal-batch-size int   Maximum count of withdrawals blocks to fetch in parallel [env: ORACLE_WITHDRAWAL_BATCH_SIZE] (default 20)
      --data-dir string             Local directory where to store withdrawal data [env: ORACLE_DATA_DIR] (default "./data")
      --loop-sleep-time duration    Duration in seconds between 2 fetch calls [env: ORACLE_LOOP_SLEEP_TIME] (default 15s)
  -h, --help                        help for run

Global Flags:
      --allowlist-addr string            Address of the Allowlist contract [env: ALLOWLIST_ADDR]
      --deployment-block uint            Deployment block of the contracts [env: DEPLOYMENT_BLOCK]
      --el-fee-recipient-addr string     Address of the Execution Layer fee recipient contract [env: EL_FEE_RECIPIENT_ADDR]
      --eth-el-addr string               JSON-RPC address of the Ethereum execution layer node to connect to [env: ETH_EL_ADDR]
      --keystore-password string         Password used to encrypt key files [env: KEYSTORE_PASSWORD]
      --keystore-path string             Directory where to store keys [env: KEYSTORE_PATH]
      --log-format string                Log output format (text or json) [env: LOG_FORMAT] (default "text")
      --log-level string                 Log output level [env: LOG_LEVEL] (default "info")
      --operators-registry-addr string   Address of the Operators Registry contract [env: OPERATORS_REGISTRY_ADDR]
      --oracle-addr string               Address of the Oracle contract [env: ORACLE_ADDR]
      --redeem-manager-addr string       Address of the RedeemManager contract [env: REDEEM_MANAGER_ADDR]
      --river-addr string                Address of the River contract [env: RIVER_ADDR]
      --tlc-addr string                  Address of the TLC contract [env: TLC_ADDR]
      --withdraw-addr string             Address of the Withdraw contract [env: WITHDRAW_ADDR]
      --wls-eth-addr string              Address of the WlsEth contract [env: WLSETH_ADDR]
function claimRedeemRequests(uint32[] redeemRequestIds, uint32[] withdrawalEventIds, bool skipAlreadyClaimed, uint16 _depth) external nonpayable returns (uint8[] claimStatuses)

redeemRequestIds

uint32[]

undefined

withdrawalEventIds

uint32[]

undefined

skipAlreadyClaimed

bool

undefined

_depth

uint16

The maximum recursive depth for the resolution of the redeem requests

claimStatuses

uint8[]

The list of claim statuses. 0 for fully claimed, 1 for partially claimed, 2 for skipped

function claimRedeemRequests(uint32[] _redeemRequestIds, uint32[] _withdrawalEventIds) external nonpayable returns (uint8[] claimStatuses)

_redeemRequestIds

uint32[]

The list of redeem requests to claim

_withdrawalEventIds

uint32[]

The list of withdrawal events to use for every redeem request claim

claimStatuses

uint8[]

The list of claim statuses. 0 for fully claimed, 1 for partially claimed, 2 for skipped

function getBufferedExceedingEth() external view returns (uint256)

_0

uint256

The amount of eth in the buffer

function getRedeemDemand() external view returns (uint256)

_0

uint256

The amount of LsETH waiting to be exited

function getRedeemRequestCount() external view returns (uint256)

_0

uint256

undefined

function getRedeemRequestDetails(uint32 _redeemRequestId) external view returns (struct RedeemQueueV2.RedeemRequest)

_redeemRequestId

uint32

The id of the request

_0

RedeemQueueV2.RedeemRequest

The redeem request details

function getRiver() external view returns (address)

_0

address

The address of River

function getWithdrawalEventCount() external view returns (uint256)

_0

uint256

undefined

function getWithdrawalEventDetails(uint32 _withdrawalEventId) external view returns (struct WithdrawalStack.WithdrawalEvent)

_withdrawalEventId

uint32

The id of the withdrawal event

_0

WithdrawalStack.WithdrawalEvent

The withdrawal event details

function initializeRedeemManagerV1(address _river) external nonpayable

_river

address

The address of the River contract

function initializeRedeemManagerV1_2() external nonpayable
function pullExceedingEth(uint256 _max) external nonpayable

_max

uint256

The maximum amount that should be pulled

function reportWithdraw(uint256 _lsETHWithdrawable) external payable

_lsETHWithdrawable

uint256

The amount of LsETH that can be redeemed due to this new withdraw event

function requestRedeem(uint256 _lsETHAmount, address _recipient) external nonpayable returns (uint32 redeemRequestId)

_lsETHAmount

uint256

The amount of LsETH to redeem

_recipient

address

The recipient owning the redeem request

redeemRequestId

uint32

The id of the redeem request

function requestRedeem(uint256 _lsETHAmount) external nonpayable returns (uint32 redeemRequestId)

_lsETHAmount

uint256

The amount of LsETH to redeem

redeemRequestId

uint32

The id of the redeem request

function resolveRedeemRequests(uint32[] _redeemRequestIds) external view returns (int64[] withdrawalEventIds)

_redeemRequestIds

uint32[]

The list of redeem requests to resolve

withdrawalEventIds

int64[]

The list of withdrawal events matching every redeem request (or error codes)

function version() external pure returns (string)

_0

string

Version of the contract

event ClaimedRedeemRequest(uint32 indexed redeemRequestId, address indexed recipient, uint256 ethAmount, uint256 lsEthAmount, uint256 remainingLsEthAmount)

redeemRequestId indexed

uint32

The id of the redeem request

recipient indexed

address

The address receiving the redeem request funds

ethAmount

uint256

The amount of eth retrieved

lsEthAmount

uint256

The total amount of LsETH used to redeem the eth

remainingLsEthAmount

uint256

The amount of LsETH remaining

event Initialize(uint256 version, bytes cdata)

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

event ReportedWithdrawal(uint256 height, uint256 amount, uint256 ethAmount, uint32 id)

height

uint256

The height of the withdrawal event in LsETH

amount

uint256

The amount of the withdrawal event in LsETH

ethAmount

uint256

The amount of eth to distribute to claimers

id

uint32

The id of the withdrawal event

event RequestedRedeem(address indexed recipient, uint256 height, uint256 amount, uint256 maxRedeemableEth, uint32 id)

recipient indexed

address

The recipient of the redeem request

height

uint256

The height of the redeem request in LsETH

amount

uint256

The amount of the redeem request in LsETH

maxRedeemableEth

uint256

The maximum amount of eth that can be redeemed from this request

id

uint32

The id of the new redeem request

event SatisfiedRedeemRequest(uint32 indexed redeemRequestId, uint32 indexed withdrawalEventId, uint256 lsEthAmountSatisfied, uint256 ethAmountSatisfied, uint256 lsEthAmountRemaining, uint256 ethAmountExceeding)

redeemRequestId indexed

uint32

The id of the redeem request

withdrawalEventId indexed

uint32

The id of the withdrawal event used to fill the request

lsEthAmountSatisfied

uint256

The amount of LsETH filled

ethAmountSatisfied

uint256

The amount of ETH filled

lsEthAmountRemaining

uint256

The amount of LsETH remaining

ethAmountExceeding

uint256

The amount of eth added to the exceeding buffer

event SetRedeemDemand(uint256 oldRedeemDemand, uint256 newRedeemDemand)

oldRedeemDemand

uint256

The old redeem demand

newRedeemDemand

uint256

The new redeem demand

event SetRiver(address river)

river

address

The new river address

error ClaimInitiatorIsDenied()
error ClaimRecipientIsDenied()
error ClaimRedeemFailed(address recipient, bytes rdata)

recipient

address

The recipient of the payment

rdata

bytes

The revert data

error DoesNotMatch(uint256 redeemRequestId, uint256 withdrawalEventId)

redeemRequestId

uint256

The provided redeem request id

withdrawalEventId

uint256

The provided associated withdrawal event id

error IncompatibleArrayLengths()
error InvalidInitialization(uint256 version, uint256 expectedVersion)

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

error InvalidZeroAddress()
error InvalidZeroAmount()
error RecipientIsDenied()
error RedeemRequestAlreadyClaimed(uint256 id)

id

uint256

The redeem request id

error RedeemRequestOutOfBounds(uint256 id)

id

uint256

The redeem request id

error TransferError()
error Unauthorized(address caller)

caller

address

Address performing the call

error WithdrawalEventOutOfBounds(uint256 id)

id

uint256

The withdrawal event id

error WithdrawalExceedsRedeemDemand(uint256 withdrawalAmount, uint256 redeemDemand)

withdrawalAmount

uint256

The amount of the withdrawal event

redeemDemand

uint256

The current redeem demand

ELFeeRecipientV1

Alluvial Finance Inc.

Execution Layer Fee Recipient (v1)

This contract receives all the execution layer fees from the proposed blocks + bribes

Methods

initELFeeRecipientV1

function initELFeeRecipientV1(address _riverAddress) external nonpayable

Initialize the fee recipient with the required arguments

Parameters

Name
Type
Description

_riverAddress

address

Address of River

pullELFees

function pullELFees(uint256 _maxAmount) external nonpayable

Pulls ETH to the River contract

Only callable by the River contract

Parameters

Name
Type
Description

_maxAmount

uint256

The maximum amount to pull into the system

version

function version() external pure returns (string)

Retrieves the version of the contract

Returns

Name
Type
Description

_0

string

Version of the contract

Events

Initialize

event Initialize(uint256 version, bytes cdata)

Emitted when the contract is properly initialized

Parameters

Name
Type
Description

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

SetRiver

event SetRiver(address indexed river)

The storage river address has changed

Parameters

Name
Type
Description

river indexed

address

The new river address

Errors

InvalidCall

error InvalidCall()

The fallback has been triggered

InvalidInitialization

error InvalidInitialization(uint256 version, uint256 expectedVersion)

An error occurred during the initialization

Parameters

Name
Type
Description

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

Unauthorized

error Unauthorized(address caller)

The operator is unauthorized for the caller

Parameters

Name
Type
Description

caller

address

Address performing the call

Firewall

Figment

Firewall

This contract accepts calls to admin-level functions of an underlying contract, and ensures the caller holds an appropriate role for calling that function. There are two roles:

  • An Admin can call anything

  • An Executor can call specific functions

The list of function is customizable. Random callers cannot call anything through this contract, even if the underlying function is unpermissioned in the underlying contract. Calls to non-admin functions should be called at the underlying contract directly.

Methods

acceptAdmin

function acceptAdmin() external nonpayable

Accept the transfer of ownership

Only callable by the pending admin. Resets the pending admin if successful.

allowExecutor

function allowExecutor(bytes4 _functionSelector, bool _executorCanCall) external nonpayable

Sets the permission for a function selector

Parameters

Name
Type
Description

_functionSelector

bytes4

Method signature on which the permission is changed

_executorCanCall

bool

True if selector is callable by the executor

destination

function destination() external view returns (address)

Retrieve the destination address

Returns

Name
Type
Description

_0

address

The destination address

executor

function executor() external view returns (address)

Retrieve the executor address

Returns

Name
Type
Description

_0

address

The executor address

executorCanCall

function executorCanCall(bytes4) external view returns (bool)

Returns true if the executor is allowed to perform a call on the given selector

Parameters

Name
Type
Description

_0

bytes4

undefined

Returns

Name
Type
Description

_0

bool

True if executor is allowed to call

getAdmin

function getAdmin() external view returns (address)

Retrieves the current admin address

Returns

Name
Type
Description

_0

address

The admin address

getPendingAdmin

function getPendingAdmin() external view returns (address)

Retrieve the current pending admin address

Returns

Name
Type
Description

_0

address

The pending admin address

proposeAdmin

function proposeAdmin(address _newAdmin) external nonpayable

Proposes a new address as admin

This security prevents setting an invalid address as an admin. The pending admin has to claim its ownership of the contract, and prove that the new address is able to perform regular transactions.

Parameters

Name
Type
Description

_newAdmin

address

New admin address

setExecutor

function setExecutor(address _newExecutor) external nonpayable

Sets the executor address

Parameters

Name
Type
Description

_newExecutor

address

New address for the executor

version

function version() external pure returns (string)

Retrieves the version of the contract

Returns

Name
Type
Description

_0

string

Version of the contract

Events

SetAdmin

event SetAdmin(address indexed admin)

The admin address changed

Parameters

Name
Type
Description

admin indexed

address

New admin address

SetDestination

event SetDestination(address indexed destination)

The stored destination address has been changed

Parameters

Name
Type
Description

destination indexed

address

The new destination address

SetExecutor

event SetExecutor(address indexed executor)

The stored executor address has been changed

Parameters

Name
Type
Description

executor indexed

address

The new executor address

SetExecutorPermissions

event SetExecutorPermissions(bytes4 selector, bool status)

The storage permission for a selector has been changed

Parameters

Name
Type
Description

selector

bytes4

The 4 bytes method selector

status

bool

True if executor is allowed

SetPendingAdmin

event SetPendingAdmin(address indexed pendingAdmin)

The pending admin address changed

Parameters

Name
Type
Description

pendingAdmin indexed

address

New pending admin address

Errors

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

Unauthorized

error Unauthorized(address caller)

The operator is unauthorized for the caller

Parameters

Name
Type
Description

caller

address

Address performing the call

CoverageFundV1

Alluvial Finance Inc.

Coverage Fund (v1)

This contract receive donations for the slashing coverage fund and pull the funds into riverThis contract acts as a temporary buffer for funds that should be pulled in case of a loss of money on the consensus layer due to slashing events.There is no fee taken on these funds, they are entirely distributed to the LsETH holders, and no shares will get minted.Funds will be distributed by increasing the underlying value of every LsETH share.The fund will be called on every report and if eth is available in the contract, River will attempt to pull as much ETH as possible. This maximum is defined by the upper bound allowed by the Oracle. This means that it might take multiple reports for funds to be pulled entirely into the system due to this upper bound, ensuring a lower secondary market impact.The value provided to this contract is computed off-chain and provided manually by Alluvial or any authorized insurance entity.The Coverage funds are pulled upon an oracle report, after the ELFees have been pulled in the system, if there is a margin left before crossing the upper bound. The reason behind this is to favor the revenue stream, that depends on market and network usage, while the coverage fund will be pulled after the revenue stream, and there won't be any commission on the eth pulled.Once a Slashing event occurs, the team will do its best to inject the recovery funds in at maximum 365 days. The entities allowed to donate are selected by the team. It will mainly be treasury entities or insurance protocols able to fill this coverage fund properly.

Methods

donate

function donate() external payable

Donates ETH to the coverage fund contract

initCoverageFundV1

function initCoverageFundV1(address _riverAddress) external nonpayable

Initialize the coverage fund with the required arguments

Parameters

Name
Type
Description

_riverAddress

address

Address of River

pullCoverageFunds

function pullCoverageFunds(uint256 _maxAmount) external nonpayable

Pulls ETH into the River contract

Only callable by the River contract

Parameters

Name
Type
Description

_maxAmount

uint256

The maximum amount to pull into the system

version

function version() external pure returns (string)

Retrieves the version of the contract

Returns

Name
Type
Description

_0

string

Version of the contract

Events

Donate

event Donate(address indexed donator, uint256 amount)

A donation has been made to the coverage fund

Parameters

Name
Type
Description

donator indexed

address

Address that performed the donation

amount

uint256

The amount donated

Initialize

event Initialize(uint256 version, bytes cdata)

Emitted when the contract is properly initialized

Parameters

Name
Type
Description

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

SetRiver

event SetRiver(address indexed river)

The storage river address has changed

Parameters

Name
Type
Description

river indexed

address

The new river address

Errors

EmptyDonation

error EmptyDonation()

A donation with 0 ETH has been performed

InvalidCall

error InvalidCall()

The fallback or receive callback has been triggered

InvalidInitialization

error InvalidInitialization(uint256 version, uint256 expectedVersion)

An error occurred during the initialization

Parameters

Name
Type
Description

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

Unauthorized

error Unauthorized(address caller)

The operator is unauthorized for the caller

Parameters

Name
Type
Description

caller

address

Address performing the call

Administrable

Alluvial Finance Inc.

Administrable

This contract handles the administration of the contracts

Methods

acceptAdmin

function acceptAdmin() external nonpayable

Accept the transfer of ownership

Only callable by the pending admin. Resets the pending admin if successful.

getAdmin

function getAdmin() external view returns (address)

Retrieves the current admin address

Returns

Name
Type
Description

_0

address

The admin address

getPendingAdmin

function getPendingAdmin() external view returns (address)

Retrieve the current pending admin address

Returns

Name
Type
Description

_0

address

The pending admin address

proposeAdmin

function proposeAdmin(address _newAdmin) external nonpayable

Proposes a new address as admin

This security prevents setting an invalid address as an admin. The pending admin has to claim its ownership of the contract, and prove that the new address is able to perform regular transactions.

Parameters

Name
Type
Description

_newAdmin

address

New admin address

Events

SetAdmin

event SetAdmin(address indexed admin)

The admin address changed

Parameters

Name
Type
Description

admin indexed

address

New admin address

SetPendingAdmin

event SetPendingAdmin(address indexed pendingAdmin)

The pending admin address changed

Parameters

Name
Type
Description

pendingAdmin indexed

address

New pending admin address

Errors

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

Unauthorized

error Unauthorized(address caller)

The operator is unauthorized for the caller

Parameters

Name
Type
Description

caller

address

Address performing the call

TLCV1

Alluvial Finance Inc.

TLC (v1)

The TLC token has a max supply of 1,000,000,000 and 18 decimal places.Upon deployment, all minted tokens are send to account provided at construction, in charge of creating the vesting schedulesThe contract is based on ERC20Votes by OpenZeppelin. Users need to delegate their voting power to someone or themselves to be able to vote.The contract contains vesting logics allowing vested users to still be able to delegate their voting power while their tokens are held in an escrow

Methods

CLOCK_MODE

function CLOCK_MODE() external view returns (string)

Description of the clock

Returns

Name
Type
Description

_0

string

undefined

DOMAIN_SEPARATOR

function DOMAIN_SEPARATOR() external view returns (bytes32)

See {IERC20Permit-DOMAIN_SEPARATOR}.

Returns

Name
Type
Description

_0

bytes32

undefined

allowance

function allowance(address owner, address spender) external view returns (uint256)

See {IERC20-allowance}.

Parameters

Name
Type
Description

owner

address

undefined

spender

address

undefined

Returns

Name
Type
Description

_0

uint256

undefined

approve

function approve(address spender, uint256 amount) external nonpayable returns (bool)

See {IERC20-approve}. NOTE: If amount is the maximum uint256, the allowance is not updated on transferFrom. This is semantically equivalent to an infinite approval. Requirements: - spender cannot be the zero address.

Parameters

Name
Type
Description

spender

address

undefined

amount

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

balanceOf

function balanceOf(address account) external view returns (uint256)

See {IERC20-balanceOf}.

Parameters

Name
Type
Description

account

address

undefined

Returns

Name
Type
Description

_0

uint256

undefined

checkpoints

function checkpoints(address account, uint32 pos) external view returns (struct ERC20VotesUpgradeable.Checkpoint)

Get the pos-th checkpoint for account.

Parameters

Name
Type
Description

account

address

undefined

pos

uint32

undefined

Returns

Name
Type
Description

_0

ERC20VotesUpgradeable.Checkpoint

undefined

clock

function clock() external view returns (uint48)

Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).

Returns

Name
Type
Description

_0

uint48

undefined

computeVestingReleasableAmount

function computeVestingReleasableAmount(uint256 _index) external view returns (uint256)

Computes the releasable amount of tokens for a vesting schedule.

Parameters

Name
Type
Description

_index

uint256

index of the vesting schedule

Returns

Name
Type
Description

_0

uint256

amount of releasable tokens

computeVestingVestedAmount

function computeVestingVestedAmount(uint256 _index) external view returns (uint256)

Computes the vested amount of tokens for a vesting schedule.

Parameters

Name
Type
Description

_index

uint256

index of the vesting schedule

Returns

Name
Type
Description

_0

uint256

amount of vested tokens

createVestingSchedule

function createVestingSchedule(uint64 _start, uint32 _cliffDuration, uint32 _duration, uint32 _periodDuration, uint32 _lockDuration, bool _revocable, uint256 _amount, address _beneficiary, address _delegatee, bool _ignoreGlobalUnlockSchedule) external nonpayable returns (uint256)

Creates a new vesting scheduleThere may delay between the time a user should start vesting tokens and the time the vesting schedule is actually created on the contract.Typically a user joins the Liquid Collective but some weeks pass before the user gets all legal agreements in place and signed for the token grant emission to happen. In this case, the vesting schedule created for the token grant would start on the join date which is in the past.

As vesting schedules can be created in the past, this means that you should be careful when creating a vesting schedule and what duration parameters you use as this contract would allow creating a vesting schedule in the past and even a vesting schedule that has already ended.

Parameters

Name
Type
Description

_start

uint64

start time of the vesting

_cliffDuration

uint32

duration to vesting cliff (in seconds)

_duration

uint32

total vesting schedule duration after which all tokens are vested (in seconds)

_periodDuration

uint32

duration of a period after which new tokens unlock (in seconds)

_lockDuration

uint32

duration during which tokens are locked (in seconds)

_revocable

bool

whether the vesting schedule is revocable or not

_amount

uint256

amount of token attributed by the vesting schedule

_beneficiary

address

address of the beneficiary of the tokens

_delegatee

address

address to delegate escrow voting power to

_ignoreGlobalUnlockSchedule

bool

whether the vesting schedule should ignore the global lock

Returns

Name
Type
Description

_0

uint256

index of the created vesting schedule

decimals

function decimals() external view returns (uint8)

Returns the number of decimals used to get its user representation. For example, if decimals equals 2, a balance of 505 tokens should be displayed to a user as 5.05 (505 / 10 ** 2). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for display purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.

Returns

Name
Type
Description

_0

uint8

undefined

decreaseAllowance

function decreaseAllowance(address spender, uint256 subtractedValue) external nonpayable returns (bool)

Atomically decreases the allowance granted to spender by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - spender cannot be the zero address. - spender must have allowance for the caller of at least subtractedValue.

Parameters

Name
Type
Description

spender

address

undefined

subtractedValue

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

delegate

function delegate(address delegatee) external nonpayable

Delegate votes from the sender to delegatee.

Parameters

Name
Type
Description

delegatee

address

undefined

delegateBySig

function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external nonpayable

Delegates votes from signer to delegatee

Parameters

Name
Type
Description

delegatee

address

undefined

nonce

uint256

undefined

expiry

uint256

undefined

v

uint8

undefined

r

bytes32

undefined

s

bytes32

undefined

delegateVestingEscrow

function delegateVestingEscrow(uint256 _index, address _delegatee) external nonpayable returns (bool)

Delegate vesting escrowed tokens

Parameters

Name
Type
Description

_index

uint256

index of the vesting schedule

_delegatee

address

address to delegate the token to

Returns

Name
Type
Description

_0

bool

True on success

delegates

function delegates(address account) external view returns (address)

Get the address account is currently delegating to.

Parameters

Name
Type
Description

account

address

undefined

Returns

Name
Type
Description

_0

address

undefined

eip712Domain

function eip712Domain() external view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)

See {EIP-5267}. Available since v4.9.

Returns

Name
Type
Description

fields

bytes1

undefined

name

string

undefined

version

string

undefined

chainId

uint256

undefined

verifyingContract

address

undefined

salt

bytes32

undefined

extensions

uint256[]

undefined

getPastTotalSupply

function getPastTotalSupply(uint256 timepoint) external view returns (uint256)

Retrieve the totalSupply at the end of timepoint. Note, this value is the sum of all balances. It is NOT the sum of all the delegated votes! Requirements: - timepoint must be in the past

Parameters

Name
Type
Description

timepoint

uint256

undefined

Returns

Name
Type
Description

_0

uint256

undefined

getPastVotes

function getPastVotes(address account, uint256 timepoint) external view returns (uint256)

Retrieve the number of votes for account at the end of timepoint. Requirements: - timepoint must be in the past

Parameters

Name
Type
Description

account

address

undefined

timepoint

uint256

undefined

Returns

Name
Type
Description

_0

uint256

undefined

getVestingSchedule

function getVestingSchedule(uint256 _index) external view returns (struct VestingSchedulesV2.VestingSchedule)

Get vesting schedule

The vesting schedule structure represents a static configuration used to compute the desired vesting details of a beneficiary at all times. The values won't change even after tokens are released.The only dynamic field of the structure is end, and is updated whenever a vesting schedule is revoked

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule

Returns

Name
Type
Description

_0

VestingSchedulesV2.VestingSchedule

undefined

getVestingScheduleCount

function getVestingScheduleCount() external view returns (uint256)

Get count of vesting schedules

Returns

Name
Type
Description

_0

uint256

count of vesting schedules

getVotes

function getVotes(address account) external view returns (uint256)

Gets the current votes balance for account

Parameters

Name
Type
Description

account

address

undefined

Returns

Name
Type
Description

_0

uint256

undefined

increaseAllowance

function increaseAllowance(address spender, uint256 addedValue) external nonpayable returns (bool)

Atomically increases the allowance granted to spender by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - spender cannot be the zero address.

Parameters

Name
Type
Description

spender

address

undefined

addedValue

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

initTLCV1

function initTLCV1(address _account) external nonpayable

Initializes the TLC Token

Parameters

Name
Type
Description

_account

address

The initial account to grant all the minted tokens

isGlobalUnlockedScheduleIgnored

function isGlobalUnlockedScheduleIgnored(uint256 _index) external view returns (bool)

Get vesting global unlock schedule activation status for a vesting schedule

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule

Returns

Name
Type
Description

_0

bool

true if the vesting schedule should ignore the global unlock schedule

migrateVestingSchedules

function migrateVestingSchedules() external nonpayable

Migrates the vesting schedule state structures

name

function name() external view returns (string)

Returns the name of the token.

Returns

Name
Type
Description

_0

string

undefined

nonces

function nonces(address owner) external view returns (uint256)

See {IERC20Permit-nonces}.

Parameters

Name
Type
Description

owner

address

undefined

Returns

Name
Type
Description

_0

uint256

undefined

numCheckpoints

function numCheckpoints(address account) external view returns (uint32)

Get number of checkpoints for account.

Parameters

Name
Type
Description

account

address

undefined

Returns

Name
Type
Description

_0

uint32

undefined

permit

function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external nonpayable

See {IERC20Permit-permit}.

Parameters

Name
Type
Description

owner

address

undefined

spender

address

undefined

value

uint256

undefined

deadline

uint256

undefined

v

uint8

undefined

r

bytes32

undefined

s

bytes32

undefined

releaseVestingSchedule

function releaseVestingSchedule(uint256 _index) external nonpayable returns (uint256)

Release vesting scheduleWhen tokens are released from the escrow, the delegated address of the escrow will see its voting power decrease.The beneficiary has to make sure its delegation parameters are set properly to be able to use/delegate the voting power of its balance.

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule to release

Returns

Name
Type
Description

_0

uint256

released amount

revokeVestingSchedule

function revokeVestingSchedule(uint256 _index, uint64 _end) external nonpayable returns (uint256)

Revoke vesting schedule

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule to revoke

_end

uint64

End date for the schedule

Returns

Name
Type
Description

_0

uint256

amount returned to the vesting schedule creator

symbol

function symbol() external view returns (string)

Returns the symbol of the token, usually a shorter version of the name.

Returns

Name
Type
Description

_0

string

undefined

totalSupply

function totalSupply() external view returns (uint256)

See {IERC20-totalSupply}.

Returns

Name
Type
Description

_0

uint256

undefined

transfer

function transfer(address to, uint256 amount) external nonpayable returns (bool)

See {IERC20-transfer}. Requirements: - to cannot be the zero address. - the caller must have a balance of at least amount.

Parameters

Name
Type
Description

to

address

undefined

amount

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

transferFrom

function transferFrom(address from, address to, uint256 amount) external nonpayable returns (bool)

See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum uint256. Requirements: - from and to cannot be the zero address. - from must have a balance of at least amount. - the caller must have allowance for from's tokens of at least amount.

Parameters

Name
Type
Description

from

address

undefined

to

address

undefined

amount

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

vestingEscrow

function vestingEscrow(uint256 _index) external view returns (address)

Get the address of the escrow for a vesting schedule

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule

Returns

Name
Type
Description

_0

address

address of the escrow

Events

Approval

event Approval(address indexed owner, address indexed spender, uint256 value)

Emitted when the allowance of a spender for an owner is set by a call to {approve}. value is the new allowance.

Parameters

Name
Type
Description

owner indexed

address

undefined

spender indexed

address

undefined

value

uint256

undefined

CreatedVestingSchedule

event CreatedVestingSchedule(uint256 index, address indexed creator, address indexed beneficiary, uint256 amount)

A new vesting schedule has been created

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

creator indexed

address

Creator of the vesting schedule

beneficiary indexed

address

Vesting beneficiary address

amount

uint256

Vesting schedule amount

DelegateChanged

event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)

Emitted when an account changes their delegate.

Parameters

Name
Type
Description

delegator indexed

address

undefined

fromDelegate indexed

address

undefined

toDelegate indexed

address

undefined

DelegateVotesChanged

event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance)

Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.

Parameters

Name
Type
Description

delegate indexed

address

undefined

previousBalance

uint256

undefined

newBalance

uint256

undefined

DelegatedVestingEscrow

event DelegatedVestingEscrow(uint256 index, address indexed oldDelegatee, address indexed newDelegatee, address indexed beneficiary)

Vesting escrow has been delegated

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

oldDelegatee indexed

address

old delegatee

newDelegatee indexed

address

new delegatee

beneficiary indexed

address

vesting schedule beneficiary

EIP712DomainChanged

event EIP712DomainChanged()

MAY be emitted to signal that the domain could have changed.

Initialized

event Initialized(uint8 version)

Triggered when the contract has been initialized or reinitialized.

Parameters

Name
Type
Description

version

uint8

undefined

ReleasedVestingSchedule

event ReleasedVestingSchedule(uint256 index, uint256 releasedAmount)

Vesting schedule has been released

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

releasedAmount

uint256

Amount of tokens released to the beneficiary

RevokedVestingSchedule

event RevokedVestingSchedule(uint256 index, uint256 returnedAmount, uint256 newEnd)

Vesting schedule has been revoked

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

returnedAmount

uint256

Amount of tokens returned to the creator

newEnd

uint256

New end timestamp after revoke action

Transfer

event Transfer(address indexed from, address indexed to, uint256 value)

Emitted when value tokens are moved from one account (from) to another (to). Note that value may be zero.

Parameters

Name
Type
Description

from indexed

address

undefined

to indexed

address

undefined

value

uint256

undefined

Errors

GlobalUnlockUnderlfow

error GlobalUnlockUnderlfow()

Underflow in global unlock logic (should never happen)

InvalidRevokedVestingScheduleEnd

error InvalidRevokedVestingScheduleEnd()

Attempt to revoke a vesting schedule with an invalid end parameter

InvalidVestingScheduleParameter

error InvalidVestingScheduleParameter(string msg)

Invalid parameter for a vesting schedule

Parameters

Name
Type
Description

msg

string

undefined

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

Unauthorized

error Unauthorized(address caller)

The operator is unauthorized for the caller

Parameters

Name
Type
Description

caller

address

Address performing the call

UnsufficientVestingScheduleCreatorBalance

error UnsufficientVestingScheduleCreatorBalance()

Vesting schedule creator has unsufficient balance to create vesting schedule

VestingScheduleIsLocked

error VestingScheduleIsLocked()

The vesting schedule is locked

VestingScheduleNotFound

error VestingScheduleNotFound(uint256 index)

The VestingSchedule was not found

Parameters

Name
Type
Description

index

uint256

vesting schedule index

VestingScheduleNotRevocable

error VestingScheduleNotRevocable()

The vesting schedule is not revocable

VestingScheduleNotRevocableInPast

error VestingScheduleNotRevocableInPast()

Attempt to revoke a schedule in the past

ZeroReleasableAmount

error ZeroReleasableAmount()

No token to release

Slashing Coverage Program
Operate Validator Nodes
cast
Alluvial documentation
Alluvial Onboarding API

Initializable

Alluvial Finance Inc.

Initializable

This contract ensures that initializers are called only once per version

Events

Initialize

Emitted when the contract is properly initialized

Parameters

Errors

InvalidInitialization

An error occurred during the initialization

Parameters

AllowlistV1

Alluvial Finance Inc.

Allowlist (v1)

This contract handles the list of allowed recipients.All accounts have an uint256 value associated with their addresses where each bit represents a right in the system. The DENY_MASK defined the mask used to identify if the denied bit is on, preventing users from interacting with the system

Methods

acceptAdmin

Accept the transfer of ownership

Only callable by the pending admin. Resets the pending admin if successful.

getAdmin

Retrieves the current admin address

Returns

getAllower

Retrieves the allower address

Returns

getDenier

Retrieves the denier address

Returns

getPendingAdmin

Retrieve the current pending admin address

Returns

getPermissions

This method retrieves the raw permission value

Parameters

Returns

hasPermission

This method returns true if the user has the expected permission ignoring any deny list membership

Parameters

Returns

initAllowlistV1

Initializes the allowlist

Parameters

initAllowlistV1_1

Initializes the allowlist denier

Parameters

isAllowed

This method returns true if the user has the expected permission and is not in the deny list

Parameters

Returns

isDenied

This method returns true if the user is in the deny list

Parameters

Returns

onlyAllowed

This method should be used as a modifier and is expected to revert if the user hasn't got the required permission or if the user is in the deny list.

Parameters

proposeAdmin

Proposes a new address as admin

This security prevents setting an invalid address as an admin. The pending admin has to claim its ownership of the contract, and prove that the new address is able to perform regular transactions.

Parameters

setAllowPermissions

Sets the allow permissions for one or more accounts

This function is for allocating or removing deposit, redeem or donate permissions. This function could be used to give any permissions that we come up with in the future. An address which was denied has to be undenied first before they could be given any permission(s).

Parameters

setAllower

Changes the allower address

Parameters

setDenier

Changes the denier address

Parameters

setDenyPermissions

Sets the deny permissions for one or more accounts

This function is for allocating or removing deny permissions. An address which is undenied has to be given permissions again for them to be able to deposit, donate or redeem.

Parameters

version

Retrieves the version of the contract

Returns

Events

Initialize

Emitted when the contract is properly initialized

Parameters

SetAdmin

The admin address changed

Parameters

SetAllower

The stored allower address has been changed

Parameters

SetAllowlistPermissions

The permissions of several accounts have changed

Parameters

SetDenier

The stored denier address has been changed

Parameters

SetPendingAdmin

The pending admin address changed

Parameters

Errors

AttemptToRemoveDenyPermission

Allower can't remove deny permission

AttemptToSetDenyPermission

Allower can't set deny permission

Denied

The account is denied access

Parameters

InvalidCount

The provided accounts list is empty

InvalidInitialization

An error occurred during the initialization

Parameters

InvalidZeroAddress

The address is zero

MismatchedArrayLengths

The provided accounts and permissions list have different lengths

Unauthorized

The operator is unauthorized for the caller

Parameters

RiverV1

Alluvial Finance Inc.

River (v1)

This contract merges all the manager contracts and implements all the virtual methods stitching all components together.

  1. Operators add BLS Public Keys of validators running in their infrastructure.

  2. User deposits ETH to the system and gets LsTokens minted in exchange.

  3. Upon deposit, the system verifies if the User is allowed to deposit by querying the Allowlist.

  4. When the system has enough funds to deposit validators, keys are pulled from the Operators Registry.

  5. The deposit data is computed and the validators are funded via the OfficialDeposit contract.

  6. Oracles report the total balance of the running validators and the total count of running validators.

  7. The running validators propose blocks that reward the EL Fee Recipient. The funds are pulled back in the system.

Methods

DEPOSIT_SIZE

Size of a deposit in ETH

Returns

PUBLIC_KEY_LENGTH

Size of a BLS Public key in bytes

Returns

SIGNATURE_LENGTH

Size of a BLS Signature in bytes

Returns

_DEPOSIT_SIZE

Size of a deposit in ETH

Returns

acceptAdmin

Accept the transfer of ownership

Only callable by the pending admin. Resets the pending admin if successful.

allowance

Retrieve the allowance value for a spender

Parameters

Returns

approve

Approves an account for future spendings

An approved account can use transferFrom to transfer funds on behalf of the token owner

Parameters

Returns

balanceOf

Retrieve the balance of an account

Parameters

Returns

balanceOfUnderlying

Retrieve the underlying asset balance of an account

Parameters

Returns

claimRedeemRequests

Claims several redeem requests

Parameters

Returns

decimals

Retrieve the decimal count

Returns

decreaseAllowance

Decrease allowance to another account

Parameters

Returns

deposit

Explicit deposit method to mint on msg.sender

depositAndTransfer

Explicit deposit method to mint on msg.sender and transfer to _recipient

Parameters

depositToConsensusLayerWithDepositRoot

Deposits current balance to the Consensus Layer by batches of 32 ETH

Parameters

getAdmin

Retrieves the current admin address

Returns

getAllowlist

Retrieve the allowlist address

Returns

getBalanceToDeposit

Returns the amount of ETH not yet committed for deposit

Returns

getBalanceToRedeem

Retrieve the current balance to redeem

Returns

getCLSpec

Retrieve the current cl spec

Returns

getCLValidatorCount

Get CL validator count (the amount of validator reported by the oracles)

Returns

getCLValidatorTotalBalance

Get CL validator total balance

Returns

getCollector

Retrieve the collector address

Returns

getCommittedBalance

Returns the amount of ETH committed for deposit

Returns

getCoverageFund

Retrieve the coverage fund

Returns

getCurrentEpochId

Retrieve the current epoch id based on block timestamp

Returns

getCurrentFrame

Retrieve the current frame details

Returns

getDailyCommittableLimits

Retrieve the configured daily committable limits

Returns

getDepositedValidatorCount

Get the deposited validator count (the count of deposits made by the contract)

Returns

getELFeeRecipient

Retrieve the execution layer fee recipient

Returns

getExpectedEpochId

Retrieve expected epoch id

Returns

getFrameFirstEpochId

Retrieve the first epoch id of the frame of the provided epoch id

Parameters

Returns

getGlobalFee

Get the current global fee

Returns

getKeeper

Get the keeper address

Returns

getLastCompletedEpochId

Retrieve the last completed epoch id

Returns

getLastConsensusLayerReport

Retrieve the last consensus layer report

Returns

getMetadataURI

Retrieve the metadata uri string value

Returns

getOperatorsRegistry

Retrieve the operators registry

Returns

getOracle

Get oracle address

Returns

getPendingAdmin

Retrieve the current pending admin address

Returns

getRedeemManager

Retrieve the redeem manager

Returns

getReportBounds

Retrieve the report bounds

Returns

getTime

Retrieve the block timestamp

Returns

getWithdrawalCredentials

Retrieve the withdrawal credentials

Returns

increaseAllowance

Increase allowance to another account

Parameters

Returns

initRiverV1

Initializes the River system

Parameters

initRiverV1_1

Initialized version 1.1 of the River System

Parameters

initRiverV1_2

Initializes version 1.2 of the River System

isValidEpoch

Verifies if the provided epoch is valid

Parameters

Returns

name

Retrieve the token name

Returns

proposeAdmin

Proposes a new address as admin

This security prevents setting an invalid address as an admin. The pending admin has to claim its ownership of the contract, and prove that the new address is able to perform regular transactions.

Parameters

requestRedeem

Performs a redeem request on the redeem manager

Parameters

Returns

resolveRedeemRequests

Resolves the provided redeem requests by calling the redeem manager

Parameters

Returns

sendCLFunds

Input for consensus layer funds, containing both exit and skimming

sendCoverageFunds

Input for coverage funds

sendELFees

Input for execution layer fee earnings

sendRedeemManagerExceedingFunds

Input for the redeem manager funds

setAllowlist

Changes the allowlist address

Parameters

setCLSpec

Parameters

setCollector

Changes the collector address

Parameters

setConsensusLayerData

Parameters

setCoverageFund

Changes the coverage fund

Parameters

setDailyCommittableLimits

Parameters

setELFeeRecipient

Changes the execution layer fee recipient

Parameters

setGlobalFee

Changes the global fee parameter

Parameters

setKeeper

Parameters

setMetadataURI

Sets the metadata uri string value

Parameters

setOracle

Set the oracle address

Parameters

setReportBounds

Parameters

sharesFromUnderlyingBalance

Retrieve the shares count from an underlying asset amount

Parameters

Returns

symbol

Retrieve the token symbol

Returns

totalSupply

Retrieve the total token supply

Returns

totalUnderlyingSupply

Retrieve the total underlying asset supply

Returns

transfer

Performs a transfer from the message sender to the provided account

Parameters

Returns

transferFrom

Performs a transfer between two recipients

Parameters

Returns

underlyingBalanceFromShares

Retrieve the underlying asset balance from an amount of shares

Parameters

Returns

version

Retrieves the version of the contract

Returns

Events

Approval

Emitted when the allowance of a spender for an owner is set by a call to {approve}. value is the new allowance.

Parameters

ConsensusLayerDataUpdate

The consensus layer data provided by the oracle has been updated

Parameters

Initialize

Emitted when the contract is properly initialized

Parameters

ProcessedConsensusLayerReport

The provided report has been processed

Parameters

PulledCLFunds

Emitted when funds are pulled from the CL recipient

Parameters

PulledCoverageFunds

Funds have been pulled from the Coverage Fund

Parameters

PulledELFees

Funds have been pulled from the Execution Layer Fee Recipient

Parameters

PulledRedeemManagerExceedingEth

Emitted when funds are pulled from the redeem manager

Parameters

ReportedRedeemManager

Emitted when the redeem manager received a withdraw event report

Parameters

RewardsEarned

The system underlying supply increased. This is a snapshot of the balances for accounting purposes

Parameters

SetAdmin

The admin address changed

Parameters

SetAllowlist

The stored Allowlist has been changed

Parameters

SetBalanceCommittedToDeposit

Emitted when the balance committed to deposit

Parameters

SetBalanceToDeposit

Emitted when the balance to deposit is updated

Parameters

SetBalanceToRedeem

Emitted when the balance to redeem is updated

Parameters

SetBounds

The Report Bounds are changed

Parameters

SetCollector

The stored Collector has been changed

Parameters

SetCoverageFund

The stored Coverage Fund has been changed

Parameters

SetDepositContractAddress

The stored deposit contract address changed

Parameters

SetDepositedValidatorCount

Emitted when the deposited validator count is updated

Parameters

SetELFeeRecipient

The stored Execution Layer Fee Recipient has been changed

Parameters

SetGlobalFee

The stored Global Fee has been changed

Parameters

SetMaxDailyCommittableAmounts

Emitted when the daily committable limits are changed

Parameters

SetMetadataURI

The stored Metadata URI string has been changed

Parameters

SetOperatorsRegistry

The stored Operators Registry has been changed

Parameters

SetOracle

The stored oracle address changed

Parameters

SetPendingAdmin

The pending admin address changed

Parameters

SetRedeemManager

Emitted when the redeem manager address is changed

Parameters

SetSpec

The Consensus Layer Spec is changed

Parameters

SetTotalSupply

Emitted when the total supply is changed

Parameters

SetWithdrawalCredentials

The stored withdrawal credentials changed

Parameters

Transfer

Emitted when value tokens are moved from one account (from) to another (to). Note that value may be zero.

Parameters

UserDeposit

User deposited ETH in the system

Parameters

Errors

AllowanceTooLow

Allowance too low to perform operation

Parameters

BalanceTooLow

Balance too low to perform operation

Denied

The access was denied

Parameters

EmptyDeposit

And empty deposit attempt was made

ErrorOnDeposit

An error occurred during the deposit

InconsistentPublicKeys

The length of the BLS Public key is invalid during deposit

InconsistentSignatures

The length of the BLS Signature is invalid during deposit

InvalidArgument

The argument was invalid

InvalidCall

The call was invalid

InvalidDecreasingValidatorsExitedBalance

The total exited balance decreased

Parameters

InvalidDecreasingValidatorsSkimmedBalance

The total skimmed balance decreased

Parameters

InvalidDepositRoot

Invalid deposit root

InvalidEmptyString

The string is empty

InvalidEpoch

Thrown when an invalid epoch was reported

Parameters

InvalidFee

The fee is invalid

InvalidInitialization

An error occurred during the initialization

Parameters

InvalidPublicKeyCount

The received count of public keys to deposit is invalid

InvalidPulledClFundsAmount

Thrown when the amount received from the Withdraw contract doe not match the requested amount

Parameters

InvalidSignatureCount

The received count of signatures to deposit is invalid

InvalidValidatorCountReport

The reported validator count is invalid

Parameters

InvalidWithdrawalCredentials

The withdrawal credentials value is null

InvalidZeroAddress

The address is zero

NoAvailableValidatorKeys

The internal key retrieval returned no keys

NotEnoughFunds

Not enough funds to deposit one validator

NullTransfer

Invalid empty transfer

OnlyKeeper

SliceOutOfBounds

The slice is outside of the initial bytes bounds

SliceOverflow

The length overflows an uint

TotalValidatorBalanceDecreaseOutOfBound

The balance decrease is higher than the maximum allowed by the lower bound

Parameters

TotalValidatorBalanceIncreaseOutOfBound

The balance increase is higher than the maximum allowed by the upper bound

Parameters

Unauthorized

The operator is unauthorized for the caller

Parameters

UnauthorizedTransfer

Invalid transfer recipients

Parameters

ZeroMintedShares

The computed amount of shares to mint is 0

TUPProxy

Alluvial Finance Inc.

TUPProxy (Transparent Upgradeable Pausable Proxy)

This contract extends the Transparent Upgradeable proxy and adds a system wide pause feature. When the system is paused, the fallback will fail no matter what calls are made. Address Zero is allowed to perform calls even if paused to allow view calls made from RPC providers to properly work.

Methods

pause

Pauses system

paused

Retrieves Paused state

Returns

unpause

Unpauses system

Events

AdminChanged

Emitted when the admin account has changed.

Parameters

BeaconUpgraded

Emitted when the beacon is changed.

Parameters

Paused

The system is now paused

Parameters

Unpaused

The system is now unpaused

Parameters

Upgraded

Emitted when the implementation is upgraded.

Parameters

Errors

CallWhenPaused

A call happened while the system was paused

WithdrawV1

Alluvial Finance Inc.

Withdraw (v1)

This contract is in charge of holding the exit and skimming funds and allow river to pull these funds

Methods

getCredentials

Retrieve the withdrawal credentials to use

Returns

getRiver

Retrieve the linked River address

Returns

initializeWithdrawV1

Parameters

pullEth

Callable by River, sends the specified amount of ETH to River

Parameters

version

Retrieves the version of the contract

Returns

Events

Initialize

Emitted when the contract is properly initialized

Parameters

SetRiver

Emitted when the linked River address is changed

Parameters

Errors

InvalidInitialization

An error occurred during the initialization

Parameters

InvalidZeroAddress

The address is zero

Unauthorized

The operator is unauthorized for the caller

Parameters

WLSETHV1

Alluvial Finance Inc.

Wrapped LsETH (v1)

This contract wraps the LsETH token into a rebase token, more suitable for some DeFi use-cases like stable swaps.

Methods

allowance

Retrieves the token allowance given from one address to another

Parameters

Returns

approve

Approves another account to transfer tokens

Parameters

Returns

balanceOf

Retrieves the token balance of the specified user

Parameters

Returns

burn

Burn tokens and retrieve underlying LsETH tokens

The message sender burns shares from its balance for the LsETH equivalent valueThe message sender doesn't need to approve the contract to burn the sharesThe freed LsETH is sent to the specified recipient

Parameters

decimals

Retrieves the token decimal count

Returns

decreaseAllowance

Decrease allowance to another account

Parameters

Returns

increaseAllowance

Increase allowance to another account

Parameters

Returns

initWLSETHV1

Initializes the wrapped token contract

Parameters

mint

Mint tokens by providing LsETH tokens

The message sender locks LsETH tokens and received wrapped LsETH tokens in exchangeThe message sender needs to approve the contract to mint the wrapped tokensThe minted wrapped LsETH is sent to the specified recipient

Parameters

name

Retrieves the token full name

Returns

sharesOf

Retrieves the raw shares count of the user

Parameters

Returns

symbol

Retrieves the token symbol

Returns

totalSupply

Retrieves the token total supply

Returns

transfer

Transfers tokens between the message sender and a recipient

Parameters

Returns

transferFrom

Transfers tokens between two accounts

It is expected that _from has given at least _value allowance to msg.sender

Parameters

Returns

Events

Approval

An approval has been made

Parameters

Burn

Tokens have been burned

Parameters

Initialized

Triggered when the contract has been initialized or reinitialized.

Parameters

Mint

Tokens have been minted

Parameters

SetRiver

The stored value of river has been changed

Parameters

Transfer

A transfer has been made

Parameters

Errors

AllowanceTooLow

Allowance too low to perform operation

Parameters

BalanceTooLow

Balance too low to perform operation

InvalidZeroAddress

The address is zero

NullTransfer

Invalid empty transfer

TokenTransferError

The token transfer failed during the minting or burning process

UnauthorizedTransfer

Invalid transfer recipients

Parameters

OracleV1

Alluvial Finance Inc.

Oracle (v1)

This contract handles the input from the allowed oracle members. Highly inspired by Lido's implementation.

Methods

acceptAdmin

Accept the transfer of ownership

Only callable by the pending admin. Resets the pending admin if successful.

addMember

Adds new address as oracle member, giving the ability to push cl reports.

Only callable by the administrator. Modifying the quorum clears all the reporting data

Parameters

getAdmin

Retrieves the current admin address

Returns

getGlobalReportStatus

Retrieve member report status

Returns

getLastReportedEpochId

Retrieve the last reported epoch id

The Oracle contracts expects reports on an epoch id >= that the returned value

Returns

getMemberReportStatus

Retrieve member report status

Parameters

Returns

getOracleMembers

Retrieve the list of oracle members

Returns

getPendingAdmin

Retrieve the current pending admin address

Returns

getQuorum

Retrieve the current quorum

Returns

getReportVariantDetails

Retrieve the details of a report variant

Parameters

Returns

getReportVariantsCount

Retrieve report variants count

Returns

getRiver

Retrieve River address

Returns

initOracleV1

Initializes the oracle

Parameters

initOracleV1_1

Initializes the oracle

isMember

Returns true if address is member

Performs a naive search, do not call this on-chain, used as an off-chain helper

Parameters

Returns

proposeAdmin

Proposes a new address as admin

This security prevents setting an invalid address as an admin. The pending admin has to claim its ownership of the contract, and prove that the new address is able to perform regular transactions.

Parameters

removeMember

Removes an address from the oracle members.

Only callable by the administrator. Modifying the quorum clears all the reporting dataRemaining members that have already voted should vote again for the same frame.

Parameters

reportConsensusLayerData

Parameters

setMember

Changes the address of an oracle member

Only callable by the administrator or the member itselfCannot use an address already in use

Parameters

setQuorum

Edits the quorum required to forward cl data to River

Modifying the quorum clears all the reporting data

Parameters

version

Retrieves the version of the contract

Returns

Events

AddMember

A member has been added to the oracle member list

Parameters

ClearedReporting

Cleared reporting data

Initialize

Emitted when the contract is properly initialized

Parameters

RemoveMember

A member has been removed from the oracle member list

Parameters

ReportedConsensusLayerData

An oracle member performed a report

Parameters

SetAdmin

The admin address changed

Parameters

SetBounds

The report bounds have been changed

Parameters

SetLastReportedEpoch

The last reported epoch has changed

Parameters

SetMember

A member address has been edited

Parameters

SetPendingAdmin

The pending admin address changed

Parameters

SetQuorum

The storage quorum value has been changed

Parameters

SetRiver

The storage river address value has been changed

Parameters

SetSpec

The consensus layer spec has been changed

Parameters

Errors

AddressAlreadyInUse

The address is already in use by an oracle member

Parameters

AlreadyReported

The member already reported on the given epoch id

Parameters

EpochTooOld

The provided epoch is too old compared to the expected epoch id

Parameters

InvalidArgument

The argument was invalid

InvalidCall

The call was invalid

InvalidEpoch

Thrown when the reported epoch is invalid

Parameters

InvalidInitialization

An error occurred during the initialization

Parameters

InvalidZeroAddress

The address is zero

ReportIndexOutOfBounds

Thrown when the report indexes fetched is out of bounds

Parameters

Unauthorized

The operator is unauthorized for the caller

Parameters

River (LsETH)

OperatorsRegistry

Oracle

Allowlist

Withdraw

ELFeeRecipient

RedeemManager

Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
0x8c1BEd5b9a0928467c9B1341Da1D7BD5e10b6549
0x1d8b30cC38Dba8aBce1ac29Ea27d9cFd05379A09
0x1235f1b60df026B2620e48E735C422425E06b725
0xCb8641aF17e19976245bEB68CD50f61c5779b294
0x895a57eD71025D51fe4080530A3489D92E230683
0xc8D639f014a78B1cEc17761BFD9E8c80919efbc6
0xebc83Bb472b2816Ec5B5de8D34F0eFc9088BB2ce
0x5C783DCD596dad2bDe930f22C3684E77E25b6436
0x0AFd81862eEA47322Cf85Db39D3D07e8A3c25154
0xAaF99F2F0C47EF32AB9B5aa3e117c9190b37Ff88
0x7D16d2c4e96BCFC8f815E15b771aC847EcbDB48b
0x4E44868856A26F4cbB431cC144318D4E7F39a585
0x080b3a41390b357Ad7e8097644d1DEDf57AD3375
0x0693875efbF04dDAd955c04332bA3324472DF980
event Initialize(uint256 version, bytes cdata)

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

error InvalidInitialization(uint256 version, uint256 expectedVersion)

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

function acceptAdmin() external nonpayable
function getAdmin() external view returns (address)

_0

address

The admin address

function getAllower() external view returns (address)

_0

address

The address of the allower

function getDenier() external view returns (address)

_0

address

The address of the denier

function getPendingAdmin() external view returns (address)

_0

address

The pending admin address

function getPermissions(address _account) external view returns (uint256)

_account

address

Recipient to verify

_0

uint256

The raw permissions value of the account

function hasPermission(address _account, uint256 _mask) external view returns (bool)

_account

address

Recipient to verify

_mask

uint256

Combination of permissions to verify

_0

bool

True if mask is respected

function initAllowlistV1(address _admin, address _allower) external nonpayable

_admin

address

Address of the Allowlist administrator

_allower

address

Address of the allower

function initAllowlistV1_1(address _denier) external nonpayable

_denier

address

Address of the denier

function isAllowed(address _account, uint256 _mask) external view returns (bool)

_account

address

Recipient to verify

_mask

uint256

Combination of permissions to verify

_0

bool

True if mask is respected and user is allowed

function isDenied(address _account) external view returns (bool)

_account

address

Recipient to verify

_0

bool

True if user is denied access

function onlyAllowed(address _account, uint256 _mask) external view

_account

address

Recipient to verify

_mask

uint256

Combination of permissions to verify

function proposeAdmin(address _newAdmin) external nonpayable

_newAdmin

address

New admin address

function setAllowPermissions(address[] _accounts, uint256[] _permissions) external nonpayable

_accounts

address[]

Accounts to update

_permissions

uint256[]

New permission values

function setAllower(address _newAllowerAddress) external nonpayable

_newAllowerAddress

address

New address allowed to edit the allowlist

function setDenier(address _newDenierAddress) external nonpayable

_newDenierAddress

address

New address allowed to edit the allowlist

function setDenyPermissions(address[] _accounts, uint256[] _permissions) external nonpayable

_accounts

address[]

Accounts to update

_permissions

uint256[]

New permission values

function version() external pure returns (string)

_0

string

Version of the contract

event Initialize(uint256 version, bytes cdata)

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

event SetAdmin(address indexed admin)

admin indexed

address

New admin address

event SetAllower(address indexed allower)

allower indexed

address

The new allower address

event SetAllowlistPermissions(address[] accounts, uint256[] permissions)

accounts

address[]

List of accounts

permissions

uint256[]

New permissions for each account at the same index

event SetDenier(address indexed denier)

denier indexed

address

The new denier address

event SetPendingAdmin(address indexed pendingAdmin)

pendingAdmin indexed

address

New pending admin address

error AttemptToRemoveDenyPermission()
error AttemptToSetDenyPermission()
error Denied(address _account)

_account

address

The denied account

error InvalidCount()
error InvalidInitialization(uint256 version, uint256 expectedVersion)

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

error InvalidZeroAddress()
error MismatchedArrayLengths()
error Unauthorized(address caller)

caller

address

Address performing the call

function DEPOSIT_SIZE() external view returns (uint256)

_0

uint256

undefined

function PUBLIC_KEY_LENGTH() external view returns (uint256)

_0

uint256

undefined

function SIGNATURE_LENGTH() external view returns (uint256)

_0

uint256

undefined

function _DEPOSIT_SIZE() external view returns (uint256)

_0

uint256

undefined

function acceptAdmin() external nonpayable
function allowance(address _owner, address _spender) external view returns (uint256)

_owner

address

Address that issued the allowance

_spender

address

Address that received the allowance

_0

uint256

The allowance in shares for a given spender

function approve(address _spender, uint256 _value) external nonpayable returns (bool)

_spender

address

Address that is allowed to spend the tokens

_value

uint256

The allowed amount in shares, will override previous value

_0

bool

True if success

function balanceOf(address _owner) external view returns (uint256)

_owner

address

Address to be checked

_0

uint256

The balance of the account in shares

function balanceOfUnderlying(address _owner) external view returns (uint256)

_owner

address

Address to be checked

_0

uint256

The underlying balance of the account

function claimRedeemRequests(uint32[] _redeemRequestIds, uint32[] _withdrawalEventIds) external nonpayable returns (uint8[] claimStatuses)

_redeemRequestIds

uint32[]

The list of redeem requests to claim

_withdrawalEventIds

uint32[]

The list of resolved withdrawal event ids

claimStatuses

uint8[]

The operation status results

function decimals() external pure returns (uint8)

_0

uint8

The decimal count

function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)

_spender

address

Spender that receives the allowance

_subtractableValue

uint256

Amount of shares to subtract

_0

bool

True if success

function deposit() external payable
function depositAndTransfer(address _recipient) external payable

_recipient

address

Address receiving the minted LsETH

function depositToConsensusLayerWithDepositRoot(uint256 _maxCount, bytes32 _depositRoot) external nonpayable

_maxCount

uint256

The maximum amount of validator keys to fund

_depositRoot

bytes32

The root of the deposit tree

function getAdmin() external view returns (address)

_0

address

The admin address

function getAllowlist() external view returns (address)

_0

address

The allowlist address

function getBalanceToDeposit() external view returns (uint256)

_0

uint256

The amount of ETH not yet committed for deposit

function getBalanceToRedeem() external view returns (uint256)

_0

uint256

The current balance to redeem

function getCLSpec() external view returns (struct CLSpec.CLSpecStruct)

_0

CLSpec.CLSpecStruct

The Consensus Layer Specification

function getCLValidatorCount() external view returns (uint256)

_0

uint256

The CL validator count

function getCLValidatorTotalBalance() external view returns (uint256)

_0

uint256

The CL Validator total balance

function getCollector() external view returns (address)

_0

address

The collector address

function getCommittedBalance() external view returns (uint256)

_0

uint256

The amount of ETH committed for deposit

function getCoverageFund() external view returns (address)

_0

address

The coverage fund address

function getCurrentEpochId() external view returns (uint256)

_0

uint256

The current epoch id

function getCurrentFrame() external view returns (uint256 _startEpochId, uint256 _startTime, uint256 _endTime)

_startEpochId

uint256

The epoch at the beginning of the frame

_startTime

uint256

The timestamp of the beginning of the frame in seconds

_endTime

uint256

The timestamp of the end of the frame in seconds

function getDailyCommittableLimits() external view returns (struct DailyCommittableLimits.DailyCommittableLimitsStruct)

_0

DailyCommittableLimits.DailyCommittableLimitsStruct

The daily committable limits structure

function getDepositedValidatorCount() external view returns (uint256)

_0

uint256

The deposited validator count

function getELFeeRecipient() external view returns (address)

_0

address

The execution layer fee recipient address

function getExpectedEpochId() external view returns (uint256)

_0

uint256

The current expected epoch id

function getFrameFirstEpochId(uint256 _epochId) external view returns (uint256)

_epochId

uint256

Epoch id used to get the frame

_0

uint256

The first epoch id of the frame containing the given epoch id

function getGlobalFee() external view returns (uint256)

_0

uint256

The global fee

function getKeeper() external view returns (address)

_0

address

The keeper address

function getLastCompletedEpochId() external view returns (uint256)

_0

uint256

The last completed epoch id

function getLastConsensusLayerReport() external view returns (struct IOracleManagerV1.StoredConsensusLayerReport)

_0

IOracleManagerV1.StoredConsensusLayerReport

The stored consensus layer report

function getMetadataURI() external view returns (string)

_0

string

The metadata uri string value

function getOperatorsRegistry() external view returns (address)

_0

address

The operators registry address

function getOracle() external view returns (address)

_0

address

The oracle address

function getPendingAdmin() external view returns (address)

_0

address

The pending admin address

function getRedeemManager() external view returns (address)

_0

address

The redeem manager address

function getReportBounds() external view returns (struct ReportBounds.ReportBoundsStruct)

_0

ReportBounds.ReportBoundsStruct

The report bounds

function getTime() external view returns (uint256)

_0

uint256

The current timestamp from the EVM context

function getWithdrawalCredentials() external view returns (bytes32)

_0

bytes32

The withdrawal credentials

function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)

_spender

address

Spender that receives the allowance

_additionalValue

uint256

Amount of shares to add

_0

bool

True if success

function initRiverV1(address _depositContractAddress, address _elFeeRecipientAddress, bytes32 _withdrawalCredentials, address _oracleAddress, address _systemAdministratorAddress, address _allowlistAddress, address _operatorRegistryAddress, address _collectorAddress, uint256 _globalFee) external nonpayable

_depositContractAddress

address

Address to make Consensus Layer deposits

_elFeeRecipientAddress

address

Address that receives the execution layer fees

_withdrawalCredentials

bytes32

Credentials to use for every validator deposit

_oracleAddress

address

The address of the Oracle contract

_systemAdministratorAddress

address

Administrator address

_allowlistAddress

address

Address of the allowlist contract

_operatorRegistryAddress

address

Address of the operator registry

_collectorAddress

address

Address receiving the the global fee on revenue

_globalFee

uint256

Amount retained when the ETH balance increases and sent to the collector

function initRiverV1_1(address _redeemManager, uint64 _epochsPerFrame, uint64 _slotsPerEpoch, uint64 _secondsPerSlot, uint64 _genesisTime, uint64 _epochsToAssumedFinality, uint256 _annualAprUpperBound, uint256 _relativeLowerBound, uint128 _minDailyNetCommittableAmount_, uint128 _maxDailyRelativeCommittableAmount_) external nonpayable

_redeemManager

address

The redeem manager address

_epochsPerFrame

uint64

The amounts of epochs in a frame

_slotsPerEpoch

uint64

The slots inside an epoch

_secondsPerSlot

uint64

The seconds inside a slot

_genesisTime

uint64

The genesis timestamp

_epochsToAssumedFinality

uint64

The number of epochs before an epoch is considered final on-chain

_annualAprUpperBound

uint256

The reporting upper bound

_relativeLowerBound

uint256

The reporting lower bound

minDailyNetCommittableAmount

uint128

undefined

maxDailyRelativeCommittableAmount

uint128

The relative daily committable limit

function initRiverV1_2() external nonpayable
function isValidEpoch(uint256 _epoch) external view returns (bool)

_epoch

uint256

undefined

_0

bool

True if valid

function name() external pure returns (string)

_0

string

The token name

function proposeAdmin(address _newAdmin) external nonpayable

_newAdmin

address

New admin address

function requestRedeem(uint256 _lsETHAmount, address _recipient) external nonpayable returns (uint32 _redeemRequestId)

_lsETHAmount

uint256

The amount of LsETH to redeem

_recipient

address

The address that will own the redeem request

_redeemRequestId

uint32

The ID of the newly created redeem request

function resolveRedeemRequests(uint32[] _redeemRequestIds) external view returns (int64[] withdrawalEventIds)

_redeemRequestIds

uint32[]

The list of redeem requests to resolve

withdrawalEventIds

int64[]

The list of matching withdrawal events, or error codes

function sendCLFunds() external payable
function sendCoverageFunds() external payable
function sendELFees() external payable
function sendRedeemManagerExceedingFunds() external payable
function setAllowlist(address _newAllowlist) external nonpayable

_newAllowlist

address

New address for the allowlist

function setCLSpec(CLSpec.CLSpecStruct _newValue) external nonpayable

_newValue

CLSpec.CLSpecStruct

undefined

function setCollector(address _newCollector) external nonpayable

_newCollector

address

New address for the collector

function setConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable

_report

IOracleManagerV1.ConsensusLayerReport

undefined

function setCoverageFund(address _newCoverageFund) external nonpayable

_newCoverageFund

address

New address for the fund

function setDailyCommittableLimits(DailyCommittableLimits.DailyCommittableLimitsStruct _dcl) external nonpayable

_dcl

DailyCommittableLimits.DailyCommittableLimitsStruct

undefined

function setELFeeRecipient(address _newELFeeRecipient) external nonpayable

_newELFeeRecipient

address

New address for the recipient

function setGlobalFee(uint256 _newFee) external nonpayable

_newFee

uint256

New fee value

function setKeeper(address _keeper) external nonpayable

_keeper

address

undefined

function setMetadataURI(string _metadataURI) external nonpayable

_metadataURI

string

The new metadata uri string value

function setOracle(address _oracleAddress) external nonpayable

_oracleAddress

address

Address of the oracle

function setReportBounds(ReportBounds.ReportBoundsStruct _newValue) external nonpayable

_newValue

ReportBounds.ReportBoundsStruct

undefined

function sharesFromUnderlyingBalance(uint256 _underlyingAssetAmount) external view returns (uint256)

_underlyingAssetAmount

uint256

Amount of underlying asset to convert

_0

uint256

The amount of shares worth the underlying asset amount

function symbol() external pure returns (string)

_0

string

The token symbol

function totalSupply() external view returns (uint256)

_0

uint256

The total supply in shares

function totalUnderlyingSupply() external view returns (uint256)

_0

uint256

The total underlying asset supply

function transfer(address _to, uint256 _value) external nonpayable returns (bool)

_to

address

Address receiving the tokens

_value

uint256

Amount of shares to be sent

_0

bool

True if success

function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)

_from

address

Address sending the tokens

_to

address

Address receiving the tokens

_value

uint256

Amount of shares to be sent

_0

bool

True if success

function underlyingBalanceFromShares(uint256 _shares) external view returns (uint256)

_shares

uint256

Amount of shares to convert

_0

uint256

The underlying asset balance represented by the shares

function version() external pure returns (string)

_0

string

Version of the contract

event Approval(address indexed owner, address indexed spender, uint256 value)

owner indexed

address

undefined

spender indexed

address

undefined

value

uint256

undefined

event ConsensusLayerDataUpdate(uint256 validatorCount, uint256 validatorTotalBalance, bytes32 roundId)

validatorCount

uint256

The new count of validators running on the consensus layer

validatorTotalBalance

uint256

The new total balance sum of all validators

roundId

bytes32

Round identifier

event Initialize(uint256 version, bytes cdata)

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

event ProcessedConsensusLayerReport(IOracleManagerV1.ConsensusLayerReport report, IOracleManagerV1.ConsensusLayerDataReportingTrace trace)

report

IOracleManagerV1.ConsensusLayerReport

The report that was provided

trace

IOracleManagerV1.ConsensusLayerDataReportingTrace

The trace structure providing more insights on internals

event PulledCLFunds(uint256 pulledSkimmedEthAmount, uint256 pullExitedEthAmount)

pulledSkimmedEthAmount

uint256

The amount of skimmed ETH pulled

pullExitedEthAmount

uint256

The amount of exited ETH pulled

event PulledCoverageFunds(uint256 amount)

amount

uint256

The amount pulled

event PulledELFees(uint256 amount)

amount

uint256

The amount pulled

event PulledRedeemManagerExceedingEth(uint256 amount)

amount

uint256

The amount pulled

event ReportedRedeemManager(uint256 redeemManagerDemand, uint256 suppliedRedeemManagerDemand, uint256 suppliedRedeemManagerDemandInEth)

redeemManagerDemand

uint256

The total demand in LsETH of the redeem manager

suppliedRedeemManagerDemand

uint256

The amount of LsETH demand actually supplied

suppliedRedeemManagerDemandInEth

uint256

The amount in ETH of the supplied demand

event RewardsEarned(address indexed _collector, uint256 _oldTotalUnderlyingBalance, uint256 _oldTotalSupply, uint256 _newTotalUnderlyingBalance, uint256 _newTotalSupply)

_collector indexed

address

The address of the collector during this event

_oldTotalUnderlyingBalance

uint256

Old total ETH balance under management by River

_oldTotalSupply

uint256

Old total supply in shares

_newTotalUnderlyingBalance

uint256

New total ETH balance under management by River

_newTotalSupply

uint256

New total supply in shares

event SetAdmin(address indexed admin)

admin indexed

address

New admin address

event SetAllowlist(address indexed allowlist)

allowlist indexed

address

The new Allowlist

event SetBalanceCommittedToDeposit(uint256 oldAmount, uint256 newAmount)

oldAmount

uint256

The old balance committed to deposit

newAmount

uint256

The new balance committed to deposit

event SetBalanceToDeposit(uint256 oldAmount, uint256 newAmount)

oldAmount

uint256

The old balance to deposit

newAmount

uint256

The new balance to deposit

event SetBalanceToRedeem(uint256 oldAmount, uint256 newAmount)

oldAmount

uint256

The old balance to redeem

newAmount

uint256

The new balance to redeem

event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)

annualAprUpperBound

uint256

The reporting upper bound

relativeLowerBound

uint256

The reporting lower bound

event SetCollector(address indexed collector)

collector indexed

address

The new Collector

event SetCoverageFund(address indexed coverageFund)

coverageFund indexed

address

The new Coverage Fund

event SetDepositContractAddress(address indexed depositContract)

depositContract indexed

address

Address of the deposit contract

event SetDepositedValidatorCount(uint256 oldDepositedValidatorCount, uint256 newDepositedValidatorCount)

oldDepositedValidatorCount

uint256

The old deposited validator count value

newDepositedValidatorCount

uint256

The new deposited validator count value

event SetELFeeRecipient(address indexed elFeeRecipient)

elFeeRecipient indexed

address

The new Execution Layer Fee Recipient

event SetGlobalFee(uint256 fee)

fee

uint256

The new Global Fee

event SetMaxDailyCommittableAmounts(uint256 minNetAmount, uint256 maxRelativeAmount)

minNetAmount

uint256

The minimum amount that must be used as the daily committable amount

maxRelativeAmount

uint256

The maximum amount that can be used as the daily committable amount, relative to the total underlying supply

event SetMetadataURI(string metadataURI)

metadataURI

string

The new Metadata URI string

event SetOperatorsRegistry(address indexed operatorRegistry)

operatorRegistry indexed

address

The new Operators Registry

event SetOracle(address indexed oracleAddress)

oracleAddress indexed

address

The new oracle address

event SetPendingAdmin(address indexed pendingAdmin)

pendingAdmin indexed

address

New pending admin address

event SetRedeemManager(address redeemManager)

redeemManager

address

The address of the redeem manager

event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime, uint64 epochsToAssumedFinality)

epochsPerFrame

uint64

The number of epochs inside a frame

slotsPerEpoch

uint64

The number of slots inside an epoch

secondsPerSlot

uint64

The number of seconds inside a slot

genesisTime

uint64

The genesis timestamp

epochsToAssumedFinality

uint64

The number of epochs before an epoch is considered final

event SetTotalSupply(uint256 totalSupply)

totalSupply

uint256

undefined

event SetWithdrawalCredentials(bytes32 withdrawalCredentials)

withdrawalCredentials

bytes32

The withdrawal credentials to use for deposits

event Transfer(address indexed from, address indexed to, uint256 value)

from indexed

address

undefined

to indexed

address

undefined

value

uint256

undefined

event UserDeposit(address indexed depositor, address indexed recipient, uint256 amount)

depositor indexed

address

Address performing the deposit

recipient indexed

address

Address receiving the minted shares

amount

uint256

Amount in ETH deposited

error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)

_from

address

Account where funds are sent from

_operator

address

Account attempting the transfer

_allowance

uint256

Current allowance

_value

uint256

Requested transfer value in shares

error BalanceTooLow()
error Denied(address account)

account

address

The account that was denied

error EmptyDeposit()
error ErrorOnDeposit()
error InconsistentPublicKeys()
error InconsistentSignatures()
error InvalidArgument()
error InvalidCall()
error InvalidDecreasingValidatorsExitedBalance(uint256 currentValidatorsExitedBalance, uint256 newValidatorsExitedBalance)

currentValidatorsExitedBalance

uint256

The current exited balance

newValidatorsExitedBalance

uint256

The new exited balance

error InvalidDecreasingValidatorsSkimmedBalance(uint256 currentValidatorsSkimmedBalance, uint256 newValidatorsSkimmedBalance)

currentValidatorsSkimmedBalance

uint256

The current exited balance

newValidatorsSkimmedBalance

uint256

The new exited balance

error InvalidDepositRoot()
error InvalidEmptyString()
error InvalidEpoch(uint256 epoch)

epoch

uint256

Invalid epoch

error InvalidFee()
error InvalidInitialization(uint256 version, uint256 expectedVersion)

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

error InvalidPublicKeyCount()
error InvalidPulledClFundsAmount(uint256 requested, uint256 received)

requested

uint256

The amount that was requested

received

uint256

The amount that was received

error InvalidSignatureCount()
error InvalidValidatorCountReport(uint256 providedValidatorCount, uint256 depositedValidatorCount, uint256 lastReportedValidatorCount)

providedValidatorCount

uint256

The received validator count value

depositedValidatorCount

uint256

The number of deposits performed by the system

lastReportedValidatorCount

uint256

The last reported validator count

error InvalidWithdrawalCredentials()
error InvalidZeroAddress()
error NoAvailableValidatorKeys()
error NotEnoughFunds()
error NullTransfer()
error OnlyKeeper()
error SliceOutOfBounds()
error SliceOverflow()
error TotalValidatorBalanceDecreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 relativeLowerBound)

prevTotalEthIncludingExited

uint256

The previous total balance, including all exited balance

postTotalEthIncludingExited

uint256

The post-report total balance, including all exited balance

timeElapsed

uint256

The time in seconds since last report

relativeLowerBound

uint256

The lower bound value that was used

error TotalValidatorBalanceIncreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 annualAprUpperBound)

prevTotalEthIncludingExited

uint256

The previous total balance, including all exited balance

postTotalEthIncludingExited

uint256

The post-report total balance, including all exited balance

timeElapsed

uint256

The time in seconds since last report

annualAprUpperBound

uint256

The upper bound value that was used

error Unauthorized(address caller)

caller

address

Address performing the call

error UnauthorizedTransfer(address _from, address _to)

_from

address

Account sending the funds in the invalid transfer

_to

address

Account receiving the funds in the invalid transfer

error ZeroMintedShares()
function pause() external nonpayable
function paused() external view returns (bool)

_0

bool

Paused state

function unpause() external nonpayable
event AdminChanged(address previousAdmin, address newAdmin)

previousAdmin

address

undefined

newAdmin

address

undefined

event BeaconUpgraded(address indexed beacon)

beacon indexed

address

undefined

event Paused(address admin)

admin

address

The admin at the time of the pause event

event Unpaused(address admin)

admin

address

The admin at the time of the unpause event

event Upgraded(address indexed implementation)

implementation indexed

address

undefined

error CallWhenPaused()
function getCredentials() external view returns (bytes32)

_0

bytes32

The withdrawal credentials

function getRiver() external view returns (address)

_0

address

The River address

function initializeWithdrawV1(address _river) external nonpayable

_river

address

The address of the River contract

function pullEth(uint256 _max) external nonpayable

_max

uint256

undefined

function version() external pure returns (string)

_0

string

Version of the contract

event Initialize(uint256 version, bytes cdata)

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

event SetRiver(address river)

river

address

The new River address

error InvalidInitialization(uint256 version, uint256 expectedVersion)

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

error InvalidZeroAddress()
error Unauthorized(address caller)

caller

address

Address performing the call

function allowance(address _owner, address _spender) external view returns (uint256)

_owner

address

Owner that gave the allowance

_spender

address

Spender that received the allowance

_0

uint256

The allowance of the owner to the spender

function approve(address _spender, uint256 _value) external nonpayable returns (bool)

_spender

address

Spender that receives the allowance

_value

uint256

Amount to allow

_0

bool

True if success

function balanceOf(address _owner) external view returns (uint256)

_owner

address

Owner to check the balance

_0

uint256

The balance of the owner

function burn(address _recipient, uint256 _shares) external nonpayable

_recipient

address

The account receiving the underlying LsETH tokens after shares are burned

_shares

uint256

Amount of LsETH to free by burning wrapped LsETH

function decimals() external pure returns (uint8)

_0

uint8

The decimal count

function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)

_spender

address

Spender that receives the allowance

_subtractableValue

uint256

Amount to subtract

_0

bool

True if success

function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)

_spender

address

Spender that receives the allowance

_additionalValue

uint256

Amount to add

_0

bool

True if success

function initWLSETHV1(address _river) external nonpayable

_river

address

Address of the River contract

function mint(address _recipient, uint256 _shares) external nonpayable

_recipient

address

The account receiving the new minted wrapped LsETH

_shares

uint256

The amount of LsETH to wrap

function name() external pure returns (string)

_0

string

The name of the token

function sharesOf(address _owner) external view returns (uint256)

_owner

address

Owner to check the shares balance

_0

uint256

The shares of the owner

function symbol() external pure returns (string)

_0

string

The symbol of the token

function totalSupply() external view returns (uint256)

_0

uint256

The total supply

function transfer(address _to, uint256 _value) external nonpayable returns (bool)

_to

address

Recipient of the transfer

_value

uint256

Amount to transfer

_0

bool

True if success

function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)

_from

address

Sender account

_to

address

Recipient of the transfer

_value

uint256

Amount to transfer

_0

bool

True if success

event Approval(address indexed owner, address indexed spender, uint256 value)

owner indexed

address

The token owner

spender indexed

address

The account allowed by the owner

value

uint256

The amount allowed

event Burn(address indexed recipient, uint256 shares)

recipient indexed

address

The account that receive the underlying LsETH

shares

uint256

The amount of LsETH that got sent back

event Initialized(uint8 version)

version

uint8

undefined

event Mint(address indexed recipient, uint256 shares)

recipient indexed

address

The account receiving the new tokens

shares

uint256

The amount of LsETH provided

event SetRiver(address indexed river)

river indexed

address

The new address of river

event Transfer(address indexed from, address indexed to, uint256 value)

from indexed

address

The transfer sender

to indexed

address

The transfer recipient

value

uint256

The amount transferred

error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)

_from

address

Account where funds are sent from

_operator

address

Account attempting the transfer

_allowance

uint256

Current allowance

_value

uint256

Requested transfer value

error BalanceTooLow()
error InvalidZeroAddress()
error NullTransfer()
error TokenTransferError()
error UnauthorizedTransfer(address _from, address _to)

_from

address

Account sending the funds in the invalid transfer

_to

address

Account receiving the funds in the invalid transfer

function acceptAdmin() external nonpayable
function addMember(address _newOracleMember, uint256 _newQuorum) external nonpayable

_newOracleMember

address

Address of the new member

_newQuorum

uint256

New quorum value

function getAdmin() external view returns (address)

_0

address

The admin address

function getGlobalReportStatus() external view returns (uint256)

_0

uint256

The raw report status value

function getLastReportedEpochId() external view returns (uint256)

_0

uint256

The last reported epoch id

function getMemberReportStatus(address _oracleMember) external view returns (bool)

_oracleMember

address

Address of member to check

_0

bool

True if member has reported

function getOracleMembers() external view returns (address[])

_0

address[]

The oracle members

function getPendingAdmin() external view returns (address)

_0

address

The pending admin address

function getQuorum() external view returns (uint256)

_0

uint256

The current quorum

function getReportVariantDetails(uint256 _idx) external view returns (struct ReportsVariants.ReportVariantDetails)

_idx

uint256

The index of the report variant

_0

ReportsVariants.ReportVariantDetails

The report variant details

function getReportVariantsCount() external view returns (uint256)

_0

uint256

The count of report variants

function getRiver() external view returns (address)

_0

address

The address of River

function initOracleV1(address _riverAddress, address _administratorAddress, uint64 _epochsPerFrame, uint64 _slotsPerEpoch, uint64 _secondsPerSlot, uint64 _genesisTime, uint256 _annualAprUpperBound, uint256 _relativeLowerBound) external nonpayable

_riverAddress

address

undefined

_administratorAddress

address

Address able to call administrative methods

_epochsPerFrame

uint64

CL spec parameter. Number of epochs in a frame.

_slotsPerEpoch

uint64

CL spec parameter. Number of slots in one epoch.

_secondsPerSlot

uint64

CL spec parameter. Number of seconds between slots.

_genesisTime

uint64

CL spec parameter. Timestamp of the genesis slot.

_annualAprUpperBound

uint256

CL bound parameter. Maximum apr allowed for balance increase. Delta between updates is extrapolated on a year time frame.

_relativeLowerBound

uint256

CL bound parameter. Maximum relative balance decrease.

function initOracleV1_1() external nonpayable
function isMember(address _memberAddress) external view returns (bool)

_memberAddress

address

Address of the member

_0

bool

True if address is a member

function proposeAdmin(address _newAdmin) external nonpayable

_newAdmin

address

New admin address

function removeMember(address _oracleMember, uint256 _newQuorum) external nonpayable

_oracleMember

address

Address to remove

_newQuorum

uint256

New quorum value

function reportConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable

_report

IOracleManagerV1.ConsensusLayerReport

undefined

function setMember(address _oracleMember, address _newAddress) external nonpayable

_oracleMember

address

Address to change

_newAddress

address

New address for the member

function setQuorum(uint256 _newQuorum) external nonpayable

_newQuorum

uint256

New quorum parameter

function version() external pure returns (string)

_0

string

Version of the contract

event AddMember(address indexed member)

member indexed

address

The address of the member

event ClearedReporting()
event Initialize(uint256 version, bytes cdata)

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

event RemoveMember(address indexed member)

member indexed

address

The address of the member

event ReportedConsensusLayerData(address indexed member, bytes32 indexed variant, IOracleManagerV1.ConsensusLayerReport report, uint256 voteCount, uint256 quorum)

member indexed

address

The oracle member

variant indexed

bytes32

The variant of the report

report

IOracleManagerV1.ConsensusLayerReport

The raw report structure

voteCount

uint256

The vote count

quorum

uint256

undefined

event SetAdmin(address indexed admin)

admin indexed

address

New admin address

event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)

annualAprUpperBound

uint256

The maximum allowed apr. 10% means increases in balance extrapolated to a year should not exceed 10%.

relativeLowerBound

uint256

The maximum allowed balance decrease as a relative % of the total balance

event SetLastReportedEpoch(uint256 lastReportedEpoch)

lastReportedEpoch

uint256

undefined

event SetMember(address indexed oldAddress, address indexed newAddress)

oldAddress indexed

address

The previous member address

newAddress indexed

address

The new member address

event SetPendingAdmin(address indexed pendingAdmin)

pendingAdmin indexed

address

New pending admin address

event SetQuorum(uint256 newQuorum)

newQuorum

uint256

The new quorum value

event SetRiver(address _river)

_river

address

The new river address

event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime)

epochsPerFrame

uint64

The number of epochs inside a frame (225 = 24 hours)

slotsPerEpoch

uint64

The number of slots inside an epoch (32 on ethereum mainnet)

secondsPerSlot

uint64

The time between two slots (12 seconds on ethereum mainnet)

genesisTime

uint64

The timestamp of block #0

error AddressAlreadyInUse(address newAddress)

newAddress

address

The address already in use

error AlreadyReported(uint256 epochId, address member)

epochId

uint256

The epoch id provided as input

member

address

The oracle member

error EpochTooOld(uint256 providedEpochId, uint256 minExpectedEpochId)

providedEpochId

uint256

The epoch id provided as input

minExpectedEpochId

uint256

The minimum epoch id expected

error InvalidArgument()
error InvalidCall()
error InvalidEpoch(uint256 epoch)

epoch

uint256

The invalid epoch

error InvalidInitialization(uint256 version, uint256 expectedVersion)

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

error InvalidZeroAddress()
error ReportIndexOutOfBounds(uint256 index, uint256 length)

index

uint256

Requested index

length

uint256

Size of the variant array

error Unauthorized(address caller)

caller

address

Address performing the call

SharesManagerV1

Alluvial Finance Inc.

Shares Manager (v1)

This contract handles the shares of the depositor and the ERC20 interface

Methods

allowance

function allowance(address _owner, address _spender) external view returns (uint256)

Retrieve the allowance value for a spender

Parameters

Name
Type
Description

_owner

address

Address that issued the allowance

_spender

address

Address that received the allowance

Returns

Name
Type
Description

_0

uint256

The allowance in shares for a given spender

approve

function approve(address _spender, uint256 _value) external nonpayable returns (bool)

Approves an account for future spendings

An approved account can use transferFrom to transfer funds on behalf of the token owner

Parameters

Name
Type
Description

_spender

address

Address that is allowed to spend the tokens

_value

uint256

The allowed amount in shares, will override previous value

Returns

Name
Type
Description

_0

bool

True if success

balanceOf

function balanceOf(address _owner) external view returns (uint256)

Retrieve the balance of an account

Parameters

Name
Type
Description

_owner

address

Address to be checked

Returns

Name
Type
Description

_0

uint256

The balance of the account in shares

balanceOfUnderlying

function balanceOfUnderlying(address _owner) external view returns (uint256)

Retrieve the underlying asset balance of an account

Parameters

Name
Type
Description

_owner

address

Address to be checked

Returns

Name
Type
Description

_0

uint256

The underlying balance of the account

decimals

function decimals() external pure returns (uint8)

Retrieve the decimal count

Returns

Name
Type
Description

_0

uint8

The decimal count

decreaseAllowance

function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)

Decrease allowance to another account

Parameters

Name
Type
Description

_spender

address

Spender that receives the allowance

_subtractableValue

uint256

Amount of shares to subtract

Returns

Name
Type
Description

_0

bool

True if success

increaseAllowance

function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)

Increase allowance to another account

Parameters

Name
Type
Description

_spender

address

Spender that receives the allowance

_additionalValue

uint256

Amount of shares to add

Returns

Name
Type
Description

_0

bool

True if success

name

function name() external pure returns (string)

Retrieve the token name

Returns

Name
Type
Description

_0

string

The token name

sharesFromUnderlyingBalance

function sharesFromUnderlyingBalance(uint256 _underlyingAssetAmount) external view returns (uint256)

Retrieve the shares count from an underlying asset amount

Parameters

Name
Type
Description

_underlyingAssetAmount

uint256

Amount of underlying asset to convert

Returns

Name
Type
Description

_0

uint256

The amount of shares worth the underlying asset amount

symbol

function symbol() external pure returns (string)

Retrieve the token symbol

Returns

Name
Type
Description

_0

string

The token symbol

totalSupply

function totalSupply() external view returns (uint256)

Retrieve the total token supply

Returns

Name
Type
Description

_0

uint256

The total supply in shares

totalUnderlyingSupply

function totalUnderlyingSupply() external view returns (uint256)

Retrieve the total underlying asset supply

Returns

Name
Type
Description

_0

uint256

The total underlying asset supply

transfer

function transfer(address _to, uint256 _value) external nonpayable returns (bool)

Performs a transfer from the message sender to the provided account

Parameters

Name
Type
Description

_to

address

Address receiving the tokens

_value

uint256

Amount of shares to be sent

Returns

Name
Type
Description

_0

bool

True if success

transferFrom

function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)

Performs a transfer between two recipients

Parameters

Name
Type
Description

_from

address

Address sending the tokens

_to

address

Address receiving the tokens

_value

uint256

Amount of shares to be sent

Returns

Name
Type
Description

_0

bool

True if success

underlyingBalanceFromShares

function underlyingBalanceFromShares(uint256 _shares) external view returns (uint256)

Retrieve the underlying asset balance from an amount of shares

Parameters

Name
Type
Description

_shares

uint256

Amount of shares to convert

Returns

Name
Type
Description

_0

uint256

The underlying asset balance represented by the shares

Events

Approval

event Approval(address indexed owner, address indexed spender, uint256 value)

Emitted when the allowance of a spender for an owner is set by a call to {approve}. value is the new allowance.

Parameters

Name
Type
Description

owner indexed

address

undefined

spender indexed

address

undefined

value

uint256

undefined

SetTotalSupply

event SetTotalSupply(uint256 totalSupply)

Emitted when the total supply is changed

Parameters

Name
Type
Description

totalSupply

uint256

undefined

Transfer

event Transfer(address indexed from, address indexed to, uint256 value)

Emitted when value tokens are moved from one account (from) to another (to). Note that value may be zero.

Parameters

Name
Type
Description

from indexed

address

undefined

to indexed

address

undefined

value

uint256

undefined

Errors

AllowanceTooLow

error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)

Allowance too low to perform operation

Parameters

Name
Type
Description

_from

address

Account where funds are sent from

_operator

address

Account attempting the transfer

_allowance

uint256

Current allowance

_value

uint256

Requested transfer value in shares

BalanceTooLow

error BalanceTooLow()

Balance too low to perform operation

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

NullTransfer

error NullTransfer()

Invalid empty transfer

UnauthorizedTransfer

error UnauthorizedTransfer(address _from, address _to)

Invalid transfer recipients

Parameters

Name
Type
Description

_from

address

Account sending the funds in the invalid transfer

_to

address

Account receiving the funds in the invalid transfer

UserDepositManagerV1

Alluvial Finance Inc.

User Deposit Manager (v1)

This contract handles the inbound transfers cases or the explicit submissions

Methods

deposit

function deposit() external payable

Explicit deposit method to mint on msg.sender

depositAndTransfer

function depositAndTransfer(address _recipient) external payable

Explicit deposit method to mint on msg.sender and transfer to _recipient

Parameters

Name
Type
Description

_recipient

address

Address receiving the minted LsETH

Events

UserDeposit

event UserDeposit(address indexed depositor, address indexed recipient, uint256 amount)

User deposited ETH in the system

Parameters

Name
Type
Description

depositor indexed

address

Address performing the deposit

recipient indexed

address

Address receiving the minted shares

amount

uint256

Amount in ETH deposited

Errors

EmptyDeposit

error EmptyDeposit()

And empty deposit attempt was made

InvalidCall

error InvalidCall()

The call was invalid

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

ConsensusLayerDepositManagerV1

Alluvial Finance Inc.

Consensus Layer Deposit Manager (v1)

This contract handles the interactions with the official deposit contract, funding all validatorsWhenever a deposit to the consensus layer is requested, this contract computed the amount of keys that could be deposited depending on the amount available in the contract. It then tries to retrieve validator keys by calling its internal virtual method _getNextValidators. This method should be overridden by the implementing contract to provide [0; _keyCount] keys when invoked.

Methods

DEPOSIT_SIZE

function DEPOSIT_SIZE() external view returns (uint256)

Size of a deposit in ETH

Returns

Name
Type
Description

_0

uint256

undefined

PUBLIC_KEY_LENGTH

function PUBLIC_KEY_LENGTH() external view returns (uint256)

Size of a BLS Public key in bytes

Returns

Name
Type
Description

_0

uint256

undefined

SIGNATURE_LENGTH

function SIGNATURE_LENGTH() external view returns (uint256)

Size of a BLS Signature in bytes

Returns

Name
Type
Description

_0

uint256

undefined

depositToConsensusLayerWithDepositRoot

function depositToConsensusLayerWithDepositRoot(uint256 _maxCount, bytes32 _depositRoot) external nonpayable

Deposits current balance to the Consensus Layer by batches of 32 ETH

Parameters

Name
Type
Description

_maxCount

uint256

The maximum amount of validator keys to fund

_depositRoot

bytes32

The root of the deposit tree

getBalanceToDeposit

function getBalanceToDeposit() external view returns (uint256)

Returns the amount of ETH not yet committed for deposit

Returns

Name
Type
Description

_0

uint256

The amount of ETH not yet committed for deposit

getCommittedBalance

function getCommittedBalance() external view returns (uint256)

Returns the amount of ETH committed for deposit

Returns

Name
Type
Description

_0

uint256

The amount of ETH committed for deposit

getDepositedValidatorCount

function getDepositedValidatorCount() external view returns (uint256)

Get the deposited validator count (the count of deposits made by the contract)

Returns

Name
Type
Description

_0

uint256

The deposited validator count

getKeeper

function getKeeper() external view returns (address)

Get the keeper address

Returns

Name
Type
Description

_0

address

The keeper address

getWithdrawalCredentials

function getWithdrawalCredentials() external view returns (bytes32)

Retrieve the withdrawal credentials

Returns

Name
Type
Description

_0

bytes32

The withdrawal credentials

Events

SetDepositContractAddress

event SetDepositContractAddress(address indexed depositContract)

The stored deposit contract address changed

Parameters

Name
Type
Description

depositContract indexed

address

Address of the deposit contract

SetDepositedValidatorCount

event SetDepositedValidatorCount(uint256 oldDepositedValidatorCount, uint256 newDepositedValidatorCount)

Emitted when the deposited validator count is updated

Parameters

Name
Type
Description

oldDepositedValidatorCount

uint256

The old deposited validator count value

newDepositedValidatorCount

uint256

The new deposited validator count value

SetWithdrawalCredentials

event SetWithdrawalCredentials(bytes32 withdrawalCredentials)

The stored withdrawal credentials changed

Parameters

Name
Type
Description

withdrawalCredentials

bytes32

The withdrawal credentials to use for deposits

Errors

ErrorOnDeposit

error ErrorOnDeposit()

An error occurred during the deposit

InconsistentPublicKeys

error InconsistentPublicKeys()

The length of the BLS Public key is invalid during deposit

InconsistentSignatures

error InconsistentSignatures()

The length of the BLS Signature is invalid during deposit

InvalidDepositRoot

error InvalidDepositRoot()

Invalid deposit root

InvalidPublicKeyCount

error InvalidPublicKeyCount()

The received count of public keys to deposit is invalid

InvalidSignatureCount

error InvalidSignatureCount()

The received count of signatures to deposit is invalid

InvalidWithdrawalCredentials

error InvalidWithdrawalCredentials()

The withdrawal credentials value is null

NoAvailableValidatorKeys

error NoAvailableValidatorKeys()

The internal key retrieval returned no keys

NotEnoughFunds

error NotEnoughFunds()

Not enough funds to deposit one validator

OnlyKeeper

error OnlyKeeper()

SliceOutOfBounds

error SliceOutOfBounds()

The slice is outside of the initial bytes bounds

SliceOverflow

error SliceOverflow()

The length overflows an uint

ProtocolMetrics

Methods

getRate

function getRate() external view returns (uint256)

Returns

Name
Type
Description

_0

uint256

undefined

initProtocolMetricsV1

function initProtocolMetricsV1(address river) external nonpayable

Parameters

Name
Type
Description

river

address

undefined

Events

Initialize

event Initialize(uint256 version, bytes cdata)

Emitted when the contract is properly initialized

Parameters

Name
Type
Description

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

Errors

InvalidInitialization

error InvalidInitialization(uint256 version, uint256 expectedVersion)

An error occurred during the initialization

Parameters

Name
Type
Description

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

IAllowlistV1

Alluvial Finance Inc.

Allowlist Interface (v1)

This interface exposes methods to handle the list of allowed recipients.

Methods

getAllower

function getAllower() external view returns (address)

Retrieves the allower address

Returns

Name
Type
Description

_0

address

The address of the allower

getDenier

function getDenier() external view returns (address)

Retrieves the denier address

Returns

Name
Type
Description

_0

address

The address of the denier

getPermissions

function getPermissions(address _account) external view returns (uint256)

This method retrieves the raw permission value

Parameters

Name
Type
Description

_account

address

Recipient to verify

Returns

Name
Type
Description

_0

uint256

The raw permissions value of the account

hasPermission

function hasPermission(address _account, uint256 _mask) external view returns (bool)

This method returns true if the user has the expected permission ignoring any deny list membership

Parameters

Name
Type
Description

_account

address

Recipient to verify

_mask

uint256

Combination of permissions to verify

Returns

Name
Type
Description

_0

bool

True if mask is respected

initAllowlistV1

function initAllowlistV1(address _admin, address _allower) external nonpayable

Initializes the allowlist

Parameters

Name
Type
Description

_admin

address

Address of the Allowlist administrator

_allower

address

Address of the allower

initAllowlistV1_1

function initAllowlistV1_1(address _denier) external nonpayable

Initializes the allowlist denier

Parameters

Name
Type
Description

_denier

address

Address of the denier

isAllowed

function isAllowed(address _account, uint256 _mask) external view returns (bool)

This method returns true if the user has the expected permission and is not in the deny list

Parameters

Name
Type
Description

_account

address

Recipient to verify

_mask

uint256

Combination of permissions to verify

Returns

Name
Type
Description

_0

bool

True if mask is respected and user is allowed

isDenied

function isDenied(address _account) external view returns (bool)

This method returns true if the user is in the deny list

Parameters

Name
Type
Description

_account

address

Recipient to verify

Returns

Name
Type
Description

_0

bool

True if user is denied access

onlyAllowed

function onlyAllowed(address _account, uint256 _mask) external view

This method should be used as a modifier and is expected to revert if the user hasn't got the required permission or if the user is in the deny list.

Parameters

Name
Type
Description

_account

address

Recipient to verify

_mask

uint256

Combination of permissions to verify

setAllowPermissions

function setAllowPermissions(address[] _accounts, uint256[] _permissions) external nonpayable

Sets the allow permissions for one or more accounts

This function is for allocating or removing deposit, redeem or donate permissions. This function could be used to give any permissions that we come up with in the future. An address which was denied has to be undenied first before they could be given any permission(s).

Parameters

Name
Type
Description

_accounts

address[]

Accounts to update

_permissions

uint256[]

New permission values

setAllower

function setAllower(address _newAllowerAddress) external nonpayable

Changes the allower address

Parameters

Name
Type
Description

_newAllowerAddress

address

New address allowed to edit the allowlist

setDenier

function setDenier(address _newDenierAddress) external nonpayable

Changes the denier address

Parameters

Name
Type
Description

_newDenierAddress

address

New address allowed to edit the allowlist

setDenyPermissions

function setDenyPermissions(address[] _accounts, uint256[] _permissions) external nonpayable

Sets the deny permissions for one or more accounts

This function is for allocating or removing deny permissions. An address which is undenied has to be given permissions again for them to be able to deposit, donate or redeem.

Parameters

Name
Type
Description

_accounts

address[]

Accounts to update

_permissions

uint256[]

New permission values

Events

SetAllower

event SetAllower(address indexed allower)

The stored allower address has been changed

Parameters

Name
Type
Description

allower indexed

address

The new allower address

SetAllowlistPermissions

event SetAllowlistPermissions(address[] accounts, uint256[] permissions)

The permissions of several accounts have changed

Parameters

Name
Type
Description

accounts

address[]

List of accounts

permissions

uint256[]

New permissions for each account at the same index

SetDenier

event SetDenier(address indexed denier)

The stored denier address has been changed

Parameters

Name
Type
Description

denier indexed

address

The new denier address

Errors

AttemptToRemoveDenyPermission

error AttemptToRemoveDenyPermission()

Allower can't remove deny permission

AttemptToSetDenyPermission

error AttemptToSetDenyPermission()

Allower can't set deny permission

Denied

error Denied(address _account)

The account is denied access

Parameters

Name
Type
Description

_account

address

The denied account

InvalidCount

error InvalidCount()

The provided accounts list is empty

MismatchedArrayLengths

error MismatchedArrayLengths()

The provided accounts and permissions list have different lengths

OracleManagerV1

Alluvial Finance Inc.

Oracle Manager (v1)

This contract handles the inputs provided by the oracle. The Oracle contract is plugged to this contract and is in charge of pushing data whenever a new report has been deemed valid. The report consists in two values: the sum of all balances of all deposited validators and the count of validators that have been activated on the consensus layer.

Methods

_DEPOSIT_SIZE

function _DEPOSIT_SIZE() external view returns (uint256)

Size of a deposit in ETH

Returns

Name
Type
Description

_0

uint256

undefined

getCLSpec

function getCLSpec() external view returns (struct CLSpec.CLSpecStruct)

Retrieve the current cl spec

Returns

Name
Type
Description

_0

CLSpec.CLSpecStruct

The Consensus Layer Specification

getCLValidatorCount

function getCLValidatorCount() external view returns (uint256)

Get CL validator count (the amount of validator reported by the oracles)

Returns

Name
Type
Description

_0

uint256

The CL validator count

getCLValidatorTotalBalance

function getCLValidatorTotalBalance() external view returns (uint256)

Get CL validator total balance

Returns

Name
Type
Description

_0

uint256

The CL Validator total balance

getCurrentEpochId

function getCurrentEpochId() external view returns (uint256)

Retrieve the current epoch id based on block timestamp

Returns

Name
Type
Description

_0

uint256

The current epoch id

getCurrentFrame

function getCurrentFrame() external view returns (uint256 _startEpochId, uint256 _startTime, uint256 _endTime)

Retrieve the current frame details

Returns

Name
Type
Description

_startEpochId

uint256

The epoch at the beginning of the frame

_startTime

uint256

The timestamp of the beginning of the frame in seconds

_endTime

uint256

The timestamp of the end of the frame in seconds

getExpectedEpochId

function getExpectedEpochId() external view returns (uint256)

Retrieve expected epoch id

Returns

Name
Type
Description

_0

uint256

The current expected epoch id

getFrameFirstEpochId

function getFrameFirstEpochId(uint256 _epochId) external view returns (uint256)

Retrieve the first epoch id of the frame of the provided epoch id

Parameters

Name
Type
Description

_epochId

uint256

Epoch id used to get the frame

Returns

Name
Type
Description

_0

uint256

The first epoch id of the frame containing the given epoch id

getLastCompletedEpochId

function getLastCompletedEpochId() external view returns (uint256)

Retrieve the last completed epoch id

Returns

Name
Type
Description

_0

uint256

The last completed epoch id

getLastConsensusLayerReport

function getLastConsensusLayerReport() external view returns (struct IOracleManagerV1.StoredConsensusLayerReport)

Retrieve the last consensus layer report

Returns

Name
Type
Description

_0

IOracleManagerV1.StoredConsensusLayerReport

The stored consensus layer report

getOracle

function getOracle() external view returns (address)

Get oracle address

Returns

Name
Type
Description

_0

address

The oracle address

getReportBounds

function getReportBounds() external view returns (struct ReportBounds.ReportBoundsStruct)

Retrieve the report bounds

Returns

Name
Type
Description

_0

ReportBounds.ReportBoundsStruct

The report bounds

getTime

function getTime() external view returns (uint256)

Retrieve the block timestamp

Returns

Name
Type
Description

_0

uint256

The current timestamp from the EVM context

isValidEpoch

function isValidEpoch(uint256 _epoch) external view returns (bool)

Verifies if the provided epoch is valid

Parameters

Name
Type
Description

_epoch

uint256

undefined

Returns

Name
Type
Description

_0

bool

True if valid

setCLSpec

function setCLSpec(CLSpec.CLSpecStruct _newValue) external nonpayable

Parameters

Name
Type
Description

_newValue

CLSpec.CLSpecStruct

undefined

setConsensusLayerData

function setConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable

Parameters

Name
Type
Description

_report

IOracleManagerV1.ConsensusLayerReport

undefined

setOracle

function setOracle(address _oracleAddress) external nonpayable

Set the oracle address

Parameters

Name
Type
Description

_oracleAddress

address

Address of the oracle

setReportBounds

function setReportBounds(ReportBounds.ReportBoundsStruct _newValue) external nonpayable

Parameters

Name
Type
Description

_newValue

ReportBounds.ReportBoundsStruct

undefined

Events

ConsensusLayerDataUpdate

event ConsensusLayerDataUpdate(uint256 validatorCount, uint256 validatorTotalBalance, bytes32 roundId)

The consensus layer data provided by the oracle has been updated

Parameters

Name
Type
Description

validatorCount

uint256

The new count of validators running on the consensus layer

validatorTotalBalance

uint256

The new total balance sum of all validators

roundId

bytes32

Round identifier

ProcessedConsensusLayerReport

event ProcessedConsensusLayerReport(IOracleManagerV1.ConsensusLayerReport report, IOracleManagerV1.ConsensusLayerDataReportingTrace trace)

The provided report has been processed

Parameters

Name
Type
Description

report

IOracleManagerV1.ConsensusLayerReport

The report that was provided

trace

IOracleManagerV1.ConsensusLayerDataReportingTrace

The trace structure providing more insights on internals

SetBounds

event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)

The Report Bounds are changed

Parameters

Name
Type
Description

annualAprUpperBound

uint256

The reporting upper bound

relativeLowerBound

uint256

The reporting lower bound

SetOracle

event SetOracle(address indexed oracleAddress)

The stored oracle address changed

Parameters

Name
Type
Description

oracleAddress indexed

address

The new oracle address

SetSpec

event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime, uint64 epochsToAssumedFinality)

The Consensus Layer Spec is changed

Parameters

Name
Type
Description

epochsPerFrame

uint64

The number of epochs inside a frame

slotsPerEpoch

uint64

The number of slots inside an epoch

secondsPerSlot

uint64

The number of seconds inside a slot

genesisTime

uint64

The genesis timestamp

epochsToAssumedFinality

uint64

The number of epochs before an epoch is considered final

Errors

InvalidDecreasingValidatorsExitedBalance

error InvalidDecreasingValidatorsExitedBalance(uint256 currentValidatorsExitedBalance, uint256 newValidatorsExitedBalance)

The total exited balance decreased

Parameters

Name
Type
Description

currentValidatorsExitedBalance

uint256

The current exited balance

newValidatorsExitedBalance

uint256

The new exited balance

InvalidDecreasingValidatorsSkimmedBalance

error InvalidDecreasingValidatorsSkimmedBalance(uint256 currentValidatorsSkimmedBalance, uint256 newValidatorsSkimmedBalance)

The total skimmed balance decreased

Parameters

Name
Type
Description

currentValidatorsSkimmedBalance

uint256

The current exited balance

newValidatorsSkimmedBalance

uint256

The new exited balance

InvalidEpoch

error InvalidEpoch(uint256 epoch)

Thrown when an invalid epoch was reported

Parameters

Name
Type
Description

epoch

uint256

Invalid epoch

InvalidValidatorCountReport

error InvalidValidatorCountReport(uint256 providedValidatorCount, uint256 depositedValidatorCount, uint256 lastReportedValidatorCount)

The reported validator count is invalid

Parameters

Name
Type
Description

providedValidatorCount

uint256

The received validator count value

depositedValidatorCount

uint256

The number of deposits performed by the system

lastReportedValidatorCount

uint256

The last reported validator count

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

TotalValidatorBalanceDecreaseOutOfBound

error TotalValidatorBalanceDecreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 relativeLowerBound)

The balance decrease is higher than the maximum allowed by the lower bound

Parameters

Name
Type
Description

prevTotalEthIncludingExited

uint256

The previous total balance, including all exited balance

postTotalEthIncludingExited

uint256

The post-report total balance, including all exited balance

timeElapsed

uint256

The time in seconds since last report

relativeLowerBound

uint256

The lower bound value that was used

TotalValidatorBalanceIncreaseOutOfBound

error TotalValidatorBalanceIncreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 annualAprUpperBound)

The balance increase is higher than the maximum allowed by the upper bound

Parameters

Name
Type
Description

prevTotalEthIncludingExited

uint256

The previous total balance, including all exited balance

postTotalEthIncludingExited

uint256

The post-report total balance, including all exited balance

timeElapsed

uint256

The time in seconds since last report

annualAprUpperBound

uint256

The upper bound value that was used

Unauthorized

error Unauthorized(address caller)

The operator is unauthorized for the caller

Parameters

Name
Type
Description

caller

address

Address performing the call

IAdministrable

Alluvial Finance Inc.

Administrable Interface

This interface exposes methods to handle the ownership of the contracts

Methods

acceptAdmin

function acceptAdmin() external nonpayable

Accept the transfer of ownership

Only callable by the pending admin. Resets the pending admin if successful.

getAdmin

function getAdmin() external view returns (address)

Retrieves the current admin address

Returns

Name
Type
Description

_0

address

The admin address

getPendingAdmin

function getPendingAdmin() external view returns (address)

Retrieve the current pending admin address

Returns

Name
Type
Description

_0

address

The pending admin address

proposeAdmin

function proposeAdmin(address _newAdmin) external nonpayable

Proposes a new address as admin

This security prevents setting an invalid address as an admin. The pending admin has to claim its ownership of the contract, and prove that the new address is able to perform regular transactions.

Parameters

Name
Type
Description

_newAdmin

address

New admin address

Events

SetAdmin

event SetAdmin(address indexed admin)

The admin address changed

Parameters

Name
Type
Description

admin indexed

address

New admin address

SetPendingAdmin

event SetPendingAdmin(address indexed pendingAdmin)

The pending admin address changed

Parameters

Name
Type
Description

pendingAdmin indexed

address

New pending admin address

ISharesManagerV1

Alluvial Finance Inc.

Shares Manager Interface (v1)

This interface exposes methods to handle the shares of the depositor and the ERC20 interface

Methods

allowance

function allowance(address _owner, address _spender) external view returns (uint256)

Retrieve the allowance value for a spender

Parameters

Name
Type
Description

_owner

address

Address that issued the allowance

_spender

address

Address that received the allowance

Returns

Name
Type
Description

_0

uint256

The allowance in shares for a given spender

approve

function approve(address _spender, uint256 _value) external nonpayable returns (bool)

Approves an account for future spendings

An approved account can use transferFrom to transfer funds on behalf of the token owner

Parameters

Name
Type
Description

_spender

address

Address that is allowed to spend the tokens

_value

uint256

The allowed amount in shares, will override previous value

Returns

Name
Type
Description

_0

bool

True if success

balanceOf

function balanceOf(address _owner) external view returns (uint256)

Retrieve the balance of an account

Parameters

Name
Type
Description

_owner

address

Address to be checked

Returns

Name
Type
Description

_0

uint256

The balance of the account in shares

balanceOfUnderlying

function balanceOfUnderlying(address _owner) external view returns (uint256)

Retrieve the underlying asset balance of an account

Parameters

Name
Type
Description

_owner

address

Address to be checked

Returns

Name
Type
Description

_0

uint256

The underlying balance of the account

decimals

function decimals() external pure returns (uint8)

Retrieve the decimal count

Returns

Name
Type
Description

_0

uint8

The decimal count

decreaseAllowance

function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)

Decrease allowance to another account

Parameters

Name
Type
Description

_spender

address

Spender that receives the allowance

_subtractableValue

uint256

Amount of shares to subtract

Returns

Name
Type
Description

_0

bool

True if success

increaseAllowance

function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)

Increase allowance to another account

Parameters

Name
Type
Description

_spender

address

Spender that receives the allowance

_additionalValue

uint256

Amount of shares to add

Returns

Name
Type
Description

_0

bool

True if success

name

function name() external pure returns (string)

Retrieve the token name

Returns

Name
Type
Description

_0

string

The token name

sharesFromUnderlyingBalance

function sharesFromUnderlyingBalance(uint256 _underlyingAssetAmount) external view returns (uint256)

Retrieve the shares count from an underlying asset amount

Parameters

Name
Type
Description

_underlyingAssetAmount

uint256

Amount of underlying asset to convert

Returns

Name
Type
Description

_0

uint256

The amount of shares worth the underlying asset amount

symbol

function symbol() external pure returns (string)

Retrieve the token symbol

Returns

Name
Type
Description

_0

string

The token symbol

totalSupply

function totalSupply() external view returns (uint256)

Retrieve the total token supply

Returns

Name
Type
Description

_0

uint256

The total supply in shares

totalUnderlyingSupply

function totalUnderlyingSupply() external view returns (uint256)

Retrieve the total underlying asset supply

Returns

Name
Type
Description

_0

uint256

The total underlying asset supply

transfer

function transfer(address _to, uint256 _value) external nonpayable returns (bool)

Performs a transfer from the message sender to the provided account

Parameters

Name
Type
Description

_to

address

Address receiving the tokens

_value

uint256

Amount of shares to be sent

Returns

Name
Type
Description

_0

bool

True if success

transferFrom

function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)

Performs a transfer between two recipients

Parameters

Name
Type
Description

_from

address

Address sending the tokens

_to

address

Address receiving the tokens

_value

uint256

Amount of shares to be sent

Returns

Name
Type
Description

_0

bool

True if success

underlyingBalanceFromShares

function underlyingBalanceFromShares(uint256 _shares) external view returns (uint256)

Retrieve the underlying asset balance from an amount of shares

Parameters

Name
Type
Description

_shares

uint256

Amount of shares to convert

Returns

Name
Type
Description

_0

uint256

The underlying asset balance represented by the shares

Events

Approval

event Approval(address indexed owner, address indexed spender, uint256 value)

Emitted when the allowance of a spender for an owner is set by a call to {approve}. value is the new allowance.

Parameters

Name
Type
Description

owner indexed

address

undefined

spender indexed

address

undefined

value

uint256

undefined

SetTotalSupply

event SetTotalSupply(uint256 totalSupply)

Emitted when the total supply is changed

Parameters

Name
Type
Description

totalSupply

uint256

undefined

Transfer

event Transfer(address indexed from, address indexed to, uint256 value)

Emitted when value tokens are moved from one account (from) to another (to). Note that value may be zero.

Parameters

Name
Type
Description

from indexed

address

undefined

to indexed

address

undefined

value

uint256

undefined

Errors

AllowanceTooLow

error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)

Allowance too low to perform operation

Parameters

Name
Type
Description

_from

address

Account where funds are sent from

_operator

address

Account attempting the transfer

_allowance

uint256

Current allowance

_value

uint256

Requested transfer value in shares

BalanceTooLow

error BalanceTooLow()

Balance too low to perform operation

NullTransfer

error NullTransfer()

Invalid empty transfer

UnauthorizedTransfer

error UnauthorizedTransfer(address _from, address _to)

Invalid transfer recipients

Parameters

Name
Type
Description

_from

address

Account sending the funds in the invalid transfer

_to

address

Account receiving the funds in the invalid transfer

IERC20VestableVotesUpgradeableV1

Alluvial Finance Inc.

ERC20 Vestable Votes Upgradeable Interface(v1)

This interface exposes methods to manage vestings

Methods

computeVestingReleasableAmount

function computeVestingReleasableAmount(uint256 _index) external view returns (uint256)

Computes the releasable amount of tokens for a vesting schedule.

Parameters

Name
Type
Description

_index

uint256

index of the vesting schedule

Returns

Name
Type
Description

_0

uint256

amount of releasable tokens

computeVestingVestedAmount

function computeVestingVestedAmount(uint256 _index) external view returns (uint256)

Computes the vested amount of tokens for a vesting schedule.

Parameters

Name
Type
Description

_index

uint256

index of the vesting schedule

Returns

Name
Type
Description

_0

uint256

amount of vested tokens

createVestingSchedule

function createVestingSchedule(uint64 _start, uint32 _cliffDuration, uint32 _duration, uint32 _periodDuration, uint32 _lockDuration, bool _revocable, uint256 _amount, address _beneficiary, address _delegatee, bool _ignoreGlobalUnlockSchedule) external nonpayable returns (uint256)

Creates a new vesting scheduleThere may delay between the time a user should start vesting tokens and the time the vesting schedule is actually created on the contract.Typically a user joins the Liquid Collective but some weeks pass before the user gets all legal agreements in place and signed for the token grant emission to happen. In this case, the vesting schedule created for the token grant would start on the join date which is in the past.

As vesting schedules can be created in the past, this means that you should be careful when creating a vesting schedule and what duration parameters you use as this contract would allow creating a vesting schedule in the past and even a vesting schedule that has already ended.

Parameters

Name
Type
Description

_start

uint64

start time of the vesting

_cliffDuration

uint32

duration to vesting cliff (in seconds)

_duration

uint32

total vesting schedule duration after which all tokens are vested (in seconds)

_periodDuration

uint32

duration of a period after which new tokens unlock (in seconds)

_lockDuration

uint32

duration during which tokens are locked (in seconds)

_revocable

bool

whether the vesting schedule is revocable or not

_amount

uint256

amount of token attributed by the vesting schedule

_beneficiary

address

address of the beneficiary of the tokens

_delegatee

address

address to delegate escrow voting power to

_ignoreGlobalUnlockSchedule

bool

whether the vesting schedule should ignore the global lock

Returns

Name
Type
Description

_0

uint256

index of the created vesting schedule

delegateVestingEscrow

function delegateVestingEscrow(uint256 _index, address _delegatee) external nonpayable returns (bool)

Delegate vesting escrowed tokens

Parameters

Name
Type
Description

_index

uint256

index of the vesting schedule

_delegatee

address

address to delegate the token to

Returns

Name
Type
Description

_0

bool

True on success

getVestingSchedule

function getVestingSchedule(uint256 _index) external view returns (struct VestingSchedulesV2.VestingSchedule)

Get vesting schedule

The vesting schedule structure represents a static configuration used to compute the desired vesting details of a beneficiary at all times. The values won't change even after tokens are released.The only dynamic field of the structure is end, and is updated whenever a vesting schedule is revoked

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule

Returns

Name
Type
Description

_0

VestingSchedulesV2.VestingSchedule

undefined

getVestingScheduleCount

function getVestingScheduleCount() external view returns (uint256)

Get count of vesting schedules

Returns

Name
Type
Description

_0

uint256

count of vesting schedules

isGlobalUnlockedScheduleIgnored

function isGlobalUnlockedScheduleIgnored(uint256 _index) external view returns (bool)

Get vesting global unlock schedule activation status for a vesting schedule

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule

Returns

Name
Type
Description

_0

bool

true if the vesting schedule should ignore the global unlock schedule

releaseVestingSchedule

function releaseVestingSchedule(uint256 _index) external nonpayable returns (uint256)

Release vesting scheduleWhen tokens are released from the escrow, the delegated address of the escrow will see its voting power decrease.The beneficiary has to make sure its delegation parameters are set properly to be able to use/delegate the voting power of its balance.

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule to release

Returns

Name
Type
Description

_0

uint256

released amount

revokeVestingSchedule

function revokeVestingSchedule(uint256 _index, uint64 _end) external nonpayable returns (uint256 returnedAmount)

Revoke vesting schedule

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule to revoke

_end

uint64

End date for the schedule

Returns

Name
Type
Description

returnedAmount

uint256

amount returned to the vesting schedule creator

vestingEscrow

function vestingEscrow(uint256 _index) external view returns (address)

Get the address of the escrow for a vesting schedule

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule

Returns

Name
Type
Description

_0

address

address of the escrow

Events

CreatedVestingSchedule

event CreatedVestingSchedule(uint256 index, address indexed creator, address indexed beneficiary, uint256 amount)

A new vesting schedule has been created

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

creator indexed

address

Creator of the vesting schedule

beneficiary indexed

address

Vesting beneficiary address

amount

uint256

Vesting schedule amount

DelegatedVestingEscrow

event DelegatedVestingEscrow(uint256 index, address indexed oldDelegatee, address indexed newDelegatee, address indexed beneficiary)

Vesting escrow has been delegated

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

oldDelegatee indexed

address

old delegatee

newDelegatee indexed

address

new delegatee

beneficiary indexed

address

vesting schedule beneficiary

ReleasedVestingSchedule

event ReleasedVestingSchedule(uint256 index, uint256 releasedAmount)

Vesting schedule has been released

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

releasedAmount

uint256

Amount of tokens released to the beneficiary

RevokedVestingSchedule

event RevokedVestingSchedule(uint256 index, uint256 returnedAmount, uint256 newEnd)

Vesting schedule has been revoked

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

returnedAmount

uint256

Amount of tokens returned to the creator

newEnd

uint256

New end timestamp after revoke action

Errors

GlobalUnlockUnderlfow

error GlobalUnlockUnderlfow()

Underflow in global unlock logic (should never happen)

InvalidRevokedVestingScheduleEnd

error InvalidRevokedVestingScheduleEnd()

Attempt to revoke a vesting schedule with an invalid end parameter

InvalidVestingScheduleParameter

error InvalidVestingScheduleParameter(string msg)

Invalid parameter for a vesting schedule

Parameters

Name
Type
Description

msg

string

undefined

UnsufficientVestingScheduleCreatorBalance

error UnsufficientVestingScheduleCreatorBalance()

Vesting schedule creator has unsufficient balance to create vesting schedule

VestingScheduleIsLocked

error VestingScheduleIsLocked()

The vesting schedule is locked

VestingScheduleNotRevocable

error VestingScheduleNotRevocable()

The vesting schedule is not revocable

VestingScheduleNotRevocableInPast

error VestingScheduleNotRevocableInPast()

Attempt to revoke a schedule in the past

ZeroReleasableAmount

error ZeroReleasableAmount()

No token to release

ERC20VestableVotesUpgradeableV1

Alluvial Finance Inc.

ERC20VestableVotesUpgradeableV1

Methods

CLOCK_MODE

function CLOCK_MODE() external view returns (string)

Description of the clock

Returns

Name
Type
Description

_0

string

undefined

DOMAIN_SEPARATOR

function DOMAIN_SEPARATOR() external view returns (bytes32)

See {IERC20Permit-DOMAIN_SEPARATOR}.

Returns

Name
Type
Description

_0

bytes32

undefined

allowance

function allowance(address owner, address spender) external view returns (uint256)

See {IERC20-allowance}.

Parameters

Name
Type
Description

owner

address

undefined

spender

address

undefined

Returns

Name
Type
Description

_0

uint256

undefined

approve

function approve(address spender, uint256 amount) external nonpayable returns (bool)

See {IERC20-approve}. NOTE: If amount is the maximum uint256, the allowance is not updated on transferFrom. This is semantically equivalent to an infinite approval. Requirements: - spender cannot be the zero address.

Parameters

Name
Type
Description

spender

address

undefined

amount

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

balanceOf

function balanceOf(address account) external view returns (uint256)

See {IERC20-balanceOf}.

Parameters

Name
Type
Description

account

address

undefined

Returns

Name
Type
Description

_0

uint256

undefined

checkpoints

function checkpoints(address account, uint32 pos) external view returns (struct ERC20VotesUpgradeable.Checkpoint)

Get the pos-th checkpoint for account.

Parameters

Name
Type
Description

account

address

undefined

pos

uint32

undefined

Returns

Name
Type
Description

_0

ERC20VotesUpgradeable.Checkpoint

undefined

clock

function clock() external view returns (uint48)

Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).

Returns

Name
Type
Description

_0

uint48

undefined

computeVestingReleasableAmount

function computeVestingReleasableAmount(uint256 _index) external view returns (uint256)

Computes the releasable amount of tokens for a vesting schedule.

Parameters

Name
Type
Description

_index

uint256

index of the vesting schedule

Returns

Name
Type
Description

_0

uint256

amount of releasable tokens

computeVestingVestedAmount

function computeVestingVestedAmount(uint256 _index) external view returns (uint256)

Computes the vested amount of tokens for a vesting schedule.

Parameters

Name
Type
Description

_index

uint256

index of the vesting schedule

Returns

Name
Type
Description

_0

uint256

amount of vested tokens

createVestingSchedule

function createVestingSchedule(uint64 _start, uint32 _cliffDuration, uint32 _duration, uint32 _periodDuration, uint32 _lockDuration, bool _revocable, uint256 _amount, address _beneficiary, address _delegatee, bool _ignoreGlobalUnlockSchedule) external nonpayable returns (uint256)

Creates a new vesting scheduleThere may delay between the time a user should start vesting tokens and the time the vesting schedule is actually created on the contract.Typically a user joins the Liquid Collective but some weeks pass before the user gets all legal agreements in place and signed for the token grant emission to happen. In this case, the vesting schedule created for the token grant would start on the join date which is in the past.

As vesting schedules can be created in the past, this means that you should be careful when creating a vesting schedule and what duration parameters you use as this contract would allow creating a vesting schedule in the past and even a vesting schedule that has already ended.

Parameters

Name
Type
Description

_start

uint64

start time of the vesting

_cliffDuration

uint32

duration to vesting cliff (in seconds)

_duration

uint32

total vesting schedule duration after which all tokens are vested (in seconds)

_periodDuration

uint32

duration of a period after which new tokens unlock (in seconds)

_lockDuration

uint32

duration during which tokens are locked (in seconds)

_revocable

bool

whether the vesting schedule is revocable or not

_amount

uint256

amount of token attributed by the vesting schedule

_beneficiary

address

address of the beneficiary of the tokens

_delegatee

address

address to delegate escrow voting power to

_ignoreGlobalUnlockSchedule

bool

whether the vesting schedule should ignore the global lock

Returns

Name
Type
Description

_0

uint256

index of the created vesting schedule

decimals

function decimals() external view returns (uint8)

Returns the number of decimals used to get its user representation. For example, if decimals equals 2, a balance of 505 tokens should be displayed to a user as 5.05 (505 / 10 ** 2). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for display purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.

Returns

Name
Type
Description

_0

uint8

undefined

decreaseAllowance

function decreaseAllowance(address spender, uint256 subtractedValue) external nonpayable returns (bool)

Atomically decreases the allowance granted to spender by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - spender cannot be the zero address. - spender must have allowance for the caller of at least subtractedValue.

Parameters

Name
Type
Description

spender

address

undefined

subtractedValue

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

delegate

function delegate(address delegatee) external nonpayable

Delegate votes from the sender to delegatee.

Parameters

Name
Type
Description

delegatee

address

undefined

delegateBySig

function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external nonpayable

Delegates votes from signer to delegatee

Parameters

Name
Type
Description

delegatee

address

undefined

nonce

uint256

undefined

expiry

uint256

undefined

v

uint8

undefined

r

bytes32

undefined

s

bytes32

undefined

delegateVestingEscrow

function delegateVestingEscrow(uint256 _index, address _delegatee) external nonpayable returns (bool)

Delegate vesting escrowed tokens

Parameters

Name
Type
Description

_index

uint256

index of the vesting schedule

_delegatee

address

address to delegate the token to

Returns

Name
Type
Description

_0

bool

True on success

delegates

function delegates(address account) external view returns (address)

Get the address account is currently delegating to.

Parameters

Name
Type
Description

account

address

undefined

Returns

Name
Type
Description

_0

address

undefined

eip712Domain

function eip712Domain() external view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)

See {EIP-5267}. Available since v4.9.

Returns

Name
Type
Description

fields

bytes1

undefined

name

string

undefined

version

string

undefined

chainId

uint256

undefined

verifyingContract

address

undefined

salt

bytes32

undefined

extensions

uint256[]

undefined

getPastTotalSupply

function getPastTotalSupply(uint256 timepoint) external view returns (uint256)

Retrieve the totalSupply at the end of timepoint. Note, this value is the sum of all balances. It is NOT the sum of all the delegated votes! Requirements: - timepoint must be in the past

Parameters

Name
Type
Description

timepoint

uint256

undefined

Returns

Name
Type
Description

_0

uint256

undefined

getPastVotes

function getPastVotes(address account, uint256 timepoint) external view returns (uint256)

Retrieve the number of votes for account at the end of timepoint. Requirements: - timepoint must be in the past

Parameters

Name
Type
Description

account

address

undefined

timepoint

uint256

undefined

Returns

Name
Type
Description

_0

uint256

undefined

getVestingSchedule

function getVestingSchedule(uint256 _index) external view returns (struct VestingSchedulesV2.VestingSchedule)

Get vesting schedule

The vesting schedule structure represents a static configuration used to compute the desired vesting details of a beneficiary at all times. The values won't change even after tokens are released.The only dynamic field of the structure is end, and is updated whenever a vesting schedule is revoked

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule

Returns

Name
Type
Description

_0

VestingSchedulesV2.VestingSchedule

undefined

getVestingScheduleCount

function getVestingScheduleCount() external view returns (uint256)

Get count of vesting schedules

Returns

Name
Type
Description

_0

uint256

count of vesting schedules

getVotes

function getVotes(address account) external view returns (uint256)

Gets the current votes balance for account

Parameters

Name
Type
Description

account

address

undefined

Returns

Name
Type
Description

_0

uint256

undefined

increaseAllowance

function increaseAllowance(address spender, uint256 addedValue) external nonpayable returns (bool)

Atomically increases the allowance granted to spender by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - spender cannot be the zero address.

Parameters

Name
Type
Description

spender

address

undefined

addedValue

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

isGlobalUnlockedScheduleIgnored

function isGlobalUnlockedScheduleIgnored(uint256 _index) external view returns (bool)

Get vesting global unlock schedule activation status for a vesting schedule

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule

Returns

Name
Type
Description

_0

bool

true if the vesting schedule should ignore the global unlock schedule

name

function name() external view returns (string)

Returns the name of the token.

Returns

Name
Type
Description

_0

string

undefined

nonces

function nonces(address owner) external view returns (uint256)

See {IERC20Permit-nonces}.

Parameters

Name
Type
Description

owner

address

undefined

Returns

Name
Type
Description

_0

uint256

undefined

numCheckpoints

function numCheckpoints(address account) external view returns (uint32)

Get number of checkpoints for account.

Parameters

Name
Type
Description

account

address

undefined

Returns

Name
Type
Description

_0

uint32

undefined

permit

function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external nonpayable

See {IERC20Permit-permit}.

Parameters

Name
Type
Description

owner

address

undefined

spender

address

undefined

value

uint256

undefined

deadline

uint256

undefined

v

uint8

undefined

r

bytes32

undefined

s

bytes32

undefined

releaseVestingSchedule

function releaseVestingSchedule(uint256 _index) external nonpayable returns (uint256)

Release vesting scheduleWhen tokens are released from the escrow, the delegated address of the escrow will see its voting power decrease.The beneficiary has to make sure its delegation parameters are set properly to be able to use/delegate the voting power of its balance.

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule to release

Returns

Name
Type
Description

_0

uint256

released amount

revokeVestingSchedule

function revokeVestingSchedule(uint256 _index, uint64 _end) external nonpayable returns (uint256)

Revoke vesting schedule

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule to revoke

_end

uint64

End date for the schedule

Returns

Name
Type
Description

_0

uint256

amount returned to the vesting schedule creator

symbol

function symbol() external view returns (string)

Returns the symbol of the token, usually a shorter version of the name.

Returns

Name
Type
Description

_0

string

undefined

totalSupply

function totalSupply() external view returns (uint256)

See {IERC20-totalSupply}.

Returns

Name
Type
Description

_0

uint256

undefined

transfer

function transfer(address to, uint256 amount) external nonpayable returns (bool)

See {IERC20-transfer}. Requirements: - to cannot be the zero address. - the caller must have a balance of at least amount.

Parameters

Name
Type
Description

to

address

undefined

amount

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

transferFrom

function transferFrom(address from, address to, uint256 amount) external nonpayable returns (bool)

See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum uint256. Requirements: - from and to cannot be the zero address. - from must have a balance of at least amount. - the caller must have allowance for from's tokens of at least amount.

Parameters

Name
Type
Description

from

address

undefined

to

address

undefined

amount

uint256

undefined

Returns

Name
Type
Description

_0

bool

undefined

vestingEscrow

function vestingEscrow(uint256 _index) external view returns (address)

Get the address of the escrow for a vesting schedule

Parameters

Name
Type
Description

_index

uint256

Index of the vesting schedule

Returns

Name
Type
Description

_0

address

address of the escrow

Events

Approval

event Approval(address indexed owner, address indexed spender, uint256 value)

Emitted when the allowance of a spender for an owner is set by a call to {approve}. value is the new allowance.

Parameters

Name
Type
Description

owner indexed

address

undefined

spender indexed

address

undefined

value

uint256

undefined

CreatedVestingSchedule

event CreatedVestingSchedule(uint256 index, address indexed creator, address indexed beneficiary, uint256 amount)

A new vesting schedule has been created

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

creator indexed

address

Creator of the vesting schedule

beneficiary indexed

address

Vesting beneficiary address

amount

uint256

Vesting schedule amount

DelegateChanged

event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)

Emitted when an account changes their delegate.

Parameters

Name
Type
Description

delegator indexed

address

undefined

fromDelegate indexed

address

undefined

toDelegate indexed

address

undefined

DelegateVotesChanged

event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance)

Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.

Parameters

Name
Type
Description

delegate indexed

address

undefined

previousBalance

uint256

undefined

newBalance

uint256

undefined

DelegatedVestingEscrow

event DelegatedVestingEscrow(uint256 index, address indexed oldDelegatee, address indexed newDelegatee, address indexed beneficiary)

Vesting escrow has been delegated

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

oldDelegatee indexed

address

old delegatee

newDelegatee indexed

address

new delegatee

beneficiary indexed

address

vesting schedule beneficiary

EIP712DomainChanged

event EIP712DomainChanged()

MAY be emitted to signal that the domain could have changed.

Initialized

event Initialized(uint8 version)

Triggered when the contract has been initialized or reinitialized.

Parameters

Name
Type
Description

version

uint8

undefined

ReleasedVestingSchedule

event ReleasedVestingSchedule(uint256 index, uint256 releasedAmount)

Vesting schedule has been released

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

releasedAmount

uint256

Amount of tokens released to the beneficiary

RevokedVestingSchedule

event RevokedVestingSchedule(uint256 index, uint256 returnedAmount, uint256 newEnd)

Vesting schedule has been revoked

Parameters

Name
Type
Description

index

uint256

Vesting schedule index

returnedAmount

uint256

Amount of tokens returned to the creator

newEnd

uint256

New end timestamp after revoke action

Transfer

event Transfer(address indexed from, address indexed to, uint256 value)

Emitted when value tokens are moved from one account (from) to another (to). Note that value may be zero.

Parameters

Name
Type
Description

from indexed

address

undefined

to indexed

address

undefined

value

uint256

undefined

Errors

GlobalUnlockUnderlfow

error GlobalUnlockUnderlfow()

Underflow in global unlock logic (should never happen)

InvalidRevokedVestingScheduleEnd

error InvalidRevokedVestingScheduleEnd()

Attempt to revoke a vesting schedule with an invalid end parameter

InvalidVestingScheduleParameter

error InvalidVestingScheduleParameter(string msg)

Invalid parameter for a vesting schedule

Parameters

Name
Type
Description

msg

string

undefined

Unauthorized

error Unauthorized(address caller)

The operator is unauthorized for the caller

Parameters

Name
Type
Description

caller

address

Address performing the call

UnsufficientVestingScheduleCreatorBalance

error UnsufficientVestingScheduleCreatorBalance()

Vesting schedule creator has unsufficient balance to create vesting schedule

VestingScheduleIsLocked

error VestingScheduleIsLocked()

The vesting schedule is locked

VestingScheduleNotFound

error VestingScheduleNotFound(uint256 index)

The VestingSchedule was not found

Parameters

Name
Type
Description

index

uint256

vesting schedule index

VestingScheduleNotRevocable

error VestingScheduleNotRevocable()

The vesting schedule is not revocable

VestingScheduleNotRevocableInPast

error VestingScheduleNotRevocableInPast()

Attempt to revoke a schedule in the past

ZeroReleasableAmount

error ZeroReleasableAmount()

No token to release

IOperatorsRegistryV1

Alluvial Finance Inc.

Operators Registry Interface (v1)

This interface exposes methods to handle the list of operators and their keys

Methods

addOperator

Adds an operator to the registry

Only callable by the administrator

Parameters

Returns

addValidators

Adds new keys for an operator

Only callable by the administrator or the operator address

Parameters

demandValidatorExits

Increases the exit request demand

This method is only callable by the river contract, and to actually forward the information to the node operators via event emission, the unprotected requestValidatorExits method must be called

Parameters

getCurrentValidatorExitsDemand

Get the current exit request demand waiting to be triggeredThis value is the amount of exit requests that are demanded and not yet performed by the contract

Returns

getNextValidatorsToDepositFromActiveOperators

Get the next validators that would be funded

Parameters

Returns

getOperator

Get operator details

Parameters

Returns

getOperatorCount

Get operator count

Returns

getOperatorStoppedValidatorCount

Retrieve the stopped validator count for an operator index

Parameters

Returns

getRiver

Retrieve the River address

Returns

getStoppedAndRequestedExitCounts

Retrieve the total stopped and requested exit count

Returns

getStoppedValidatorCountPerOperator

Retrieve the raw stopped validators array from storage

Returns

getTotalStoppedValidatorCount

Retrieve the total stopped validator count

Returns

getTotalValidatorExitsRequested

Retrieve the total requested exit countThis value is the amount of exit requests that have been performed, emitting an event for operators to catch

Returns

getValidator

Get the details of a validator

Parameters

Returns

initOperatorsRegistryV1

Initializes the operators registry

Parameters

initOperatorsRegistryV1_1

Initializes the operators registry for V1_1

listActiveOperators

Retrieve the active operator set

Returns

pickNextValidatorsToDeposit

Retrieve validator keys based on operator statuses

Parameters

Returns

removeValidators

Remove validator keys

Only callable by the administrator or the operator address. The indexes must be provided sorted in decreasing order and duplicate-free, otherwise the method will revertThe operator limit will be set to the lowest deleted key index if the operator's limit wasn't equal to its total key count. The operator or the admin cannot remove funded keysWhen removing validators, the indexes of specific unfunded keys can be changed in order to properly remove the keys from the storage array. Beware of this specific behavior when chaining calls as the targeted public key indexes can point to a different key after a first call was made and performed some swaps

Parameters

reportStoppedValidatorCounts

Allows river to override the stopped validators arrayThis actions happens during the Oracle report processing

Parameters

requestValidatorExits

Public endpoint to consume the exit request demand and perform the actual exit requestsThe selection algorithm will pick validators based on their active validator countsThis value is computed by using the count of funded keys and taking into account the stopped validator counts and exit requests

Parameters

setOperatorAddress

Changes the operator address of an operator

Only callable by the administrator or the previous operator address

Parameters

setOperatorLimits

Changes the operator staking limit

Only callable by the administratorThe operator indexes must be in increasing order and contain no duplicateThe limit cannot exceed the total key count of the operatorThe _indexes and _newLimits must have the same length.Each limit value is applied to the operator index at the same index in the _indexes array.

Parameters

setOperatorName

Changes the operator name

Only callable by the administrator or the operator

Parameters

setOperatorStatus

Changes the operator status

Only callable by the administrator

Parameters

Events

AddedOperator

A new operator has been added to the registry

Parameters

AddedValidatorKeys

The operator or the admin added new validator keys and signatures

The public keys and signatures are concatenatedA public key is 48 bytes longA signature is 96 bytes long[P1, S1, P2, S2, ..., PN, SN] where N is the bytes length divided by (96 + 48)

Parameters

FundedValidatorKeys

A validator key got funded on the deposit contract. This event was introduced during a contract upgrade, in order to cover all possible public keys, this event will be replayed for past funded keys in order to have a complete coverage of all the funded public keys.In this particular scenario, the deferred value will be set to true, to indicate that we are not going to have the expected additional events and side effects in the same transaction (deposit to official DepositContract etc ...) because the event was synthetically crafted.

Parameters

OperatorEditsAfterSnapshot

The operator edited its keys after the snapshot block

This means that we cannot assume that its key set is checked by the snapshotThis happens only if the limit was meant to be increased

Parameters

OperatorLimitUnchanged

The call didn't alter the limit of the operator

Parameters

RemovedValidatorKey

The operator or the admin removed a public key and its signature from the registry

Parameters

RequestedValidatorExits

The requested exit count has been updated

Parameters

SetCurrentValidatorExitsDemand

The exit request demand has been updated

Parameters

SetOperatorAddress

The operator address has been changed

Parameters

SetOperatorLimit

The operator limit has been changed

Parameters

SetOperatorName

The operator display name has been changed

Parameters

SetOperatorStatus

The operator status has been changed

Parameters

SetOperatorStoppedValidatorCount

The operator stopped validator count has been changed

Parameters

SetRiver

The stored river address has been changed

Parameters

SetTotalValidatorExitsRequested

The total requested exit has been updated

Parameters

UpdatedRequestedValidatorExitsUponStopped

The requested exit count has been update to fill the gap with the reported stopped count

Parameters

UpdatedStoppedValidators

The stopped validator array has been changedA validator is considered stopped if exiting, exited or slashedThis event is emitted when the oracle reports new stopped validators counts

Parameters

Errors

InactiveOperator

The calling operator is inactive

Parameters

InvalidArrayLengths

The provided operator and limits array have different lengths

InvalidEmptyArray

The provided operator and limits array are empty

InvalidEmptyStoppedValidatorCountsArray

Thrown when an invalid empty stopped validator array is provided

InvalidFundedKeyDeletionAttempt

A funded key deletion has been attempted

InvalidIndexOutOfBounds

The index that is removed is out of bounds

InvalidKeyCount

The provided key count is 0

InvalidKeysLength

The provided concatenated keys do not have the expected length

InvalidStoppedValidatorCountsSum

Thrown when the sum of stopped validators is invalid

InvalidUnsortedIndexes

The index provided are not sorted properly (descending order)

NoExitRequestsToPerform

Thrown when no exit requests can be performed

OperatorLimitTooHigh

The value for the operator limit is too high

Parameters

OperatorLimitTooLow

The value for the limit is too low

Parameters

StoppedValidatorCountAboveFundedCount

The provided stopped validator count of an operator is above its funded validator count

Parameters

StoppedValidatorCountArrayShrinking

The provided stopped validator count array is shrinking

StoppedValidatorCountsDecreased

Throw when an element in the stopped validator array is decreasing

StoppedValidatorCountsTooHigh

Thrown when the number of elements in the array is too high compared to operator count

UnorderedOperatorList

The provided list of operators is not in increasing order

IOracleV1

Alluvial Finance Inc.

Oracle Interface (v1)

This interface exposes methods to handle the input from the allowed oracle members.Highly inspired by Lido's implementation.

Methods

addMember

Adds new address as oracle member, giving the ability to push cl reports.

Only callable by the administrator. Modifying the quorum clears all the reporting data

Parameters

getGlobalReportStatus

Retrieve member report status

Returns

getLastReportedEpochId

Retrieve the last reported epoch id

The Oracle contracts expects reports on an epoch id >= that the returned value

Returns

getMemberReportStatus

Retrieve member report status

Parameters

Returns

getOracleMembers

Retrieve the list of oracle members

Returns

getQuorum

Retrieve the current quorum

Returns

getReportVariantDetails

Retrieve the details of a report variant

Parameters

Returns

getReportVariantsCount

Retrieve report variants count

Returns

getRiver

Retrieve River address

Returns

initOracleV1

Initializes the oracle

Parameters

initOracleV1_1

Initializes the oracle

isMember

Returns true if address is member

Performs a naive search, do not call this on-chain, used as an off-chain helper

Parameters

Returns

removeMember

Removes an address from the oracle members.

Only callable by the administrator. Modifying the quorum clears all the reporting data. Remaining members that have already voted should vote again for the same frame.

Parameters

reportConsensusLayerData

Parameters

setMember

Changes the address of an oracle member

Only callable by the administrator or the member itselfCannot use an address already in use

Parameters

setQuorum

Edits the quorum required to forward cl data to River

Modifying the quorum clears all the reporting data

Parameters

Events

AddMember

A member has been added to the oracle member list

Parameters

ClearedReporting

Cleared reporting data

RemoveMember

A member has been removed from the oracle member list

Parameters

ReportedConsensusLayerData

An oracle member performed a report

Parameters

SetBounds

The report bounds have been changed

Parameters

SetLastReportedEpoch

The last reported epoch has changed

Parameters

SetMember

A member address has been edited

Parameters

SetQuorum

The storage quorum value has been changed

Parameters

SetRiver

The storage river address value has been changed

Parameters

SetSpec

The consensus layer spec has been changed

Parameters

Errors

AddressAlreadyInUse

The address is already in use by an oracle member

Parameters

AlreadyReported

The member already reported on the given epoch id

Parameters

EpochTooOld

The provided epoch is too old compared to the expected epoch id

Parameters

InvalidEpoch

Thrown when the reported epoch is invalid

Parameters

ReportIndexOutOfBounds

Thrown when the report indexes fetched is out of bounds

Parameters

ICoverageFundV1

Alluvial Finance Inc.

Coverage Fund Interface (v1)

This interface exposes methods to receive donations for the slashing coverage fund and pull the funds into river

Methods

donate

Donates ETH to the coverage fund contract

initCoverageFundV1

Initialize the coverage fund with the required arguments

Parameters

pullCoverageFunds

Pulls ETH into the River contract

Only callable by the River contract

Parameters

Events

Donate

A donation has been made to the coverage fund

Parameters

SetRiver

The storage river address has changed

Parameters

Errors

EmptyDonation

A donation with 0 ETH has been performed

InvalidCall

The fallback or receive callback has been triggered

ITLCV1

Alluvial Finance Inc.

TLC Interface (v1)

TLC token interface

Methods

allowance

Returns the remaining number of tokens that spender will be allowed to spend on behalf of owner through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.

Parameters

Returns

approve

Sets amount as the allowance of spender over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.

Parameters

Returns

balanceOf

Returns the amount of tokens owned by account.

Parameters

Returns

computeVestingReleasableAmount

Computes the releasable amount of tokens for a vesting schedule.

Parameters

Returns

computeVestingVestedAmount

Computes the vested amount of tokens for a vesting schedule.

Parameters

Returns

createVestingSchedule

Creates a new vesting scheduleThere may delay between the time a user should start vesting tokens and the time the vesting schedule is actually created on the contract.Typically a user joins the Liquid Collective but some weeks pass before the user gets all legal agreements in place and signed for the token grant emission to happen. In this case, the vesting schedule created for the token grant would start on the join date which is in the past.

As vesting schedules can be created in the past, this means that you should be careful when creating a vesting schedule and what duration parameters you use as this contract would allow creating a vesting schedule in the past and even a vesting schedule that has already ended.

Parameters

Returns

delegate

Delegates votes from the sender to delegatee.

Parameters

delegateBySig

Delegates votes from signer to delegatee.

Parameters

delegateVestingEscrow

Delegate vesting escrowed tokens

Parameters

Returns

delegates

Returns the delegate that account has chosen.

Parameters

Returns

getPastTotalSupply

Returns the total supply of votes available at a specific moment in the past. If the clock() is configured to use block numbers, this will return the value at the end of the corresponding block. NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. Votes that have not been delegated are still part of total supply, even though they would not participate in a vote.

Parameters

Returns

getPastVotes

Returns the amount of votes that account had at a specific moment in the past. If the clock() is configured to use block numbers, this will return the value at the end of the corresponding block.

Parameters

Returns

getVestingSchedule

Get vesting schedule

The vesting schedule structure represents a static configuration used to compute the desired vesting details of a beneficiary at all times. The values won't change even after tokens are released. The only dynamic field of the structure is end, and is updated whenever a vesting schedule is revoked

Parameters

Returns

getVestingScheduleCount

Get count of vesting schedules

Returns

getVotes

Returns the current amount of votes that account has.

Parameters

Returns

initTLCV1

Initializes the TLC Token

Parameters

isGlobalUnlockedScheduleIgnored

Get vesting global unlock schedule activation status for a vesting schedule

Parameters

Returns

migrateVestingSchedules

Migrates the vesting schedule state structures

releaseVestingSchedule

Release vesting scheduleWhen tokens are released from the escrow, the delegated address of the escrow will see its voting power decrease.The beneficiary has to make sure its delegation parameters are set properly to be able to use/delegate the voting power of its balance.

Parameters

Returns

revokeVestingSchedule

Revoke vesting schedule

Parameters

Returns

totalSupply

Returns the amount of tokens in existence.

Returns

transfer

Moves amount tokens from the caller's account to to. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.

Parameters

Returns

transferFrom

Moves amount tokens from from to to using the allowance mechanism. amount is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.

Parameters

Returns

vestingEscrow

Get the address of the escrow for a vesting schedule

Parameters

Returns

Events

Approval

Emitted when the allowance of a spender for an owner is set by a call to {approve}. value is the new allowance.

Parameters

CreatedVestingSchedule

A new vesting schedule has been created

Parameters

DelegateChanged

Emitted when an account changes their delegate.

Parameters

DelegateVotesChanged

Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.

Parameters

DelegatedVestingEscrow

Vesting escrow has been delegated

Parameters

ReleasedVestingSchedule

Vesting schedule has been released

Parameters

RevokedVestingSchedule

Vesting schedule has been revoked

Parameters

Transfer

Emitted when value tokens are moved from one account (from) to another (to). Note that value may be zero.

Parameters

Errors

GlobalUnlockUnderlfow

Underflow in global unlock logic (should never happen)

InvalidRevokedVestingScheduleEnd

Attempt to revoke a vesting schedule with an invalid end parameter

InvalidVestingScheduleParameter

Invalid parameter for a vesting schedule

Parameters

UnsufficientVestingScheduleCreatorBalance

Vesting schedule creator has unsufficient balance to create vesting schedule

VestingScheduleIsLocked

The vesting schedule is locked

VestingScheduleNotRevocable

The vesting schedule is not revocable

VestingScheduleNotRevocableInPast

Attempt to revoke a schedule in the past

ZeroReleasableAmount

No token to release

IWLSETHV1

Alluvial Finance Inc.

Wrapped LsETH Interface (v1)

This interface exposes methods to wrap the LsETH token into a rebase token.

Methods

allowance

Retrieves the token allowance given from one address to another

Parameters

Returns

approve

Approves another account to transfer tokens

Parameters

Returns

balanceOf

Retrieves the token balance of the specified user

Parameters

Returns

burn

Burn tokens and retrieve underlying LsETH tokens

The message sender burns shares from its balance for the LsETH equivalent valueThe message sender doesn't need to approve the contract to burn the sharesThe freed LsETH is sent to the specified recipient

Parameters

decimals

Retrieves the token decimal count

Returns

decreaseAllowance

Decrease allowance to another account

Parameters

Returns

increaseAllowance

Increase allowance to another account

Parameters

Returns

initWLSETHV1

Initializes the wrapped token contract

Parameters

mint

Mint tokens by providing LsETH tokens

The message sender locks LsETH tokens and received wrapped LsETH tokens in exchangeThe message sender needs to approve the contract to mint the wrapped tokensThe minted wrapped LsETH is sent to the specified recipient

Parameters

name

Retrieves the token full name

Returns

sharesOf

Retrieves the raw shares count of the user

Parameters

Returns

symbol

Retrieves the token symbol

Returns

totalSupply

Retrieves the token total supply

Returns

transfer

Transfers tokens between the message sender and a recipient

Parameters

Returns

transferFrom

Transfers tokens between two accounts

It is expected that _from has given at least _value allowance to msg.sender

Parameters

Returns

Events

Approval

An approval has been made

Parameters

Burn

Tokens have been burned

Parameters

Mint

Tokens have been minted

Parameters

SetRiver

The stored value of river has been changed

Parameters

Transfer

A transfer has been made

Parameters

Errors

AllowanceTooLow

Allowance too low to perform operation

Parameters

BalanceTooLow

Balance too low to perform operation

NullTransfer

Invalid empty transfer

TokenTransferError

The token transfer failed during the minting or burning process

UnauthorizedTransfer

Invalid transfer recipients

Parameters

IWithdrawV1

Alluvial Finance Inc.

Withdraw Interface (V1)

This contract is in charge of holding the exit and skimming funds and allow river to pull these funds

Methods

getCredentials

Retrieve the withdrawal credentials to use

Returns

getRiver

Retrieve the linked River address

Returns

initializeWithdrawV1

Parameters

pullEth

Callable by River, sends the specified amount of ETH to River

Parameters

Events

SetRiver

Emitted when the linked River address is changed

Parameters

This is an ERC20 extension that- can be used as source of vote power (inherited from OpenZeppelin ERC20VotesUpgradeable)- can delegate vote power from an account to another account (inherited from OpenZeppelin ERC20VotesUpgradeable)- can manage token vestings: ownership is progressively transferred to a beneficiary according to a vesting schedule- keeps a history (checkpoints) of each account's vote power@notice Notes from OpenZeppelin - vote power can be delegated either by calling the {delegate} function, or by providing a signature to be used with {delegateBySig}- keeps a history (checkpoints) of each account's vote power- power can be queried through the public accessors {getVotes} and {getPastVotes}.- by default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.@notice Notes about token vesting- any token holder can call the method {createVestingSchedule} in order to transfer tokens to a beneficiary according to a vesting schedule. When creating a vesting schedule, tokens are transferred to an escrow that holds the token while the vesting progresses. Voting power of the escrowed token is delegated to the beneficiary or a delegatee account set by the vesting schedule creator- the schedule beneficiary call {releaseVestingSchedule} to get vested tokens transferred from escrow- the schedule creator can revoke a revocable schedule by calling {revokeVestingSchedule} in which case the non-vested tokens are transferred from the escrow back to the creator- the schedule beneficiary can delegate escrow voting power to any account by calling {delegateVestingEscrow}@notice Vesting schedule attributes are- start : start time of the vesting period- cliff duration: duration before which first tokens gets ownable- total duration: duration of the entire vesting (sum of all vesting period durations)- period duration: duration of a single period of vesting- lock duration: duration before tokens gets unlocked. can exceed the duration of the vesting schedule- amount: amount of tokens granted by the vesting schedule- beneficiary: beneficiary of tokens after they are releaseVestingScheduled- revocable: whether the schedule can be revoked- ignoreGlobalUnlockSchedule: whether the schedule should ignore the global unlock schedule@notice Vesting schedule- if currentTime < cliff: vestedToken = 0- if cliff <= currentTime < end: vestedToken = (vestedPeriodCount(currentTime) _ periodDuration _ amount) / totalDuration- if end < currentTime: vestedToken = amount@notice Global unlock schedule- the global unlock schedule releases 1/24th of the total scheduled amount every month after the local lock end- the local lock end is the end of the lock period of the vesting schedule- the global unlock schedule is ignored if the vesting schedule has the ignoreGlobalUnlockSchedule flag set to true- the global unlock schedule is only a cap on the vested funds that can be withdrawn, it does not alter the vesting@notice Remark: After cliff new tokens get vested at the end of each period@notice Vested token & lock period- a vested token is a token that will be eventually releasable from the escrow to the beneficiary once the lock period is over- lock period prevents beneficiary from releasing vested tokens before the lock period ends. Vested tokens will eventually be releasable once the lock period is over@notice Example: Joe gets a vesting starting on Jan 1st 2022 with duration of 1 year and a lock period of 2 years.On Jan 1st 2023, Joe will have all tokens vested but can not yet release it due to the lock period.On Jan 1st 2024, lock period is over and Joe can release all tokens.

Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
ERC20VotesUpgradeable
function addOperator(string _name, address _operator) external nonpayable returns (uint256)

_name

string

The name identifying the operator

_operator

address

The address representing the operator, receiving the rewards

_0

uint256

The index of the new operator

function addValidators(uint256 _index, uint32 _keyCount, bytes _publicKeysAndSignatures) external nonpayable

_index

uint256

The operator index

_keyCount

uint32

The amount of keys provided

_publicKeysAndSignatures

bytes

Public keys of the validator, concatenated

function demandValidatorExits(uint256 _count, uint256 _depositedValidatorCount) external nonpayable

_count

uint256

The amount of exit requests to add to the demand

_depositedValidatorCount

uint256

The total deposited validator count

function getCurrentValidatorExitsDemand() external view returns (uint256)

_0

uint256

The current exit request demand

function getNextValidatorsToDepositFromActiveOperators(uint256 _count) external view returns (bytes[] publicKeys, bytes[] signatures)

_count

uint256

Count of validators that would be funded next

publicKeys

bytes[]

An array of fundable public keys

signatures

bytes[]

An array of signatures linked to the public keys

function getOperator(uint256 _index) external view returns (struct OperatorsV2.Operator)

_index

uint256

The index of the operator

_0

OperatorsV2.Operator

The details of the operator

function getOperatorCount() external view returns (uint256)

_0

uint256

The operator count

function getOperatorStoppedValidatorCount(uint256 _idx) external view returns (uint32)

_idx

uint256

The index of the operator

_0

uint32

The stopped validator count of the operator

function getRiver() external view returns (address)

_0

address

The address of River

function getStoppedAndRequestedExitCounts() external view returns (uint32, uint256)

_0

uint32

The total stopped count

_1

uint256

The total requested exit count

function getStoppedValidatorCountPerOperator() external view returns (uint32[])

_0

uint32[]

The stopped validator array

function getTotalStoppedValidatorCount() external view returns (uint32)

_0

uint32

The total stopped validator count

function getTotalValidatorExitsRequested() external view returns (uint256)

_0

uint256

The total requested exit count

function getValidator(uint256 _operatorIndex, uint256 _validatorIndex) external view returns (bytes publicKey, bytes signature, bool funded)

_operatorIndex

uint256

The index of the operator

_validatorIndex

uint256

The index of the validator

publicKey

bytes

The public key of the validator

signature

bytes

The signature used during deposit

funded

bool

True if validator has been funded

function initOperatorsRegistryV1(address _admin, address _river) external nonpayable

_admin

address

Admin in charge of managing operators

_river

address

Address of River system

function initOperatorsRegistryV1_1() external nonpayable
function listActiveOperators() external view returns (struct OperatorsV2.Operator[])

_0

OperatorsV2.Operator[]

The list of active operators and their details

function pickNextValidatorsToDeposit(uint256 _count) external nonpayable returns (bytes[] publicKeys, bytes[] signatures)

_count

uint256

Max amount of keys requested

publicKeys

bytes[]

An array of public keys

signatures

bytes[]

An array of signatures linked to the public keys

function removeValidators(uint256 _index, uint256[] _indexes) external nonpayable

_index

uint256

The operator index

_indexes

uint256[]

The indexes of the keys to remove

function reportStoppedValidatorCounts(uint32[] _stoppedValidatorCounts, uint256 _depositedValidatorCount) external nonpayable

_stoppedValidatorCounts

uint32[]

The new stopped validators array

_depositedValidatorCount

uint256

The total deposited validator count

function requestValidatorExits(uint256 _count) external nonpayable

_count

uint256

Max amount of exits to request

function setOperatorAddress(uint256 _index, address _newOperatorAddress) external nonpayable

_index

uint256

The operator index

_newOperatorAddress

address

The new address of the operator

function setOperatorLimits(uint256[] _operatorIndexes, uint32[] _newLimits, uint256 _snapshotBlock) external nonpayable

_operatorIndexes

uint256[]

The operator indexes, in increasing order and duplicate free

_newLimits

uint32[]

The new staking limit of the operators

_snapshotBlock

uint256

The block number at which the snapshot was computed

function setOperatorName(uint256 _index, string _newName) external nonpayable

_index

uint256

The operator index

_newName

string

The new operator name

function setOperatorStatus(uint256 _index, bool _newStatus) external nonpayable

_index

uint256

The operator index

_newStatus

bool

The new status of the operator

event AddedOperator(uint256 indexed index, string name, address indexed operatorAddress)

index indexed

uint256

The operator index

name

string

The operator display name

operatorAddress indexed

address

The operator address

event AddedValidatorKeys(uint256 indexed index, bytes publicKeysAndSignatures)

index indexed

uint256

The operator index

publicKeysAndSignatures

bytes

The concatenated public keys and signatures

event FundedValidatorKeys(uint256 indexed index, bytes[] publicKeys, bool deferred)

index indexed

uint256

The operator index

publicKeys

bytes[]

BLS Public key that got funded

deferred

bool

True if event has been replayed in the context of a migration

event OperatorEditsAfterSnapshot(uint256 indexed index, uint256 currentLimit, uint256 newLimit, uint256 indexed latestKeysEditBlockNumber, uint256 indexed snapshotBlock)

index indexed

uint256

The operator index

currentLimit

uint256

The current operator limit

newLimit

uint256

The new operator limit that was attempted to be set

latestKeysEditBlockNumber indexed

uint256

The last block number at which the operator changed its keys

snapshotBlock indexed

uint256

The block number of the snapshot

event OperatorLimitUnchanged(uint256 indexed index, uint256 limit)

index indexed

uint256

The operator index

limit

uint256

The limit of the operator

event RemovedValidatorKey(uint256 indexed index, bytes publicKey)

index indexed

uint256

The operator index

publicKey

bytes

The BLS public key that has been removed

event RequestedValidatorExits(uint256 indexed index, uint256 count)

index indexed

uint256

The operator index

count

uint256

The count of requested exits

event SetCurrentValidatorExitsDemand(uint256 previousValidatorExitsDemand, uint256 nextValidatorExitsDemand)

previousValidatorExitsDemand

uint256

The previous exit request demand

nextValidatorExitsDemand

uint256

The new exit request demand

event SetOperatorAddress(uint256 indexed index, address indexed newOperatorAddress)

index indexed

uint256

The operator index

newOperatorAddress indexed

address

The new operator address

event SetOperatorLimit(uint256 indexed index, uint256 newLimit)

index indexed

uint256

The operator index

newLimit

uint256

The new operator staking limit

event SetOperatorName(uint256 indexed index, string newName)

index indexed

uint256

The operator index

newName

string

The new display name

event SetOperatorStatus(uint256 indexed index, bool active)

index indexed

uint256

The operator index

active

bool

True if the operator is active

event SetOperatorStoppedValidatorCount(uint256 indexed index, uint256 newStoppedValidatorCount)

index indexed

uint256

The operator index

newStoppedValidatorCount

uint256

The new stopped validator count

event SetRiver(address indexed river)

river indexed

address

The new river address

event SetTotalValidatorExitsRequested(uint256 previousTotalValidatorExitsRequested, uint256 newTotalValidatorExitsRequested)

previousTotalValidatorExitsRequested

uint256

The previous total requested exit

newTotalValidatorExitsRequested

uint256

The new total requested exit

event UpdatedRequestedValidatorExitsUponStopped(uint256 indexed index, uint32 oldRequestedExits, uint32 newRequestedExits)

index indexed

uint256

The operator index

oldRequestedExits

uint32

The old requested exit count

newRequestedExits

uint32

The new requested exit count

event UpdatedStoppedValidators(uint32[] stoppedValidatorCounts)

stoppedValidatorCounts

uint32[]

The new stopped validator counts

error InactiveOperator(uint256 index)

index

uint256

The operator index

error InvalidArrayLengths()
error InvalidEmptyArray()
error InvalidEmptyStoppedValidatorCountsArray()
error InvalidFundedKeyDeletionAttempt()
error InvalidIndexOutOfBounds()
error InvalidKeyCount()
error InvalidKeysLength()
error InvalidStoppedValidatorCountsSum()
error InvalidUnsortedIndexes()
error NoExitRequestsToPerform()
error OperatorLimitTooHigh(uint256 index, uint256 limit, uint256 keyCount)

index

uint256

The operator index

limit

uint256

The new limit provided

keyCount

uint256

The operator key count

error OperatorLimitTooLow(uint256 index, uint256 limit, uint256 fundedKeyCount)

index

uint256

The operator index

limit

uint256

The new limit provided

fundedKeyCount

uint256

The operator funded key count

error StoppedValidatorCountAboveFundedCount(uint256 operatorIndex, uint32 stoppedCount, uint32 fundedCount)

operatorIndex

uint256

undefined

stoppedCount

uint32

undefined

fundedCount

uint32

undefined

error StoppedValidatorCountArrayShrinking()
error StoppedValidatorCountsDecreased()
error StoppedValidatorCountsTooHigh()
error UnorderedOperatorList()
function addMember(address _newOracleMember, uint256 _newQuorum) external nonpayable

_newOracleMember

address

Address of the new member

_newQuorum

uint256

New quorum value

function getGlobalReportStatus() external view returns (uint256)

_0

uint256

The raw report status value

function getLastReportedEpochId() external view returns (uint256)

_0

uint256

The last reported epoch id

function getMemberReportStatus(address _oracleMember) external view returns (bool)

_oracleMember

address

Address of member to check

_0

bool

True if member has reported

function getOracleMembers() external view returns (address[])

_0

address[]

The oracle members

function getQuorum() external view returns (uint256)

_0

uint256

The current quorum

function getReportVariantDetails(uint256 _idx) external view returns (struct ReportsVariants.ReportVariantDetails)

_idx

uint256

The index of the report variant

_0

ReportsVariants.ReportVariantDetails

The report variant details

function getReportVariantsCount() external view returns (uint256)

_0

uint256

The count of report variants

function getRiver() external view returns (address)

_0

address

The address of River

function initOracleV1(address _river, address _administratorAddress, uint64 _epochsPerFrame, uint64 _slotsPerEpoch, uint64 _secondsPerSlot, uint64 _genesisTime, uint256 _annualAprUpperBound, uint256 _relativeLowerBound) external nonpayable

_river

address

Address of the River contract, able to receive oracle input data after quorum is met

_administratorAddress

address

Address able to call administrative methods

_epochsPerFrame

uint64

CL spec parameter. Number of epochs in a frame.

_slotsPerEpoch

uint64

CL spec parameter. Number of slots in one epoch.

_secondsPerSlot

uint64

CL spec parameter. Number of seconds between slots.

_genesisTime

uint64

CL spec parameter. Timestamp of the genesis slot.

_annualAprUpperBound

uint256

CL bound parameter. Maximum apr allowed for balance increase. Delta between updates is extrapolated on a year time frame.

_relativeLowerBound

uint256

CL bound parameter. Maximum relative balance decrease.

function initOracleV1_1() external nonpayable
function isMember(address _memberAddress) external view returns (bool)

_memberAddress

address

Address of the member

_0

bool

True if address is a member

function removeMember(address _oracleMember, uint256 _newQuorum) external nonpayable

_oracleMember

address

Address to remove

_newQuorum

uint256

New quorum value

function reportConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable

_report

IOracleManagerV1.ConsensusLayerReport

undefined

function setMember(address _oracleMember, address _newAddress) external nonpayable

_oracleMember

address

Address to change

_newAddress

address

New address for the member

function setQuorum(uint256 _newQuorum) external nonpayable

_newQuorum

uint256

New quorum parameter

event AddMember(address indexed member)

member indexed

address

The address of the member

event ClearedReporting()
event RemoveMember(address indexed member)

member indexed

address

The address of the member

event ReportedConsensusLayerData(address indexed member, bytes32 indexed variant, IOracleManagerV1.ConsensusLayerReport report, uint256 voteCount, uint256 quorum)

member indexed

address

The oracle member

variant indexed

bytes32

The variant of the report

report

IOracleManagerV1.ConsensusLayerReport

The raw report structure

voteCount

uint256

The vote count

quorum

uint256

undefined

event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)

annualAprUpperBound

uint256

The maximum allowed apr. 10% means increases in balance extrapolated to a year should not exceed 10%.

relativeLowerBound

uint256

The maximum allowed balance decrease as a relative % of the total balance

event SetLastReportedEpoch(uint256 lastReportedEpoch)

lastReportedEpoch

uint256

undefined

event SetMember(address indexed oldAddress, address indexed newAddress)

oldAddress indexed

address

The previous member address

newAddress indexed

address

The new member address

event SetQuorum(uint256 newQuorum)

newQuorum

uint256

The new quorum value

event SetRiver(address _river)

_river

address

The new river address

event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime)

epochsPerFrame

uint64

The number of epochs inside a frame (225 = 24 hours)

slotsPerEpoch

uint64

The number of slots inside an epoch (32 on ethereum mainnet)

secondsPerSlot

uint64

The time between two slots (12 seconds on ethereum mainnet)

genesisTime

uint64

The timestamp of block #0

error AddressAlreadyInUse(address newAddress)

newAddress

address

The address already in use

error AlreadyReported(uint256 epochId, address member)

epochId

uint256

The epoch id provided as input

member

address

The oracle member

error EpochTooOld(uint256 providedEpochId, uint256 minExpectedEpochId)

providedEpochId

uint256

The epoch id provided as input

minExpectedEpochId

uint256

The minimum epoch id expected

error InvalidEpoch(uint256 epoch)

epoch

uint256

The invalid epoch

error ReportIndexOutOfBounds(uint256 index, uint256 length)

index

uint256

Requested index

length

uint256

Size of the variant array

function donate() external payable
function initCoverageFundV1(address _riverAddress) external nonpayable

_riverAddress

address

Address of River

function pullCoverageFunds(uint256 _maxAmount) external nonpayable

_maxAmount

uint256

The maximum amount to pull into the system

event Donate(address indexed donator, uint256 amount)

donator indexed

address

Address that performed the donation

amount

uint256

The amount donated

event SetRiver(address indexed river)

river indexed

address

The new river address

error EmptyDonation()
error InvalidCall()
function allowance(address owner, address spender) external view returns (uint256)

owner

address

undefined

spender

address

undefined

_0

uint256

undefined

function approve(address spender, uint256 amount) external nonpayable returns (bool)

spender

address

undefined

amount

uint256

undefined

_0

bool

undefined

function balanceOf(address account) external view returns (uint256)

account

address

undefined

_0

uint256

undefined

function computeVestingReleasableAmount(uint256 _index) external view returns (uint256)

_index

uint256

index of the vesting schedule

_0

uint256

amount of releasable tokens

function computeVestingVestedAmount(uint256 _index) external view returns (uint256)

_index

uint256

index of the vesting schedule

_0

uint256

amount of vested tokens

function createVestingSchedule(uint64 _start, uint32 _cliffDuration, uint32 _duration, uint32 _periodDuration, uint32 _lockDuration, bool _revocable, uint256 _amount, address _beneficiary, address _delegatee, bool _ignoreGlobalUnlockSchedule) external nonpayable returns (uint256)

_start

uint64

start time of the vesting

_cliffDuration

uint32

duration to vesting cliff (in seconds)

_duration

uint32

total vesting schedule duration after which all tokens are vested (in seconds)

_periodDuration

uint32

duration of a period after which new tokens unlock (in seconds)

_lockDuration

uint32

duration during which tokens are locked (in seconds)

_revocable

bool

whether the vesting schedule is revocable or not

_amount

uint256

amount of token attributed by the vesting schedule

_beneficiary

address

address of the beneficiary of the tokens

_delegatee

address

address to delegate escrow voting power to

_ignoreGlobalUnlockSchedule

bool

whether the vesting schedule should ignore the global lock

_0

uint256

index of the created vesting schedule

function delegate(address delegatee) external nonpayable

delegatee

address

undefined

function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external nonpayable

delegatee

address

undefined

nonce

uint256

undefined

expiry

uint256

undefined

v

uint8

undefined

r

bytes32

undefined

s

bytes32

undefined

function delegateVestingEscrow(uint256 _index, address _delegatee) external nonpayable returns (bool)

_index

uint256

index of the vesting schedule

_delegatee

address

address to delegate the token to

_0

bool

True on success

function delegates(address account) external view returns (address)

account

address

undefined

_0

address

undefined

function getPastTotalSupply(uint256 timepoint) external view returns (uint256)

timepoint

uint256

undefined

_0

uint256

undefined

function getPastVotes(address account, uint256 timepoint) external view returns (uint256)

account

address

undefined

timepoint

uint256

undefined

_0

uint256

undefined

function getVestingSchedule(uint256 _index) external view returns (struct VestingSchedulesV2.VestingSchedule)

_index

uint256

Index of the vesting schedule

_0

VestingSchedulesV2.VestingSchedule

undefined

function getVestingScheduleCount() external view returns (uint256)

_0

uint256

count of vesting schedules

function getVotes(address account) external view returns (uint256)

account

address

undefined

_0

uint256

undefined

function initTLCV1(address _account) external nonpayable

_account

address

The initial account to grant all the minted tokens

function isGlobalUnlockedScheduleIgnored(uint256 _index) external view returns (bool)

_index

uint256

Index of the vesting schedule

_0

bool

true if the vesting schedule should ignore the global unlock schedule

function migrateVestingSchedules() external nonpayable
function releaseVestingSchedule(uint256 _index) external nonpayable returns (uint256)

_index

uint256

Index of the vesting schedule to release

_0

uint256

released amount

function revokeVestingSchedule(uint256 _index, uint64 _end) external nonpayable returns (uint256 returnedAmount)

_index

uint256

Index of the vesting schedule to revoke

_end

uint64

End date for the schedule

returnedAmount

uint256

amount returned to the vesting schedule creator

function totalSupply() external view returns (uint256)

_0

uint256

undefined

function transfer(address to, uint256 amount) external nonpayable returns (bool)

to

address

undefined

amount

uint256

undefined

_0

bool

undefined

function transferFrom(address from, address to, uint256 amount) external nonpayable returns (bool)

from

address

undefined

to

address

undefined

amount

uint256

undefined

_0

bool

undefined

function vestingEscrow(uint256 _index) external view returns (address)

_index

uint256

Index of the vesting schedule

_0

address

address of the escrow

event Approval(address indexed owner, address indexed spender, uint256 value)

owner indexed

address

undefined

spender indexed

address

undefined

value

uint256

undefined

event CreatedVestingSchedule(uint256 index, address indexed creator, address indexed beneficiary, uint256 amount)

index

uint256

Vesting schedule index

creator indexed

address

Creator of the vesting schedule

beneficiary indexed

address

Vesting beneficiary address

amount

uint256

Vesting schedule amount

event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)

delegator indexed

address

undefined

fromDelegate indexed

address

undefined

toDelegate indexed

address

undefined

event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance)

delegate indexed

address

undefined

previousBalance

uint256

undefined

newBalance

uint256

undefined

event DelegatedVestingEscrow(uint256 index, address indexed oldDelegatee, address indexed newDelegatee, address indexed beneficiary)

index

uint256

Vesting schedule index

oldDelegatee indexed

address

old delegatee

newDelegatee indexed

address

new delegatee

beneficiary indexed

address

vesting schedule beneficiary

event ReleasedVestingSchedule(uint256 index, uint256 releasedAmount)

index

uint256

Vesting schedule index

releasedAmount

uint256

Amount of tokens released to the beneficiary

event RevokedVestingSchedule(uint256 index, uint256 returnedAmount, uint256 newEnd)

index

uint256

Vesting schedule index

returnedAmount

uint256

Amount of tokens returned to the creator

newEnd

uint256

New end timestamp after revoke action

event Transfer(address indexed from, address indexed to, uint256 value)

from indexed

address

undefined

to indexed

address

undefined

value

uint256

undefined

error GlobalUnlockUnderlfow()
error InvalidRevokedVestingScheduleEnd()
error InvalidVestingScheduleParameter(string msg)

msg

string

undefined

error UnsufficientVestingScheduleCreatorBalance()
error VestingScheduleIsLocked()
error VestingScheduleNotRevocable()
error VestingScheduleNotRevocableInPast()
error ZeroReleasableAmount()
function allowance(address _owner, address _spender) external view returns (uint256)

_owner

address

Owner that gave the allowance

_spender

address

Spender that received the allowance

_0

uint256

The allowance of the owner to the spender

function approve(address _spender, uint256 _value) external nonpayable returns (bool)

_spender

address

Spender that receives the allowance

_value

uint256

Amount to allow

_0

bool

True if success

function balanceOf(address _owner) external view returns (uint256)

_owner

address

Owner to check the balance

_0

uint256

The balance of the owner

function burn(address _recipient, uint256 _shares) external nonpayable

_recipient

address

The account receiving the underlying LsETH tokens after shares are burned

_shares

uint256

Amount of LsETH to free by burning wrapped LsETH

function decimals() external pure returns (uint8)

_0

uint8

The decimal count

function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)

_spender

address

Spender that receives the allowance

_subtractableValue

uint256

Amount to subtract

_0

bool

True if success

function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)

_spender

address

Spender that receives the allowance

_additionalValue

uint256

Amount to add

_0

bool

True if success

function initWLSETHV1(address _river) external nonpayable

_river

address

Address of the River contract

function mint(address _recipient, uint256 _shares) external nonpayable

_recipient

address

The account receiving the new minted wrapped LsETH

_shares

uint256

The amount of LsETH to wrap

function name() external pure returns (string)

_0

string

The name of the token

function sharesOf(address _owner) external view returns (uint256)

_owner

address

Owner to check the shares balance

_0

uint256

The shares of the owner

function symbol() external pure returns (string)

_0

string

The symbol of the token

function totalSupply() external view returns (uint256)

_0

uint256

The total supply

function transfer(address _to, uint256 _value) external nonpayable returns (bool)

_to

address

Recipient of the transfer

_value

uint256

Amount to transfer

_0

bool

True if success

function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)

_from

address

Sender account

_to

address

Recipient of the transfer

_value

uint256

Amount to transfer

_0

bool

True if success

event Approval(address indexed owner, address indexed spender, uint256 value)

owner indexed

address

The token owner

spender indexed

address

The account allowed by the owner

value

uint256

The amount allowed

event Burn(address indexed recipient, uint256 shares)

recipient indexed

address

The account that receive the underlying LsETH

shares

uint256

The amount of LsETH that got sent back

event Mint(address indexed recipient, uint256 shares)

recipient indexed

address

The account receiving the new tokens

shares

uint256

The amount of LsETH provided

event SetRiver(address indexed river)

river indexed

address

The new address of river

event Transfer(address indexed from, address indexed to, uint256 value)

from indexed

address

The transfer sender

to indexed

address

The transfer recipient

value

uint256

The amount transferred

error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)

_from

address

Account where funds are sent from

_operator

address

Account attempting the transfer

_allowance

uint256

Current allowance

_value

uint256

Requested transfer value

error BalanceTooLow()
error NullTransfer()
error TokenTransferError()
error UnauthorizedTransfer(address _from, address _to)

_from

address

Account sending the funds in the invalid transfer

_to

address

Account receiving the funds in the invalid transfer

function getCredentials() external view returns (bytes32)

_0

bytes32

The withdrawal credentials

function getRiver() external view returns (address)

_0

address

The River address

function initializeWithdrawV1(address _river) external nonpayable

_river

address

The address of the River contract

function pullEth(uint256 _amount) external nonpayable

_amount

uint256

The amount to pull

event SetRiver(address river)

river

address

The new River address

LibBasisPoints

Lib Basis Points

Holds the basis points max value

LibErrors

Lib Errors

Library of common errors

Errors

InvalidArgument

error InvalidArgument()

The argument was invalid

InvalidCall

error InvalidCall()

The call was invalid

InvalidEmptyString

error InvalidEmptyString()

The string is empty

InvalidFee

error InvalidFee()

The fee is invalid

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

Unauthorized

error Unauthorized(address caller)

The operator is unauthorized for the caller

Parameters

Name
Type
Description

caller

address

Address performing the call

IDepositContract

Deposit Contract Interface

This interface exposes methods to perform validator deposits

Methods

deposit

function deposit(bytes pubkey, bytes withdrawalCredentials, bytes signature, bytes32 depositDataRoot) external payable

Official deposit method to activate a validator on the consensus layer

Parameters

Name
Type
Description

pubkey

bytes

The 48 bytes long BLS Public key representing the validator

withdrawalCredentials

bytes

The 32 bytes long withdrawal credentials, configures the withdrawal recipient

signature

bytes

The 96 bytes long BLS Signature performed by the pubkey's private key

depositDataRoot

bytes32

The root hash of the whole deposit data structure

get_deposit_root

function get_deposit_root() external view returns (bytes32)

Query the current deposit root hash.

Returns

Name
Type
Description

_0

bytes32

The deposit root hash.

LibUnstructuredStorage

Lib Unstructured Storage

Utilities to work with unstructured storage

LibSanitize

Lib Sanitize

Utilities to sanitize input values

IELFeeRecipientV1

Alluvial Finance Inc.

Execution Layer Fee Recipient Interface (v1)

This interface exposes methods to receive all the execution layer fees from the proposed blocks + bribes

Methods

initELFeeRecipientV1

function initELFeeRecipientV1(address _riverAddress) external nonpayable

Initialize the fee recipient with the required arguments

Parameters

Name
Type
Description

_riverAddress

address

Address of River

pullELFees

function pullELFees(uint256 _maxAmount) external nonpayable

Pulls ETH to the River contract

Only callable by the River contract

Parameters

Name
Type
Description

_maxAmount

uint256

The maximum amount to pull into the system

Events

SetRiver

event SetRiver(address indexed river)

The storage river address has changed

Parameters

Name
Type
Description

river indexed

address

The new river address

Errors

InvalidCall

error InvalidCall()

The fallback has been triggered

LibBytes

Lib Bytes

This library helps manipulating bytes

Errors

SliceOutOfBounds

error SliceOutOfBounds()

The slice is outside of the initial bytes bounds

SliceOverflow

error SliceOverflow()

The length overflows an uint

LibAdministrable

Alluvial Finance Inc.

Lib Administrable

This library handles the admin and pending admin storage vars

IProtocolVersion

Methods

version

function version() external pure returns (string)

Retrieves the version of the contract

Returns

Name
Type
Description

_0

string

Version of the contract

OperatorsV2

Operators Storage

Utility to manage the Operators in storage

Errors

OperatorNotFound

error OperatorNotFound(uint256 index)

The operator was not found

Parameters

Name
Type
Description

index

uint256

The provided index

ValidatorKeys

Validator Keys Storage

Utility to manage the validator keys in storage

Errors

InvalidPublicKey

error InvalidPublicKey()

The provided public key is not matching the expected length

InvalidSignature

error InvalidSignature()

The provided signature is not matching the expected length

CurrentValidatorExitsDemand

CurrentValidatorExitsDemand Storage

This value controls the current demand for exits that still need to be triggered in order to notify the operatorsUtility to manage the CurrentValidatorExitsDemand in storage

TotalValidatorExitsRequested

TotalValidatorExitsRequested Storage

This value is the amount of performed exit requests, only increased when there is current exit demandUtility to manage the TotalValidatorExitsRequested in storage

LibUint256

Lib Uint256

Utilities to perform uint operations

LibAllowlistMasks

Lib Allowlist Masks

Holds all the mask values

AllowerAddress

Allower Address Storage

Utility to manage the Allower Address in storage

DenierAddress

Denier Address Storage

Utility to manage the Denier Address in storage

LastEpochId

Last Epoch Id Storage

Utility to manage the Last Epoch Id in storage

Quorum

Quorum Storage

Utility to manage the Quorum in storage

Allowlist

Allowlist Storage

Utility to manage the Allowlist mapping in storage

ReportsPositions

Reports Positions Storage

Utility to manage the Reports Positions in storage

Each bit in the stored uint256 value tells if the member at a given index has reported

RedeemDemand

Redeem Demand storage

Redeem Manager utility to store the current demand in LsETH

ReportsVariants

Reports Variants Storage

Utility to manage the Reports Variants in storage

RedeemQueueV2

Redeem Manager Redeem Queue storage

Utility to manage the Redeem Queue in the Redeem Manager

WithdrawalStack

Redeem Manager Withdrawal Stack storage

Utility to manage the Withdrawal Stack in the Redeem Manager

CLSpec

Consensus Layer Spec Storage

Utility to manage the Consensus Layer Spec in storage

Coverage image
Liquid Collective protocol architecture
Liquid Collective LsETH redemption flow
Liquid Collective LsETH redemption buffers and stacks
Liquid Collective LsETH redemption flow
Liquid Collective's three stage redemption process
Liquid Collective's redemption architecture

Permissioning

Provide users with protections over protocol access for compliance, while ensuring composability with the rest of the DeFi ecosystem

Liquid Collective is designed to provide users with protections over protocol access via know-your-customer (KYC) and anti-money-laundering (AML) verification, while still ensuring composability with the rest of the DeFi ecosystem.

This facilitates compliance by providing the level of counterparty risk management required for enterprises and institutions to participate in staking on the protocol.

The Liquid Collective protocol:

  • Requires users to be on the Allowlist before they can deposit ETH or redeem LsETH

  • Enables users to transfer LsETH freely

Liquid Collective works with a variety of Platforms, including trading venues and custodians, to provide a seamless on-ramp for the protocol’s stakers. KYC’d users who utilize a Platform’s services to allowlist their wallet can deposit to Liquid Collective and mint LsTokens.

Allowlisting

Participation in Liquid Collective's smart contracts is restricted to allowlisted wallet addresses. This is meant for compliance purposes, ensuring that any user who wants to stake first completes a review and approval process (typically a know-your-business (KYB)/ know-your-customer (KYC) process).

The Liquid Collective Allowlist smart contract holds:

  • An Allowlist of depositors with their permissions over the protocol (deposit, withdraw)

Access protections

To meet the compliance needs of Liquid Collective participants, the Liquid Collective protocol has an "access denial" mechanism for blocking individual Ethereum addresses from sending, receiving, minting, redeeming or claiming LsETH. The protocol does not have any mechanism for forcing a transfer of LsETH, reversing a transfer of LsETH or otherwise altering the balance of LsETH at an address.

The Liquid Collective's policy is that access will only be denied where there is a determination that not denying access to an address presents a threat to the security, integrity or reliability of the protocol. Examples of such circumstances include security breaches or legal requirements.

Operate Validator Nodes

This guide is intended for Node Operators participating in the Liquid Collective protocol.

Operate Validator Nodes

Node Operators receive ETH delegation from the protocol and they are remunerated proportionally to the delegation they receive.

Operate Validator Nodes

Node Operator Procedure

Node Operators interested in receiving ETH delegation should go through the following flow.

  1. One-time protocol onboarding

    1. Node operator generates Node Operator wallet

    2. Node Operator address gets approved on the Node Operator registry contracts

  2. On-going operations

    1. Pre-registration of validator keys

      • Node Operator generates validator keys in its infrastructure with expected configuration (withdrawal credentials, execution layer fee recipient, etc.)

      • Node Operator submits validator keys to the Node Operators registry contract by sending a transaction using the Node Operator wallet

      • From this point in time, validator keys should be ready to get funded

    2. Protocol administrator reviews and confirms added keys are valid

      • Validates validator keys, ensuring withdrawal credentials, deposit data, and signatures are correct

      • Administrator increases operator limit making validator keys eligible for funding. From this point in time, validators keys can be funded at any time

    3. Validator keys are funded and activated

      • Protocol regularly picks eligible validator keys and deposits them to the official Ethereum deposit contract

      • Once deposited, validator keys enter the activation queue as per the standard Ethereum staking procedure

    4. Run the Exit Daemon

      • Node Operators are responsible for exiting their own validators

      • Node Operators have the possibility of running the lceth exit daemon in order to be notified when they should exit their validators

CLI

Installation

The recommended installation is to use the public Docker image public.ecr.aws/alluvial/liquid-collective/lceth:latest

It is also possible to build the binary from sources.

Guidelines

Protocol Onboarding

Generate (or Import) Node Operator Wallet

The Node Operator needs a wallet to submit validator keys. The wallet must be approved on the Node Operator Registry Contract.

To generate such a wallet you can use the following command:

env KEYSTORE_PASSWORD={password to encrypt the key file} lceth eth1keys generate
docker run \
  --env "KEYSTORE_PASSWORD={password to encrypt the key file}" \
  -v "keystore:/data/keystore" \
  public.ecr.aws/alluvial/liquid-collective/lceth:latest eth1keys generate

Once generated or imported you should securely store the key file and password for later usage, as you will need it each time you need to register keys.

It is also possible to import an existing wallet:

env KEYSTORE_PASSWORD={password to encrypt the key file} lceth eth1keys import --priv-key {private key in hex format
docker run \
  --env "KEYSTORE_PASSWORD={password to encrypt the key file}" \
  -v "keystore:/data/keystore" \
  public.ecr.aws/alluvial/liquid-collective/lceth:latest eth1keys import --priv-key {private key in hex format}

Approve Node Operator Wallet

A Node Operator should provide administrators with:

  • name: As the Node Operator will be publicly listed on the Node Operator contract

  • address: The Node Operator wallet address previously generated

Those values can be updated at any time after first approval.

Node Operator Index

Once approved, a Node Operator will get its operator index on the Node Operators Registry. This index will never change over time.

To get your node operator index, run the below command and find your name in the returned list.

env ETH_EL_ADDR={ethereum execution layer rpc endpoint} \
 lceth operators list
docker run \
  --env "ETH_EL_ADDR={ethereum execution layer rpc endpoint}" \
  public.ecr.aws/alluvial/liquid-collective/lceth:latest operators list

Ongoing Operations: Pre-Registration of Validator Keys

Pre-registering validators consists of submitting new validators keys to the Node Operators registry contract so they can be picked for validation and funded.

As a Node Operator, you should typically pre-register new validators keys when:

  • It is the first time you pre-register keys

  • Most of the keys that you have pre-registered have been funded

It is the responsibility of the Node Operator to make sure validator keys are available for funding.

In the case that a Node Operator has no validator keys available, it will not receive an ETH delegation from the protocol.

Generate validator keys, deposit data and signatures

A Node Operator is responsible for generating validator keys in its own infrastructure.

Node Operators are required to set withdrawal credentials to the address of Withdrawal contract.

To get withdrawal credentials you can run:

env ETH_EL_ADDR={ethereum execution layer rpc endpoint} \
 lceth withdrawal credentials
docker run \
  --env "ETH_EL_ADDR={ethereum execution layer rpc endpoint}" \
  public.ecr.aws/alluvial/liquid-collective/lceth:latest withdrawal credentials

As a result of the validator key generation, a Node Operator should obtain a JSON file matching the following format:

validator_keys.json
[
  {
    "pubkey": "814dc0f55ac3fb02431668adf6f8fa1c37fb9baa5b87f5be519a373205933dfe742f3df566cba3a35b5be1940e1dffd5",
    "signature": "81b24791a89f3596abebb294e13502e398d96cbdd2a70d87b7fa89cc93019080a2905bb7447e0c408f2569a17b0ce628163e8caca4ea5b69af4db458dffcca100f8fcb96edeef30072ca4322721adc5591da8aadffac8b730d78f84c3b9f3f92"
  },
  {
    "pubkey": "88d1ac7f33780fd328bee60957b2325cfa41b3719614b662616d4525e5b478b3a81d490671526936e3ea412428c84451",
    "signature": "9985f2eb6f445f5e2bae226333f4796127c01efed7f4a4a35b62719dd5470879d1377e0035c00ccaa1cf892542bb427b072113a8e690e963d3e5b590ffd0051c0680e345cd1ee9318f2559796585445c490b8e9db417e99ac55e99c7e281aced"
  }
]

Configure validator exec layer fee recipient address

Node Operators are required to set the fee recipient of the validators to the ELFeeRecipient contract that is responsible to flow the execution layer network rewards to the core River contract.

To get the ELFeeRecipient address you can run:

env ETH_EL_ADDR={ethereum execution layer rpc endpoint} \
 lceth el-fee-recipient address
docker run \
  --env "ETH_EL_ADDR={ethereum execution layer rpc endpoint}" \
  public.ecr.aws/alluvial/liquid-collective/lceth:latest el-fee-recipient address

Exec layer fee recipient address and withdrawal address are not the same.

Submit validator keys

Submit validator keys consists of sending a addValidatorKeys(...) transaction to the OperatorsRegistry contract. The transactions should be signed by the Node Operator address:

index.sol
/// @notice Adds new keys for an operator
/// @dev Only callable by the administrator or the operator address
/// @param _name The name identifying the operator
/// @param _keyCount The amount of keys provided
/// @param _publicKeys Public keys of the validator, concatenated
/// @param _signatures Signatures of the validator keys, concatenated
function addValidatorKeys(
    string calldata _name,
    uint256 _keyCount,
    bytes calldata _publicKeys,
    bytes calldata _signatures
)

To submit validator keys you can run the following command:

env ETH_EL_ADDR={ethereum execution layer rpc endpoint} \
KEYSTORE_PASSWORD={password to encrypt the key file} \
lceth validators add \
--operator-idx {operator index} \
--deposit-data validator_keys.json \
--from {operator address} \
--send
docker run \
  --env "ETH_EL_ADDR={ethereum execution layer rpc endpoint}" \
  --env "KEYSTORE_PASSWORD={password to encrypt the key file}" \
  -v "keystore:/data/keystore" \
  -v "validator_keys.json:validator_keys.json" \
  public.ecr.aws/alluvial/liquid-collective/lceth:latest validators add \
    --operator-idx {operator index} \
    --deposit-data validator_keys.json \
    --from {operator address} \
    --send

Once the transaction has been sent to the network and validated, the validator keys are listed on the Node Operators Registry contract and will be reviewed by the administrator.

Deposit and Node Activation

Node Operators should be careful that validator keys can be picked, funded, and deposited to the official Ethereum Deposit Contract at any time.

Once a validator key has been funded and deposited, it enters the activation queue. When this happens, the Node Operator should make sure that the corresponding validator key gets properly deployed to its validator infrastructure so the validator is ready when validator activation occurs.

We strongly recommend Node Operators effectively monitor the Deposit Contract, in particular watching DepositEvent to never miss an activation.

Watching the exit requests

  • Node Operators are responsible for exiting their own validators

  • Node Operators can use the provided Exit Daemon

Useful events:

  • FundedValidatorKeys

  • RequestedValidatorExits

Exit Daemon

Description

The Validator Exit Daemon is an off-chain application designed to help Liquid Collective Node Operators exit validator keys with ease.

Node Operators are responsible for exiting validator keys from the Consensus Layer, allowing withdrawn funds to be used for satisfying conversions of LsETH for ETH.

Flow

  • LsETH holders convert LsETH for ETH through the protocol, creating a request for ETH.

  • The protocol regularly rebalance's ETH positions. When it needs ETH funds to fulfill redeem demands, it withdraws funds from the Consensus Layer and signals Node Operators by emitting an event requesting validator keys to be exited. The protocol is responsible for selecting the Node Operators that need to exit keys, depending on the current validator key allocation.

  • Upon receiving a validator exit request event, the Node Operator exits the requested number of validator keys, which results in broadcasting ValidatorExit messages to the Consensus Layer. This step is facilitated by the Validator Exit Daemon application.

  • After validator keys pass through the exit queue, funds are withdrawn to the LC Withdraw contract, and the Liquid Collective protocol takes over the ETH to satisfy the LsETH conversion requests.

Technical considerations & assumptions:

  • Validator exit is triggered by broadcasting a ValidatorExit message signed with the validator's private key on the Consensus Layer.

  • We cannot rely on the Dual-Key exit design to also allow triggering the validator key exit from the withdrawal_credentials. Even if this option is preferred, it is not expected to be available on day 1 of the withdrawals.

  • Validator keys may be slashed, resulting in the keys undergoing the Consensus Layer slashing process and eventually leading to the withdrawal of funds after incurring penalties (this takes at least 36 days).

  • Existing Liquid Collective validator keys have all been set with a 0x1 prefix and point to the Withdraw contract.

  • Liquid Collective Node Operators use diverse infrastructure base layers (clouds, bare metal, containers/orchestration), client software (Prysm, Lighthouse, etc.), and may use or not use signers (e.g., Web3Signer). This diversity is expected to grow with staking innovations (e.g., DVT).

  • Liquid Collective Node Operators have (or are building) infrastructure & processes

Architecture

The Validator Exit Daemon is a long-lived application containerized in a Docker image designed to be run by Node Operators in their infrastructure.

It accesses data from both the Execution Layer and Consensus Layer connected to nodes in the Node Operator infrastructure.

It assumes that Node Operators have an existing system and process in place for proceeding with validator key exits.

The Daemon can interact with the existing exit system through one or both of the following methods:

  • HTTP hook: Called by the Daemon each time a validator request exit event is emitted, and a validator key should be exited. Node Operators can configure the callback to match any endpoint.

  • API polling: The Daemon exposes an API that Node Operators can poll to retrieve the key to exit.

The Validator Exit Daemon will provide the following information to the Node Operator:

  • Number of validator keys to exit

  • Recommended keys to exit

Diagram

Sequence diagram

Dependencies

  • A synced Execution Layer client with a JSON-RPC endpoint enabled. All implementations are supported (Geth, Erigon, Besu, etc.)

  • A synced Consensus Layer client with an API endpoint enabled. All implementations are supported (Prysm, Teku, Lighthouse, etc.)

Installation

The recommended installation is to use the public Docker image public.ecr.aws/alluvial/liquid-collective/lceth:latest

Usage

API

By default, the Exit daemon exposes an API route that Node Operators can use, either in conjunction with or without the HTTP hook.

This allows an operator to retrieve the recommended keys to exit at the current time.

env ETH_EL_ADDR={ethereum execution layer rpc endpoint} \
env ETH_CL_ADDR={ethereum consensus layer rpc endpoint} \
lceth exit run \
--operator-idx {operator index}
docker run \
  --env "ETH_EL_ADDR={ethereum execution layer rpc endpoint}" \
  --env "ETH_CL_ADDR={ethereum consensus layer rpc endpoint}" \
  public.ecr.aws/alluvial/liquid-collective/lceth:latest exit run \
    --operator-idx {operator index}

Operator index could be retrieved with lceth operators list

The API meets the following requirements:

paths:
  '/':
    get:
      description: 'Get validator keys to exit'
      responses:
        200:
          description: 'Success.'
          schema:
            type: object
            properties:
              chain_id:
                type: 'string'
                example: '1'
              total_requested_exits:
                type: 'integer'
                description: 'Number of validators requested to exit'
                example: 2
              validators_to_exit:
                type: 'array'
                description: 'List of recommended validators to exit'
                items:
                  type: 'object'
                  properties:
                    pubkey:
                      type: 'string'
                      example: '0x8a9e1213459337631232447e360faf162781aee0a3df533306a02e2eae481b4db4d1313d1756da7a121da437d9964fb0'
                    index:
                      type: 'integer'
                      example: 473944
        500:
          description: 'Internal unexpected error'

Webhook

The Exit daemon can run an HTTP hook system that sends validator exit request callbacks to the operator's existing systems when it receives a Validator Exit request event from the Consensus Layer.

The Exit daemon is stateless. If the webhook is enabled, it will send a call at each start if there is a pending exit request.

Operators can customize the webhook call by providing a template for the body, endpoint, and headers, and use the following macros to pass data related to the exit event:

| Name                       | Type     | Description                               |
| -------------------------- | -------- | ----------------------------------------- |
| chain_id                   | string   | Network identifier                        |
| total_requested_exits      | int      | Number of validators requested to exit    |
| validators_to_exit_indexes | int[]    | List of validators pubkey to exit         |
| validators_to_exit_pubkeys | string[] | List of validators index to exit          |
| validators_to_exit         | object[] | List of validators pubkey + index to exit |
  • total_requested_exits represents the total requested exits since the beginning of the contract. It’s a incremental-only counter emitted by the RequestedValidatorExits event.

  • validators_to_exit (as well as validators_to_exit_pubkeys & validators_to_exit_indexes) is an array of the validators to exit at a given time. To get them, the exit daemon fetches all the keys of an operator (via the FundedValidatorKeys event), check their status on the consensus layer to know those already exited, and then make a diff with total_requested_exits to know how many keys are remaining to exit.

For instance:

  • using environment variables via {{env "ENV_VAR_NAME"}}

  • printing array via {{validators_to_exit_pubkeys | toJson}}

  • creating a quoted string from an array via {{.validators_to_exit_indexes | join "," | quote}}

  • computing array length via {{.validators_to_exit_indexes | len}}

  • etc.

Example of webhook template:

env ETH_EL_ADDR={ethereum execution layer rpc endpoint} \
env ETH_CL_ADDR={ethereum consensus layer rpc endpoint} \
lceth exit run \
--operator-idx {operator index} \
--webhook \
--webhook-method="POST" \
--webhook-endpoint="http://127.0.0.1:9080/call?chain_id={{.chain_id}}&count={{.total_requested_exits}}&validators={{.validators_to_exit_indexes|join ","}}" \
--webhook-template-body '
  {
    "chain_id": "{{.chain_id}}",
    "total_requested_exits": {{.total_requested_exits}},
    "current_requested_exits": {{.validators_to_exit_pubkeys | len}},
    "indexes": {{.validators_to_exit_indexes | join "," | quote}},
    "pubkeys": {{.validators_to_exit_pubkeys | toJson}},
    "custom": {{env CUSTOM_ENV_VAR}}'
  }
' \
--webhook-template-header="Chain-Id={{.chain_id}}" \
--webhook-template-header="Content-Type=application/json"
docker run \
  --env "ETH_EL_ADDR={ethereum execution layer rpc endpoint}" \
  --env "ETH_CL_ADDR={ethereum consensus layer rpc endpoint}" \
  public.ecr.aws/alluvial/liquid-collective/lceth:latest exit run \
    --operator-idx {operator index} \
    --webhook \
    --webhook-method="POST" \
    --webhook-endpoint="http://127.0.0.1:9080/call?chain_id={{.chain_id}}&count={{.total_requested_exits}}&validators={{.validators_to_exit_indexes|join ","}}" \
    --webhook-template-body '
      {
        "chain_id": "{{.chain_id}}",
        "total_requested_exits": {{.total_requested_exits}},
        "indexes": {{.validators_to_exit_indexes | join "," | quote}},
        "pubkeys": {{.validators_to_exit_pubkeys | toJson}},
        "custom": {{env CUSTOM_ENV_VAR}}'
      }
    ' \
    --webhook-template-header="Chain-Id={{.chain_id}}" \
    --webhook-template-header="Content-Type=application/json"

Usage output:

Run exit daemon

Usage:
  lceth exit run [flags]

Flags:
      --eth-cl-addr string                       Address of the Ethereum consensus layer node to connect to [env: ETH_CL_ADDR]
      --operator-idx int                         Index of the operator running the daemon [env: OPERATOR_INDEX]
      --webhook                                  enable 'webhook' [env: WEBHOOK]
      --webhook-endpoint string                  Go template describing the endpoint that the webhook will call [env: WEBHOOK_ENDPOINT]
      --webhook-method string                    HTTP method to query the webhook's endpoint [env: WEBHOOK_METHOD]
      --webhook-template-header stringToString   Go template describing the body to be sent to the webhook's endpoint [env: WEBHOOK_TEMPLATE_HEADER] (default [])
      --webhook-template-body string             Go templates describing the headers to be sent to the webhook [env: WEBHOOK_TEMPLATE_BODY]
      --webhook-retry int                        Retry limit in case of webhook-endpoint returns error with status code 5xx [env: WEBHOOK_RETRY]
      --webhook-timeout duration                 Delay to wait before abort request sent to webhook-endpoint [env: WEBHOOK_TIMEOUT]
      --rpc-call-retry int                       How many time should we retry failed rpc calls [env: RPC_CALL_RETRY] (default 3)
      --block-log-fetch-step int                 How many blocks are fetched at once when fetching logs [env: BLOCK_LOG_FETCH_STEP] (default 100000)
      --max-workers int                          How many goroutines to use on threaded tasks [env: MAX_WORKERS] (default 10)
      --batch-fetch-validators                   Whether to batch when querying the consensus layer to get validators' data (recommended if timeout issues arise) [env: BATCH_FETCH_VALIDATORS]
      --max-get-validators int                   Max size of the batch when querying the consensus layer to get validators' data, only useful if using --batch-fetch-validators [env: MAX_GET_VALIDATORS] (default 1000)
      --loop-sleep-time duration                 How often should the exit-daemon run [env: LOOP_SLEEP_TIME] (default 5m0s)
  -h, --help                                     help for run

Global Flags:
      --allowlist-addr string            Address of the Allowlist contract [env: ALLOWLIST_ADDR]
      --deployment-block uint            Deployment block of the contracts [env: DEPLOYMENT_BLOCK]
      --el-fee-recipient-addr string     Address of the Execution Layer fee recipient contract [env: EL_FEE_RECIPIENT_ADDR]
      --eth-el-addr string               JSON-RPC address of the Ethereum execution layer node to connect to [env: ETH_EL_ADDR]
      --keystore-password string         Password used to encrypt key files [env: KEYSTORE_PASSWORD]
      --keystore-path string             Directory where to store keys [env: KEYSTORE_PATH]
      --log-format string                Log output format (text or json) [env: LOG_FORMAT] (default "text")
      --log-level string                 Log output level [env: LOG_LEVEL] (default "info")
      --operators-registry-addr string   Address of the Operators Registry contract [env: OPERATORS_REGISTRY_ADDR]
      --oracle-addr string               Address of the Oracle contract [env: ORACLE_ADDR]
      --redeem-manager-addr string       Address of the RedeemManager contract [env: REDEEM_MANAGER_ADDR]
      --river-addr string                Address of the River contract [env: RIVER_ADDR]
      --tlc-addr string                  Address of the TLC contract [env: TLC_ADDR]
      --withdraw-addr string             Address of the Withdraw contract [env: WITHDRAW_ADDR]
      --wls-eth-addr string              Address of the WlsEth contract [env: WLSETH_ADDR]

An Allowlister, which is a trusted party responsible for allowing users to participate in the Liquid Collective protocol. Typically (ex. a custodial Platform performing KYC/AML checks on their customers) submit a user's wallet address to the Allowlister for subsequent addition to the Allowlist

When a depositor wants to stake with the Liquid Collective protocol, their address must first be added to the Allowlist and be granted the corresponding permissions. Learn more about the type of Platforms that add users to the Allowlist in the .

Requests by third parties for denial of access to an address must be submitted in writing to . This policy and compliance with a request do not constitute acknowledgment or attornment by The Liquid Foundation or any other participant in the Liquid Collective to laws to which that participant is not already subject.

Node Operators are validator infrastructure providers responsible for running validator nodes on the Ethereum consensus layer in the name of the protocol. Node Operators must have the capacity to scale to a large number of validator nodes, meet certain compliance requirements, and meet certain performance requirements, including Liquid Collective's .

provides various commands to facilitate Node Operators in the process of managing validator keys.

CLI is compatible with the and can be used in conjunction with it.

For each generated key, a Node Operator is also expected to generate the corresponding DepositMessage and BLS12-381 signature as per the

Per , once a Type 1 (0x01) withdrawal address is set those withdrawal credentials cannot be changed.

It is possible to use the to generate keys, which produces a file in the above format.

Validator Exit Daemon
Validator Exit Daemon Sequence Diagram

The webhook templating imports the . Which means additional functions are available to format the output.

Platforms that enable minting and redemption
Platform Operations documentation
legal@liquidcollective.io
Node Operator Performance SLAs
CLI
Ethereum deposit CLI
Ethereum 2.0 specs
the Ethereum protocol
Ethereum deposit CLI
Golang Sprig library

IFirewall

Figment

Firewall

This interface exposes methods to accept calls to admin-level functions of an underlying contract.

Methods

allowExecutor

function allowExecutor(bytes4 _functionSelector, bool _executorCanCall) external nonpayable

Sets the permission for a function selector

Parameters

Name
Type
Description

_functionSelector

bytes4

Method signature on which the permission is changed

_executorCanCall

bool

True if selector is callable by the executor

destination

function destination() external view returns (address)

Retrieve the destination address

Returns

Name
Type
Description

_0

address

The destination address

executor

function executor() external view returns (address)

Retrieve the executor address

Returns

Name
Type
Description

_0

address

The executor address

executorCanCall

function executorCanCall(bytes4 _selector) external view returns (bool)

Returns true if the executor is allowed to perform a call on the given selector

Parameters

Name
Type
Description

_selector

bytes4

The selector to verify

Returns

Name
Type
Description

_0

bool

True if executor is allowed to call

setExecutor

function setExecutor(address _newExecutor) external nonpayable

Sets the executor address

Parameters

Name
Type
Description

_newExecutor

address

New address for the executor

Events

SetDestination

event SetDestination(address indexed destination)

The stored destination address has been changed

Parameters

Name
Type
Description

destination indexed

address

The new destination address

SetExecutor

event SetExecutor(address indexed executor)

The stored executor address has been changed

Parameters

Name
Type
Description

executor indexed

address

The new executor address

SetExecutorPermissions

event SetExecutorPermissions(bytes4 selector, bool status)

The storage permission for a selector has been changed

Parameters

Name
Type
Description

selector

bytes4

The 4 bytes method selector

status

bool

True if executor is allowed

OperatorsRegistryV1

Alluvial Finance Inc.

Operators Registry (v1)

This contract handles the list of operators and their keys

Methods

acceptAdmin

function acceptAdmin() external nonpayable

Accept the transfer of ownership

Only callable by the pending admin. Resets the pending admin if successful.

addOperator

function addOperator(string _name, address _operator) external nonpayable returns (uint256)

Adds an operator to the registry

Only callable by the administrator

Parameters

Name
Type
Description

_name

string

The name identifying the operator

_operator

address

The address representing the operator, receiving the rewards

Returns

Name
Type
Description

_0

uint256

The index of the new operator

addValidators

function addValidators(uint256 _index, uint32 _keyCount, bytes _publicKeysAndSignatures) external nonpayable

Adds new keys for an operator

Only callable by the administrator or the operator address

Parameters

Name
Type
Description

_index

uint256

The operator index

_keyCount

uint32

The amount of keys provided

_publicKeysAndSignatures

bytes

Public keys of the validator, concatenated

demandValidatorExits

function demandValidatorExits(uint256 _count, uint256 _depositedValidatorCount) external nonpayable

Increases the exit request demand

This method is only callable by the river contract, and to actually forward the information to the node operators via event emission, the unprotected requestValidatorExits method must be called

Parameters

Name
Type
Description

_count

uint256

The amount of exit requests to add to the demand

_depositedValidatorCount

uint256

The total deposited validator count

forceFundedValidatorKeysEventEmission

function forceFundedValidatorKeysEventEmission(uint256 _amountToEmit) external nonpayable

Utility to force the broadcasting of events. Will keep its progress in storage to prevent being DoSed by the number of keys

Parameters

Name
Type
Description

_amountToEmit

uint256

The amount of events to emit at maximum in this call

getAdmin

function getAdmin() external view returns (address)

Retrieves the current admin address

Returns

Name
Type
Description

_0

address

The admin address

getCurrentValidatorExitsDemand

function getCurrentValidatorExitsDemand() external view returns (uint256)

Get the current exit request demand waiting to be triggeredThis value is the amount of exit requests that are demanded and not yet performed by the contract

Returns

Name
Type
Description

_0

uint256

The current exit request demand

getNextValidatorsToDepositFromActiveOperators

function getNextValidatorsToDepositFromActiveOperators(uint256 _count) external view returns (bytes[] publicKeys, bytes[] signatures)

Get the next validators that would be funded

Parameters

Name
Type
Description

_count

uint256

Count of validators that would be funded next

Returns

Name
Type
Description

publicKeys

bytes[]

An array of fundable public keys

signatures

bytes[]

An array of signatures linked to the public keys

getOperator

function getOperator(uint256 _index) external view returns (struct OperatorsV2.Operator)

Get operator details

Parameters

Name
Type
Description

_index

uint256

The index of the operator

Returns

Name
Type
Description

_0

OperatorsV2.Operator

The details of the operator

getOperatorCount

function getOperatorCount() external view returns (uint256)

Get operator count

Returns

Name
Type
Description

_0

uint256

The operator count

getOperatorStoppedValidatorCount

function getOperatorStoppedValidatorCount(uint256 _idx) external view returns (uint32)

Retrieve the stopped validator count for an operator index

Parameters

Name
Type
Description

_idx

uint256

The index of the operator

Returns

Name
Type
Description

_0

uint32

The stopped validator count of the operator

getPendingAdmin

function getPendingAdmin() external view returns (address)

Retrieve the current pending admin address

Returns

Name
Type
Description

_0

address

The pending admin address

getRiver

function getRiver() external view returns (address)

Retrieve the River address

Returns

Name
Type
Description

_0

address

The address of River

getStoppedAndRequestedExitCounts

function getStoppedAndRequestedExitCounts() external view returns (uint32, uint256)

Retrieve the total stopped and requested exit count

Returns

Name
Type
Description

_0

uint32

The total stopped count

_1

uint256

The total requested exit count

getStoppedValidatorCountPerOperator

function getStoppedValidatorCountPerOperator() external view returns (uint32[])

Retrieve the raw stopped validators array from storage

Returns

Name
Type
Description

_0

uint32[]

The stopped validator array

getTotalStoppedValidatorCount

function getTotalStoppedValidatorCount() external view returns (uint32)

Retrieve the total stopped validator count

Returns

Name
Type
Description

_0

uint32

The total stopped validator count

getTotalValidatorExitsRequested

function getTotalValidatorExitsRequested() external view returns (uint256)

Retrieve the total requested exit countThis value is the amount of exit requests that have been performed, emitting an event for operators to catch

Returns

Name
Type
Description

_0

uint256

The total requested exit count

getValidator

function getValidator(uint256 _operatorIndex, uint256 _validatorIndex) external view returns (bytes publicKey, bytes signature, bool funded)

Get the details of a validator

Parameters

Name
Type
Description

_operatorIndex

uint256

The index of the operator

_validatorIndex

uint256

The index of the validator

Returns

Name
Type
Description

publicKey

bytes

The public key of the validator

signature

bytes

The signature used during deposit

funded

bool

True if validator has been funded

initOperatorsRegistryV1

function initOperatorsRegistryV1(address _admin, address _river) external nonpayable

Initializes the operators registry

Parameters

Name
Type
Description

_admin

address

Admin in charge of managing operators

_river

address

Address of River system

initOperatorsRegistryV1_1

function initOperatorsRegistryV1_1() external nonpayable

Initializes the operators registry for V1_1

listActiveOperators

function listActiveOperators() external view returns (struct OperatorsV2.Operator[])

Retrieve the active operator set

Returns

Name
Type
Description

_0

OperatorsV2.Operator[]

The list of active operators and their details

pickNextValidatorsToDeposit

function pickNextValidatorsToDeposit(uint256 _count) external nonpayable returns (bytes[] publicKeys, bytes[] signatures)

Retrieve validator keys based on operator statuses

Parameters

Name
Type
Description

_count

uint256

Max amount of keys requested

Returns

Name
Type
Description

publicKeys

bytes[]

An array of public keys

signatures

bytes[]

An array of signatures linked to the public keys

proposeAdmin

function proposeAdmin(address _newAdmin) external nonpayable

Proposes a new address as admin

This security prevents setting an invalid address as an admin. The pending admin has to claim its ownership of the contract, and prove that the new address is able to perform regular transactions.

Parameters

Name
Type
Description

_newAdmin

address

New admin address

removeValidators

function removeValidators(uint256 _index, uint256[] _indexes) external nonpayable

Remove validator keys

Only callable by the administrator or the operator address. The indexes must be provided sorted in decreasing order and duplicate-free, otherwise the method will revert. The operator limit will be set to the lowest deleted key index if the operator's limit wasn't equal to its total key countThe operator or the admin cannot remove funded keysWhen removing validators, the indexes of specific unfunded keys can be changed in order to properly remove the keys from the storage array. Beware of this specific behavior when chaining calls as the targeted public key indexes can point to a different key after a first call was made and performed some swaps

Parameters

Name
Type
Description

_index

uint256

The operator index

_indexes

uint256[]

The indexes of the keys to remove

reportStoppedValidatorCounts

function reportStoppedValidatorCounts(uint32[] _stoppedValidatorCounts, uint256 _depositedValidatorCount) external nonpayable

Allows river to override the stopped validators arrayThis actions happens during the Oracle report processing

Parameters

Name
Type
Description

_stoppedValidatorCounts

uint32[]

The new stopped validators array

_depositedValidatorCount

uint256

The total deposited validator count

requestValidatorExits

function requestValidatorExits(uint256 _count) external nonpayable

Public endpoint to consume the exit request demand and perform the actual exit requestsThe selection algorithm will pick validators based on their active validator countsThis value is computed by using the count of funded keys and taking into account the stopped validator counts and exit requests

Parameters

Name
Type
Description

_count

uint256

Max amount of exits to request

setOperatorAddress

function setOperatorAddress(uint256 _index, address _newOperatorAddress) external nonpayable

Changes the operator address of an operator

Only callable by the administrator or the previous operator address

Parameters

Name
Type
Description

_index

uint256

The operator index

_newOperatorAddress

address

The new address of the operator

setOperatorLimits

function setOperatorLimits(uint256[] _operatorIndexes, uint32[] _newLimits, uint256 _snapshotBlock) external nonpayable

Changes the operator staking limit

Only callable by the administratorThe operator indexes must be in increasing order and contain no duplicateThe limit cannot exceed the total key count of the operatorThe _indexes and _newLimits must have the same length.Each limit value is applied to the operator index at the same index in the _indexes array.

Parameters

Name
Type
Description

_operatorIndexes

uint256[]

The operator indexes, in increasing order and duplicate free

_newLimits

uint32[]

The new staking limit of the operators

_snapshotBlock

uint256

The block number at which the snapshot was computed

setOperatorName

function setOperatorName(uint256 _index, string _newName) external nonpayable

Changes the operator name

Only callable by the administrator or the operator

Parameters

Name
Type
Description

_index

uint256

The operator index

_newName

string

The new operator name

setOperatorStatus

function setOperatorStatus(uint256 _index, bool _newStatus) external nonpayable

Changes the operator status

Only callable by the administrator

Parameters

Name
Type
Description

_index

uint256

The operator index

_newStatus

bool

The new status of the operator

version

function version() external pure returns (string)

Retrieves the version of the contract

Returns

Name
Type
Description

_0

string

Version of the contract

Events

AddedOperator

event AddedOperator(uint256 indexed index, string name, address indexed operatorAddress)

A new operator has been added to the registry

Parameters

Name
Type
Description

index indexed

uint256

The operator index

name

string

The operator display name

operatorAddress indexed

address

The operator address

AddedValidatorKeys

event AddedValidatorKeys(uint256 indexed index, bytes publicKeysAndSignatures)

The operator or the admin added new validator keys and signatures

The public keys and signatures are concatenatedA public key is 48 bytes longA signature is 96 bytes long[P1, S1, P2, S2, ..., PN, SN] where N is the bytes length divided by (96 + 48)

Parameters

Name
Type
Description

index indexed

uint256

The operator index

publicKeysAndSignatures

bytes

The concatenated public keys and signatures

FundedValidatorKeys

event FundedValidatorKeys(uint256 indexed index, bytes[] publicKeys, bool deferred)

A validator key got funded on the deposit contract. This event was introduced during a contract upgrade, in order to cover all possible public keys, this event will be replayed for past funded keys in order to have a complete coverage of all the funded public keys. In this particular scenario, the deferred value will be set to true, to indicate that we are not going to have the expected additional events and side effects in the same transaction (deposit to official DepositContract etc ...) because the event was synthetically crafted.

Parameters

Name
Type
Description

index indexed

uint256

The operator index

publicKeys

bytes[]

BLS Public key that got funded

deferred

bool

True if event has been replayed in the context of a migration

Initialize

event Initialize(uint256 version, bytes cdata)

Emitted when the contract is properly initialized

Parameters

Name
Type
Description

version

uint256

New version of the contracts

cdata

bytes

Complete calldata that was used during the initialization

OperatorEditsAfterSnapshot

event OperatorEditsAfterSnapshot(uint256 indexed index, uint256 currentLimit, uint256 newLimit, uint256 indexed latestKeysEditBlockNumber, uint256 indexed snapshotBlock)

The operator edited its keys after the snapshot block

This means that we cannot assume that its key set is checked by the snapshotThis happens only if the limit was meant to be increased

Parameters

Name
Type
Description

index indexed

uint256

The operator index

currentLimit

uint256

The current operator limit

newLimit

uint256

The new operator limit that was attempted to be set

latestKeysEditBlockNumber indexed

uint256

The last block number at which the operator changed its keys

snapshotBlock indexed

uint256

The block number of the snapshot

OperatorLimitUnchanged

event OperatorLimitUnchanged(uint256 indexed index, uint256 limit)

The call didn't alter the limit of the operator

Parameters

Name
Type
Description

index indexed

uint256

The operator index

limit

uint256

The limit of the operator

RemovedValidatorKey

event RemovedValidatorKey(uint256 indexed index, bytes publicKey)

The operator or the admin removed a public key and its signature from the registry

Parameters

Name
Type
Description

index indexed

uint256

The operator index

publicKey

bytes

The BLS public key that has been removed

RequestedValidatorExits

event RequestedValidatorExits(uint256 indexed index, uint256 count)

The requested exit count has been updated

Parameters

Name
Type
Description

index indexed

uint256

The operator index

count

uint256

The count of requested exits

SetAdmin

event SetAdmin(address indexed admin)

The admin address changed

Parameters

Name
Type
Description

admin indexed

address

New admin address

SetCurrentValidatorExitsDemand

event SetCurrentValidatorExitsDemand(uint256 previousValidatorExitsDemand, uint256 nextValidatorExitsDemand)

The exit request demand has been updated

Parameters

Name
Type
Description

previousValidatorExitsDemand

uint256

The previous exit request demand

nextValidatorExitsDemand

uint256

The new exit request demand

SetOperatorAddress

event SetOperatorAddress(uint256 indexed index, address indexed newOperatorAddress)

The operator address has been changed

Parameters

Name
Type
Description

index indexed

uint256

The operator index

newOperatorAddress indexed

address

The new operator address

SetOperatorLimit

event SetOperatorLimit(uint256 indexed index, uint256 newLimit)

The operator limit has been changed

Parameters

Name
Type
Description

index indexed

uint256

The operator index

newLimit

uint256

The new operator staking limit

SetOperatorName

event SetOperatorName(uint256 indexed index, string newName)

The operator display name has been changed

Parameters

Name
Type
Description

index indexed

uint256

The operator index

newName

string

The new display name

SetOperatorStatus

event SetOperatorStatus(uint256 indexed index, bool active)

The operator status has been changed

Parameters

Name
Type
Description

index indexed

uint256

The operator index

active

bool

True if the operator is active

SetOperatorStoppedValidatorCount

event SetOperatorStoppedValidatorCount(uint256 indexed index, uint256 newStoppedValidatorCount)

The operator stopped validator count has been changed

Parameters

Name
Type
Description

index indexed

uint256

The operator index

newStoppedValidatorCount

uint256

The new stopped validator count

SetPendingAdmin

event SetPendingAdmin(address indexed pendingAdmin)

The pending admin address changed

Parameters

Name
Type
Description

pendingAdmin indexed

address

New pending admin address

SetRiver

event SetRiver(address indexed river)

The stored river address has been changed

Parameters

Name
Type
Description

river indexed

address

The new river address

SetTotalValidatorExitsRequested

event SetTotalValidatorExitsRequested(uint256 previousTotalValidatorExitsRequested, uint256 newTotalValidatorExitsRequested)

The total requested exit has been updated

Parameters

Name
Type
Description

previousTotalValidatorExitsRequested

uint256

The previous total requested exit

newTotalValidatorExitsRequested

uint256

The new total requested exit

UpdatedRequestedValidatorExitsUponStopped

event UpdatedRequestedValidatorExitsUponStopped(uint256 indexed index, uint32 oldRequestedExits, uint32 newRequestedExits)

The requested exit count has been update to fill the gap with the reported stopped count

Parameters

Name
Type
Description

index indexed

uint256

The operator index

oldRequestedExits

uint32

The old requested exit count

newRequestedExits

uint32

The new requested exit count

UpdatedStoppedValidators

event UpdatedStoppedValidators(uint32[] stoppedValidatorCounts)

The stopped validator array has been changedA validator is considered stopped if exiting, exited or slashedThis event is emitted when the oracle reports new stopped validators counts

Parameters

Name
Type
Description

stoppedValidatorCounts

uint32[]

The new stopped validator counts

Errors

FundedKeyEventMigrationComplete

error FundedKeyEventMigrationComplete()

Emitted when the event rebroadcasting is done and we attempt to broadcast new events

InactiveOperator

error InactiveOperator(uint256 index)

The calling operator is inactive

Parameters

Name
Type
Description

index

uint256

The operator index

InvalidArrayLengths

error InvalidArrayLengths()

The provided operator and limits array have different lengths

InvalidEmptyArray

error InvalidEmptyArray()

The provided operator and limits array are empty

InvalidEmptyStoppedValidatorCountsArray

error InvalidEmptyStoppedValidatorCountsArray()

Thrown when an invalid empty stopped validator array is provided

InvalidEmptyString

error InvalidEmptyString()

The string is empty

InvalidFundedKeyDeletionAttempt

error InvalidFundedKeyDeletionAttempt()

A funded key deletion has been attempted

InvalidIndexOutOfBounds

error InvalidIndexOutOfBounds()

The index that is removed is out of bounds

InvalidInitialization

error InvalidInitialization(uint256 version, uint256 expectedVersion)

An error occurred during the initialization

Parameters

Name
Type
Description

version

uint256

The version that was attempting to be initialized

expectedVersion

uint256

The version that was expected

InvalidKeyCount

error InvalidKeyCount()

The provided key count is 0

InvalidKeysLength

error InvalidKeysLength()

The provided concatenated keys do not have the expected length

InvalidStoppedValidatorCountsSum

error InvalidStoppedValidatorCountsSum()

Thrown when the sum of stopped validators is invalid

InvalidUnsortedIndexes

error InvalidUnsortedIndexes()

The index provided are not sorted properly (descending order)

InvalidZeroAddress

error InvalidZeroAddress()

The address is zero

NoExitRequestsToPerform

error NoExitRequestsToPerform()

Thrown when no exit requests can be performed

OperatorLimitTooHigh

error OperatorLimitTooHigh(uint256 index, uint256 limit, uint256 keyCount)

The value for the operator limit is too high

Parameters

Name
Type
Description

index

uint256

The operator index

limit

uint256

The new limit provided

keyCount

uint256

The operator key count

OperatorLimitTooLow

error OperatorLimitTooLow(uint256 index, uint256 limit, uint256 fundedKeyCount)

The value for the limit is too low

Parameters

Name
Type
Description

index

uint256

The operator index

limit

uint256

The new limit provided

fundedKeyCount

uint256

The operator funded key count

OperatorNotFound

error OperatorNotFound(uint256 index)

The operator was not found

Parameters

Name
Type
Description

index

uint256

The provided index

SliceOutOfBounds

error SliceOutOfBounds()

The slice is outside of the initial bytes bounds

SliceOverflow

error SliceOverflow()

The length overflows an uint

StoppedValidatorCountAboveFundedCount

error StoppedValidatorCountAboveFundedCount(uint256 operatorIndex, uint32 stoppedCount, uint32 fundedCount)

The provided stopped validator count of an operator is above its funded validator count

Parameters

Name
Type
Description

operatorIndex

uint256

undefined

stoppedCount

uint32

undefined

fundedCount

uint32

undefined

StoppedValidatorCountArrayShrinking

error StoppedValidatorCountArrayShrinking()

The provided stopped validator count array is shrinking

StoppedValidatorCountsDecreased

error StoppedValidatorCountsDecreased()

Throw when an element in the stopped validator array is decreasing

StoppedValidatorCountsTooHigh

error StoppedValidatorCountsTooHigh()

Thrown when the number of elements in the array is too high compared to operator count

Unauthorized

error Unauthorized(address caller)

The operator is unauthorized for the caller

Parameters

Name
Type
Description

caller

address

Address performing the call

UnorderedOperatorList

error UnorderedOperatorList()

The provided list of operators is not in increasing order

IUserDepositManagerV1

Alluvial Finance Inc.

User Deposit Manager (v1)

This interface exposes methods to handle the inbound transfers cases or the explicit submissions

Methods

deposit

Explicit deposit method to mint on msg.sender

depositAndTransfer

Explicit deposit method to mint on msg.sender and transfer to _recipient

Parameters

Events

UserDeposit

User deposited ETH in the system

Parameters

Errors

EmptyDeposit

And empty deposit attempt was made

IConsensusLayerDepositManagerV1

Alluvial Finance Inc.

Consensys Layer Deposit Manager Interface (v1)

This interface exposes methods to handle the interactions with the official deposit contract

Methods

depositToConsensusLayerWithDepositRoot

Deposits current balance to the Consensus Layer by batches of 32 ETH

Parameters

getBalanceToDeposit

Returns the amount of ETH not yet committed for deposit

Returns

getCommittedBalance

Returns the amount of ETH committed for deposit

Returns

getDepositedValidatorCount

Get the deposited validator count (the count of deposits made by the contract)

Returns

getKeeper

Get the keeper address

Returns

getWithdrawalCredentials

Retrieve the withdrawal credentials

Returns

Events

SetDepositContractAddress

The stored deposit contract address changed

Parameters

SetDepositedValidatorCount

Emitted when the deposited validator count is updated

Parameters

SetWithdrawalCredentials

The stored withdrawal credentials changed

Parameters

Errors

ErrorOnDeposit

An error occurred during the deposit

InconsistentPublicKeys

The length of the BLS Public key is invalid during deposit

InconsistentSignatures

The length of the BLS Signature is invalid during deposit

InvalidDepositRoot

Invalid deposit root

InvalidPublicKeyCount

The received count of public keys to deposit is invalid

InvalidSignatureCount

The received count of signatures to deposit is invalid

InvalidWithdrawalCredentials

The withdrawal credentials value is null

NoAvailableValidatorKeys

The internal key retrieval returned no keys

NotEnoughFunds

Not enough funds to deposit one validator

OnlyKeeper

IOracleManagerV1

Alluvial Finance Inc.

Oracle Manager (v1)

This interface exposes methods to handle the inputs provided by the oracle

Methods

getCLSpec

Retrieve the current cl spec

Returns

getCLValidatorCount

Get CL validator count (the amount of validator reported by the oracles)

Returns

getCLValidatorTotalBalance

Get CL validator total balance

Returns

getCurrentEpochId

Retrieve the current epoch id based on block timestamp

Returns

getCurrentFrame

Retrieve the current frame details

Returns

getExpectedEpochId

Retrieve expected epoch id

Returns

getFrameFirstEpochId

Retrieve the first epoch id of the frame of the provided epoch id

Parameters

Returns

getLastCompletedEpochId

Retrieve the last completed epoch id

Returns

getLastConsensusLayerReport

Retrieve the last consensus layer report

Returns

getOracle

Get oracle address

Returns

getReportBounds

Retrieve the report bounds

Returns

getTime

Retrieve the block timestamp

Returns

isValidEpoch

Verifies if the provided epoch is valid

Parameters

Returns

setCLSpec

Parameters

setConsensusLayerData

Parameters

setOracle

Set the oracle address

Parameters

setReportBounds

Parameters

Events

ConsensusLayerDataUpdate

The consensus layer data provided by the oracle has been updated

Parameters

ProcessedConsensusLayerReport

The provided report has been processed

Parameters

SetBounds

The Report Bounds are changed

Parameters

SetOracle

The stored oracle address changed

Parameters

SetSpec

The Consensus Layer Spec is changed

Parameters

Errors

InvalidDecreasingValidatorsExitedBalance

The total exited balance decreased

Parameters

InvalidDecreasingValidatorsSkimmedBalance

The total skimmed balance decreased

Parameters

InvalidEpoch

Thrown when an invalid epoch was reported

Parameters

InvalidValidatorCountReport

The reported validator count is invalid

Parameters

TotalValidatorBalanceDecreaseOutOfBound

The balance decrease is higher than the maximum allowed by the lower bound

Parameters

TotalValidatorBalanceIncreaseOutOfBound

The balance increase is higher than the maximum allowed by the upper bound

Parameters

Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
Name
Type
Description
function deposit() external payable
function depositAndTransfer(address _recipient) external payable

_recipient

address

Address receiving the minted LsETH

event UserDeposit(address indexed depositor, address indexed recipient, uint256 amount)

depositor indexed

address

Address performing the deposit

recipient indexed

address

Address receiving the minted shares

amount

uint256

Amount in ETH deposited

error EmptyDeposit()
function depositToConsensusLayerWithDepositRoot(uint256 _maxCount, bytes32 _depositRoot) external nonpayable

_maxCount

uint256

The maximum amount of validator keys to fund

_depositRoot

bytes32

The root of the deposit tree

function getBalanceToDeposit() external view returns (uint256)

_0

uint256

The amount of ETH not yet committed for deposit

function getCommittedBalance() external view returns (uint256)

_0

uint256

The amount of ETH committed for deposit

function getDepositedValidatorCount() external view returns (uint256)

_0

uint256

The deposited validator count

function getKeeper() external view returns (address)

_0

address

The keeper address

function getWithdrawalCredentials() external view returns (bytes32)

_0

bytes32

The withdrawal credentials

event SetDepositContractAddress(address indexed depositContract)

depositContract indexed

address

Address of the deposit contract

event SetDepositedValidatorCount(uint256 oldDepositedValidatorCount, uint256 newDepositedValidatorCount)

oldDepositedValidatorCount

uint256

The old deposited validator count value

newDepositedValidatorCount

uint256

The new deposited validator count value

event SetWithdrawalCredentials(bytes32 withdrawalCredentials)

withdrawalCredentials

bytes32

The withdrawal credentials to use for deposits

error ErrorOnDeposit()
error InconsistentPublicKeys()
error InconsistentSignatures()
error InvalidDepositRoot()
error InvalidPublicKeyCount()
error InvalidSignatureCount()
error InvalidWithdrawalCredentials()
error NoAvailableValidatorKeys()
error NotEnoughFunds()
error OnlyKeeper()
function getCLSpec() external view returns (struct CLSpec.CLSpecStruct)

_0

CLSpec.CLSpecStruct

The Consensus Layer Specification

function getCLValidatorCount() external view returns (uint256)

_0

uint256

The CL validator count

function getCLValidatorTotalBalance() external view returns (uint256)

_0

uint256

The CL Validator total balance

function getCurrentEpochId() external view returns (uint256)

_0

uint256

The current epoch id

function getCurrentFrame() external view returns (uint256 _startEpochId, uint256 _startTime, uint256 _endTime)

_startEpochId

uint256

The epoch at the beginning of the frame

_startTime

uint256

The timestamp of the beginning of the frame in seconds

_endTime

uint256

The timestamp of the end of the frame in seconds

function getExpectedEpochId() external view returns (uint256)

_0

uint256

The current expected epoch id

function getFrameFirstEpochId(uint256 _epochId) external view returns (uint256)

_epochId

uint256

Epoch id used to get the frame

_0

uint256

The first epoch id of the frame containing the given epoch id

function getLastCompletedEpochId() external view returns (uint256)

_0

uint256

The last completed epoch id

function getLastConsensusLayerReport() external view returns (struct IOracleManagerV1.StoredConsensusLayerReport)

_0

IOracleManagerV1.StoredConsensusLayerReport

The stored consensus layer report

function getOracle() external view returns (address)

_0

address

The oracle address

function getReportBounds() external view returns (struct ReportBounds.ReportBoundsStruct)

_0

ReportBounds.ReportBoundsStruct

The report bounds

function getTime() external view returns (uint256)

_0

uint256

The current timestamp from the EVM context

function isValidEpoch(uint256 epoch) external view returns (bool)

epoch

uint256

The epoch to lookup

_0

bool

True if valid

function setCLSpec(CLSpec.CLSpecStruct _newValue) external nonpayable

_newValue

CLSpec.CLSpecStruct

undefined

function setConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable

_report

IOracleManagerV1.ConsensusLayerReport

undefined

function setOracle(address _oracleAddress) external nonpayable

_oracleAddress

address

Address of the oracle

function setReportBounds(ReportBounds.ReportBoundsStruct _newValue) external nonpayable

_newValue

ReportBounds.ReportBoundsStruct

undefined

event ConsensusLayerDataUpdate(uint256 validatorCount, uint256 validatorTotalBalance, bytes32 roundId)

validatorCount

uint256

The new count of validators running on the consensus layer

validatorTotalBalance

uint256

The new total balance sum of all validators

roundId

bytes32

Round identifier

event ProcessedConsensusLayerReport(IOracleManagerV1.ConsensusLayerReport report, IOracleManagerV1.ConsensusLayerDataReportingTrace trace)

report

IOracleManagerV1.ConsensusLayerReport

The report that was provided

trace

IOracleManagerV1.ConsensusLayerDataReportingTrace

The trace structure providing more insights on internals

event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)

annualAprUpperBound

uint256

The reporting upper bound

relativeLowerBound

uint256

The reporting lower bound

event SetOracle(address indexed oracleAddress)

oracleAddress indexed

address

The new oracle address

event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime, uint64 epochsToAssumedFinality)

epochsPerFrame

uint64

The number of epochs inside a frame

slotsPerEpoch

uint64

The number of slots inside an epoch

secondsPerSlot

uint64

The number of seconds inside a slot

genesisTime

uint64

The genesis timestamp

epochsToAssumedFinality

uint64

The number of epochs before an epoch is considered final

error InvalidDecreasingValidatorsExitedBalance(uint256 currentValidatorsExitedBalance, uint256 newValidatorsExitedBalance)

currentValidatorsExitedBalance

uint256

The current exited balance

newValidatorsExitedBalance

uint256

The new exited balance

error InvalidDecreasingValidatorsSkimmedBalance(uint256 currentValidatorsSkimmedBalance, uint256 newValidatorsSkimmedBalance)

currentValidatorsSkimmedBalance

uint256

The current exited balance

newValidatorsSkimmedBalance

uint256

The new exited balance

error InvalidEpoch(uint256 epoch)

epoch

uint256

Invalid epoch

error InvalidValidatorCountReport(uint256 providedValidatorCount, uint256 depositedValidatorCount, uint256 lastReportedValidatorCount)

providedValidatorCount

uint256

The received validator count value

depositedValidatorCount

uint256

The number of deposits performed by the system

lastReportedValidatorCount

uint256

The last reported validator count

error TotalValidatorBalanceDecreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 relativeLowerBound)

prevTotalEthIncludingExited

uint256

The previous total balance, including all exited balance

postTotalEthIncludingExited

uint256

The post-report total balance, including all exited balance

timeElapsed

uint256

The time in seconds since last report

relativeLowerBound

uint256

The lower bound value that was used

error TotalValidatorBalanceIncreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 annualAprUpperBound)

prevTotalEthIncludingExited

uint256

The previous total balance, including all exited balance

postTotalEthIncludingExited

uint256

The post-report total balance, including all exited balance

timeElapsed

uint256

The time in seconds since last report

annualAprUpperBound

uint256

The upper bound value that was used

IRiverV1

Alluvial Finance Inc.

River Interface (v1)

The main system interface

Methods

allowance

function allowance(address _owner, address _spender) external view returns (uint256)

Retrieve the allowance value for a spender

Parameters

Name
Type
Description

_owner

address

Address that issued the allowance

_spender

address

Address that received the allowance

Returns

Name
Type
Description

_0

uint256

The allowance in shares for a given spender

approve

function approve(address _spender, uint256 _value) external nonpayable returns (bool)

Approves an account for future spendings

An approved account can use transferFrom to transfer funds on behalf of the token owner

Parameters

Name
Type
Description

_spender

address

Address that is allowed to spend the tokens

_value

uint256

The allowed amount in shares, will override previous value

Returns

Name
Type
Description

_0

bool

True if success

balanceOf

function balanceOf(address _owner) external view returns (uint256)

Retrieve the balance of an account

Parameters

Name
Type
Description

_owner

address

Address to be checked

Returns

Name
Type
Description

_0

uint256

The balance of the account in shares

balanceOfUnderlying

function balanceOfUnderlying(address _owner) external view returns (uint256)

Retrieve the underlying asset balance of an account

Parameters

Name
Type
Description

_owner

address

Address to be checked

Returns

Name
Type
Description

_0

uint256

The underlying balance of the account

claimRedeemRequests

function claimRedeemRequests(uint32[] _redeemRequestIds, uint32[] _withdrawalEventIds) external nonpayable returns (uint8[] claimStatuses)

Claims several redeem requests

Parameters

Name
Type
Description

_redeemRequestIds

uint32[]

The list of redeem requests to claim

_withdrawalEventIds

uint32[]

The list of resolved withdrawal event ids

Returns

Name
Type
Description

claimStatuses

uint8[]

The operation status results

decimals

function decimals() external pure returns (uint8)

Retrieve the decimal count

Returns

Name
Type
Description

_0

uint8

The decimal count

decreaseAllowance

function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)

Decrease allowance to another account

Parameters

Name
Type
Description

_spender

address

Spender that receives the allowance

_subtractableValue

uint256

Amount of shares to subtract

Returns

Name
Type
Description

_0

bool

True if success

deposit

function deposit() external payable

Explicit deposit method to mint on msg.sender

depositAndTransfer

function depositAndTransfer(address _recipient) external payable

Explicit deposit method to mint on msg.sender and transfer to _recipient

Parameters

Name
Type
Description

_recipient

address

Address receiving the minted LsETH

depositToConsensusLayerWithDepositRoot

function depositToConsensusLayerWithDepositRoot(uint256 _maxCount, bytes32 _depositRoot) external nonpayable

Deposits current balance to the Consensus Layer by batches of 32 ETH

Parameters

Name
Type
Description

_maxCount

uint256

The maximum amount of validator keys to fund

_depositRoot

bytes32

The root of the deposit tree

getAllowlist

function getAllowlist() external view returns (address)

Retrieve the allowlist address

Returns

Name
Type
Description

_0

address

The allowlist address

getBalanceToDeposit

function getBalanceToDeposit() external view returns (uint256)

Returns the amount of ETH not yet committed for deposit

Returns

Name
Type
Description

_0

uint256

The amount of ETH not yet committed for deposit

getBalanceToRedeem

function getBalanceToRedeem() external view returns (uint256)

Retrieve the current balance to redeem

Returns

Name
Type
Description

_0

uint256

The current balance to redeem

getCLSpec

function getCLSpec() external view returns (struct CLSpec.CLSpecStruct)

Retrieve the current cl spec

Returns

Name
Type
Description

_0

CLSpec.CLSpecStruct

The Consensus Layer Specification

getCLValidatorCount

function getCLValidatorCount() external view returns (uint256)

Get CL validator count (the amount of validator reported by the oracles)

Returns

Name
Type
Description

_0

uint256

The CL validator count

getCLValidatorTotalBalance

function getCLValidatorTotalBalance() external view returns (uint256)

Get CL validator total balance

Returns

Name
Type
Description

_0

uint256

The CL Validator total balance

getCollector

function getCollector() external view returns (address)

Retrieve the collector address

Returns

Name
Type
Description

_0

address

The collector address

getCommittedBalance

function getCommittedBalance() external view returns (uint256)

Returns the amount of ETH committed for deposit

Returns

Name
Type
Description

_0

uint256

The amount of ETH committed for deposit

getCoverageFund

function getCoverageFund() external view returns (address)

Retrieve the coverage fund

Returns

Name
Type
Description

_0

address

The coverage fund address

getCurrentEpochId

function getCurrentEpochId() external view returns (uint256)

Retrieve the current epoch id based on block timestamp

Returns

Name
Type
Description

_0

uint256

The current epoch id

getCurrentFrame

function getCurrentFrame() external view returns (uint256 _startEpochId, uint256 _startTime, uint256 _endTime)

Retrieve the current frame details

Returns

Name
Type
Description

_startEpochId

uint256

The epoch at the beginning of the frame

_startTime

uint256

The timestamp of the beginning of the frame in seconds

_endTime

uint256

The timestamp of the end of the frame in seconds

getDailyCommittableLimits

function getDailyCommittableLimits() external view returns (struct DailyCommittableLimits.DailyCommittableLimitsStruct)

Retrieve the configured daily committable limits

Returns

Name
Type
Description

_0

DailyCommittableLimits.DailyCommittableLimitsStruct

The daily committable limits structure

getDepositedValidatorCount

function getDepositedValidatorCount() external view returns (uint256)

Get the deposited validator count (the count of deposits made by the contract)

Returns

Name
Type
Description

_0

uint256

The deposited validator count

getELFeeRecipient

function getELFeeRecipient() external view returns (address)

Retrieve the execution layer fee recipient

Returns

Name
Type
Description

_0

address

The execution layer fee recipient address

getExpectedEpochId

function getExpectedEpochId() external view returns (uint256)

Retrieve expected epoch id

Returns

Name
Type
Description

_0

uint256

The current expected epoch id

getFrameFirstEpochId

function getFrameFirstEpochId(uint256 _epochId) external view returns (uint256)

Retrieve the first epoch id of the frame of the provided epoch id

Parameters

Name
Type
Description

_epochId

uint256

Epoch id used to get the frame

Returns

Name
Type
Description

_0

uint256

The first epoch id of the frame containing the given epoch id

getGlobalFee

function getGlobalFee() external view returns (uint256)

Get the current global fee

Returns

Name
Type
Description

_0

uint256

The global fee

getKeeper

function getKeeper() external view returns (address)

Get the keeper address

Returns

Name
Type
Description

_0

address

The keeper address

getLastCompletedEpochId

function getLastCompletedEpochId() external view returns (uint256)

Retrieve the last completed epoch id

Returns

Name
Type
Description

_0

uint256

The last completed epoch id

getLastConsensusLayerReport

function getLastConsensusLayerReport() external view returns (struct IOracleManagerV1.StoredConsensusLayerReport)

Retrieve the last consensus layer report

Returns

Name
Type
Description

_0

IOracleManagerV1.StoredConsensusLayerReport

The stored consensus layer report

getMetadataURI

function getMetadataURI() external view returns (string)

Retrieve the metadata uri string value

Returns

Name
Type
Description

_0

string

The metadata uri string value

getOperatorsRegistry

function getOperatorsRegistry() external view returns (address)

Retrieve the operators registry

Returns

Name
Type
Description

_0

address

The operators registry address

getOracle

function getOracle() external view returns (address)

Get oracle address

Returns

Name
Type
Description

_0

address

The oracle address

getRedeemManager

function getRedeemManager() external view returns (address)

Retrieve the redeem manager

Returns

Name
Type
Description

_0

address

The redeem manager address

getReportBounds

function getReportBounds() external view returns (struct ReportBounds.ReportBoundsStruct)

Retrieve the report bounds

Returns

Name
Type
Description

_0

ReportBounds.ReportBoundsStruct

The report bounds

getTime

function getTime() external view returns (uint256)

Retrieve the block timestamp

Returns

Name
Type
Description

_0

uint256

The current timestamp from the EVM context

getWithdrawalCredentials

function getWithdrawalCredentials() external view returns (bytes32)

Retrieve the withdrawal credentials

Returns

Name
Type
Description

_0

bytes32

The withdrawal credentials

increaseAllowance

function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)

Increase allowance to another account

Parameters

Name
Type
Description

_spender

address

Spender that receives the allowance

_additionalValue

uint256

Amount of shares to add

Returns

Name
Type
Description

_0

bool

True if success

initRiverV1

function initRiverV1(address _depositContractAddress, address _elFeeRecipientAddress, bytes32 _withdrawalCredentials, address _oracleAddress, address _systemAdministratorAddress, address _allowlistAddress, address _operatorRegistryAddress, address _collectorAddress, uint256 _globalFee) external nonpayable

Initializes the River system

Parameters

Name
Type
Description

_depositContractAddress

address

Address to make Consensus Layer deposits

_elFeeRecipientAddress

address

Address that receives the execution layer fees

_withdrawalCredentials

bytes32

Credentials to use for every validator deposit

_oracleAddress

address

The address of the Oracle contract

_systemAdministratorAddress

address

Administrator address

_allowlistAddress

address

Address of the allowlist contract

_operatorRegistryAddress

address

Address of the operator registry

_collectorAddress

address

Address receiving the the global fee on revenue

_globalFee

uint256

Amount retained when the ETH balance increases and sent to the collector

initRiverV1_1

function initRiverV1_1(address _redeemManager, uint64 _epochsPerFrame, uint64 _slotsPerEpoch, uint64 _secondsPerSlot, uint64 _genesisTime, uint64 _epochsToAssumedFinality, uint256 _annualAprUpperBound, uint256 _relativeLowerBound, uint128 _maxDailyNetCommittableAmount_, uint128 _maxDailyRelativeCommittableAmount_) external nonpayable

Initialized version 1.1 of the River System

Parameters

Name
Type
Description

_redeemManager

address

The redeem manager address

_epochsPerFrame

uint64

The amounts of epochs in a frame

_slotsPerEpoch

uint64

The slots inside an epoch

_secondsPerSlot

uint64

The seconds inside a slot

_genesisTime

uint64

The genesis timestamp

_epochsToAssumedFinality

uint64

The number of epochs before an epoch is considered final on-chain

_annualAprUpperBound

uint256

The reporting upper bound

_relativeLowerBound

uint256

The reporting lower bound

maxDailyNetCommittableAmount

uint128

The net daily committable limit

maxDailyRelativeCommittableAmount

uint128

The relative daily committable limit

initRiverV1_2

function initRiverV1_2() external nonpayable

Initializes version 1.2 of the River System

isValidEpoch

function isValidEpoch(uint256 epoch) external view returns (bool)

Verifies if the provided epoch is valid

Parameters

Name
Type
Description

epoch

uint256

The epoch to lookup

Returns

Name
Type
Description

_0

bool

True if valid

name

function name() external pure returns (string)

Retrieve the token name

Returns

Name
Type
Description

_0

string

The token name

requestRedeem

function requestRedeem(uint256 _lsETHAmount, address _recipient) external nonpayable returns (uint32 redeemRequestId)

Performs a redeem request on the redeem manager

Parameters

Name
Type
Description

_lsETHAmount

uint256

The amount of LsETH to redeem

_recipient

address

The address that will own the redeem request

Returns

Name
Type
Description

redeemRequestId

uint32

The ID of the newly created redeem request

resolveRedeemRequests

function resolveRedeemRequests(uint32[] _redeemRequestIds) external view returns (int64[] withdrawalEventIds)

Resolves the provided redeem requests by calling the redeem manager

Parameters

Name
Type
Description

_redeemRequestIds

uint32[]

The list of redeem requests to resolve

Returns

Name
Type
Description

withdrawalEventIds

int64[]

The list of matching withdrawal events, or error codes

sendCLFunds

function sendCLFunds() external payable

Input for consensus layer funds, containing both exit and skimming

sendCoverageFunds

function sendCoverageFunds() external payable

Input for coverage funds

sendELFees

function sendELFees() external payable

Input for execution layer fee earnings

sendRedeemManagerExceedingFunds

function sendRedeemManagerExceedingFunds() external payable

Input for the redeem manager funds

setAllowlist

function setAllowlist(address _newAllowlist) external nonpayable

Changes the allowlist address

Parameters

Name
Type
Description

_newAllowlist

address

New address for the allowlist

setCLSpec

function setCLSpec(CLSpec.CLSpecStruct _newValue) external nonpayable

Parameters

Name
Type
Description

_newValue

CLSpec.CLSpecStruct

undefined

setCollector

function setCollector(address _newCollector) external nonpayable

Changes the collector address

Parameters

Name
Type
Description

_newCollector

address

New address for the collector

setConsensusLayerData

function setConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable

Parameters

Name
Type
Description

_report

IOracleManagerV1.ConsensusLayerReport

undefined

setCoverageFund

function setCoverageFund(address _newCoverageFund) external nonpayable

Changes the coverage fund

Parameters

Name
Type
Description

_newCoverageFund

address

New address for the fund

setDailyCommittableLimits

function setDailyCommittableLimits(DailyCommittableLimits.DailyCommittableLimitsStruct _dcl) external nonpayable

Parameters

Name
Type
Description

_dcl

DailyCommittableLimits.DailyCommittableLimitsStruct

undefined

setELFeeRecipient

function setELFeeRecipient(address _newELFeeRecipient) external nonpayable

Changes the execution layer fee recipient

Parameters

Name
Type
Description

_newELFeeRecipient

address

New address for the recipient

setGlobalFee

function setGlobalFee(uint256 _newFee) external nonpayable

Changes the global fee parameter

Parameters

Name
Type
Description

_newFee

uint256

New fee value

setMetadataURI

function setMetadataURI(string _metadataURI) external nonpayable

Sets the metadata uri string value

Parameters

Name
Type
Description

_metadataURI

string

The new metadata uri string value

setOracle

function setOracle(address _oracleAddress) external nonpayable

Set the oracle address

Parameters

Name
Type
Description

_oracleAddress

address

Address of the oracle

setReportBounds

function setReportBounds(ReportBounds.ReportBoundsStruct _newValue) external nonpayable

Parameters

Name
Type
Description

_newValue

ReportBounds.ReportBoundsStruct

undefined

sharesFromUnderlyingBalance

function sharesFromUnderlyingBalance(uint256 _underlyingAssetAmount) external view returns (uint256)

Retrieve the shares count from an underlying asset amount

Parameters

Name
Type
Description

_underlyingAssetAmount

uint256

Amount of underlying asset to convert

Returns

Name
Type
Description

_0

uint256

The amount of shares worth the underlying asset amount

symbol

function symbol() external pure returns (string)

Retrieve the token symbol

Returns

Name
Type
Description

_0

string

The token symbol

totalSupply

function totalSupply() external view returns (uint256)

Retrieve the total token supply

Returns

Name
Type
Description

_0

uint256

The total supply in shares

totalUnderlyingSupply

function totalUnderlyingSupply() external view returns (uint256)

Retrieve the total underlying asset supply

Returns

Name
Type
Description

_0

uint256

The total underlying asset supply

transfer

function transfer(address _to, uint256 _value) external nonpayable returns (bool)

Performs a transfer from the message sender to the provided account

Parameters

Name
Type
Description

_to

address

Address receiving the tokens

_value

uint256

Amount of shares to be sent

Returns

Name
Type
Description

_0

bool

True if success

transferFrom

function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)

Performs a transfer between two recipients

Parameters

Name
Type
Description

_from

address

Address sending the tokens

_to

address

Address receiving the tokens

_value

uint256

Amount of shares to be sent

Returns

Name
Type
Description

_0

bool

True if success

underlyingBalanceFromShares

function underlyingBalanceFromShares(uint256 _shares) external view returns (uint256)

Retrieve the underlying asset balance from an amount of shares

Parameters

Name
Type
Description

_shares

uint256

Amount of shares to convert

Returns

Name
Type
Description

_0

uint256

The underlying asset balance represented by the shares

Events

Approval

event Approval(address indexed owner, address indexed spender, uint256 value)

Emitted when the allowance of a spender for an owner is set by a call to {approve}. value is the new allowance.

Parameters

Name
Type
Description

owner indexed

address

undefined

spender indexed

address

undefined

value

uint256

undefined

ConsensusLayerDataUpdate

event ConsensusLayerDataUpdate(uint256 validatorCount, uint256 validatorTotalBalance, bytes32 roundId)

The consensus layer data provided by the oracle has been updated

Parameters

Name
Type
Description

validatorCount

uint256

The new count of validators running on the consensus layer

validatorTotalBalance

uint256

The new total balance sum of all validators

roundId

bytes32

Round identifier

ProcessedConsensusLayerReport

event ProcessedConsensusLayerReport(IOracleManagerV1.ConsensusLayerReport report, IOracleManagerV1.ConsensusLayerDataReportingTrace trace)

The provided report has been processed

Parameters

Name
Type
Description

report

IOracleManagerV1.ConsensusLayerReport

The report that was provided

trace

IOracleManagerV1.ConsensusLayerDataReportingTrace

The trace structure providing more insights on internals

PulledCLFunds

event PulledCLFunds(uint256 pulledSkimmedEthAmount, uint256 pullExitedEthAmount)

Emitted when funds are pulled from the CL recipient

Parameters

Name
Type
Description

pulledSkimmedEthAmount

uint256

The amount of skimmed ETH pulled

pullExitedEthAmount

uint256

The amount of exited ETH pulled

PulledCoverageFunds

event PulledCoverageFunds(uint256 amount)

Funds have been pulled from the Coverage Fund

Parameters

Name
Type
Description

amount

uint256

The amount pulled

PulledELFees

event PulledELFees(uint256 amount)

Funds have been pulled from the Execution Layer Fee Recipient

Parameters

Name
Type
Description

amount

uint256

The amount pulled

PulledRedeemManagerExceedingEth

event PulledRedeemManagerExceedingEth(uint256 amount)

Emitted when funds are pulled from the redeem manager

Parameters

Name
Type
Description

amount

uint256

The amount pulled

ReportedRedeemManager

event ReportedRedeemManager(uint256 redeemManagerDemand, uint256 suppliedRedeemManagerDemand, uint256 suppliedRedeemManagerDemandInEth)

Emitted when the redeem manager received a withdraw event report

Parameters

Name
Type
Description

redeemManagerDemand

uint256

The total demand in LsETH of the redeem manager

suppliedRedeemManagerDemand

uint256

The amount of LsETH demand actually supplied

suppliedRedeemManagerDemandInEth

uint256

The amount in ETH of the supplied demand

RewardsEarned

event RewardsEarned(address indexed _collector, uint256 _oldTotalUnderlyingBalance, uint256 _oldTotalSupply, uint256 _newTotalUnderlyingBalance, uint256 _newTotalSupply)

The system underlying supply increased. This is a snapshot of the balances for accounting purposes

Parameters

Name
Type
Description

_collector indexed

address

The address of the collector during this event

_oldTotalUnderlyingBalance

uint256

Old total ETH balance under management by River

_oldTotalSupply

uint256

Old total supply in shares

_newTotalUnderlyingBalance

uint256

New total ETH balance under management by River

_newTotalSupply

uint256

New total supply in shares

SetAllowlist

event SetAllowlist(address indexed allowlist)

The stored Allowlist has been changed

Parameters

Name
Type
Description

allowlist indexed

address

The new Allowlist

SetBalanceCommittedToDeposit

event SetBalanceCommittedToDeposit(uint256 oldAmount, uint256 newAmount)

Emitted when the balance committed to deposit

Parameters

Name
Type
Description

oldAmount

uint256

The old balance committed to deposit

newAmount

uint256

The new balance committed to deposit

SetBalanceToDeposit

event SetBalanceToDeposit(uint256 oldAmount, uint256 newAmount)

Emitted when the balance to deposit is updated

Parameters

Name
Type
Description

oldAmount

uint256

The old balance to deposit

newAmount

uint256

The new balance to deposit

SetBalanceToRedeem

event SetBalanceToRedeem(uint256 oldAmount, uint256 newAmount)

Emitted when the balance to redeem is updated

Parameters

Name
Type
Description

oldAmount

uint256

The old balance to redeem

newAmount

uint256

The new balance to redeem

SetBounds

event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)

The Report Bounds are changed

Parameters

Name
Type
Description

annualAprUpperBound

uint256

The reporting upper bound

relativeLowerBound

uint256

The reporting lower bound

SetCollector

event SetCollector(address indexed collector)

The stored Collector has been changed

Parameters

Name
Type
Description

collector indexed

address

The new Collector

SetCoverageFund

event SetCoverageFund(address indexed coverageFund)

The stored Coverage Fund has been changed

Parameters

Name
Type
Description

coverageFund indexed

address

The new Coverage Fund

SetDepositContractAddress

event SetDepositContractAddress(address indexed depositContract)

The stored deposit contract address changed

Parameters

Name
Type
Description

depositContract indexed

address

Address of the deposit contract

SetDepositedValidatorCount

event SetDepositedValidatorCount(uint256 oldDepositedValidatorCount, uint256 newDepositedValidatorCount)

Emitted when the deposited validator count is updated

Parameters

Name
Type
Description

oldDepositedValidatorCount

uint256

The old deposited validator count value

newDepositedValidatorCount

uint256

The new deposited validator count value

SetELFeeRecipient

event SetELFeeRecipient(address indexed elFeeRecipient)

The stored Execution Layer Fee Recipient has been changed

Parameters

Name
Type
Description

elFeeRecipient indexed

address

The new Execution Layer Fee Recipient

SetGlobalFee

event SetGlobalFee(uint256 fee)

The stored Global Fee has been changed

Parameters

Name
Type
Description

fee

uint256

The new Global Fee

SetMaxDailyCommittableAmounts

event SetMaxDailyCommittableAmounts(uint256 minNetAmount, uint256 maxRelativeAmount)

Emitted when the daily committable limits are changed

Parameters

Name
Type
Description

minNetAmount

uint256

The minimum amount that must be used as the daily committable amount

maxRelativeAmount

uint256

The maximum amount that can be used as the daily committable amount, relative to the total underlying supply

SetMetadataURI

event SetMetadataURI(string metadataURI)

The stored Metadata URI string has been changed

Parameters

Name
Type
Description

metadataURI

string

The new Metadata URI string

SetOperatorsRegistry

event SetOperatorsRegistry(address indexed operatorRegistry)

The stored Operators Registry has been changed

Parameters

Name
Type
Description

operatorRegistry indexed

address

The new Operators Registry

SetOracle

event SetOracle(address indexed oracleAddress)

The stored oracle address changed

Parameters

Name
Type
Description

oracleAddress indexed

address

The new oracle address

SetRedeemManager

event SetRedeemManager(address redeemManager)

Emitted when the redeem manager address is changed

Parameters

Name
Type
Description

redeemManager

address

The address of the redeem manager

SetSpec

event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime, uint64 epochsToAssumedFinality)

The Consensus Layer Spec is changed

Parameters

Name
Type
Description

epochsPerFrame

uint64

The number of epochs inside a frame

slotsPerEpoch

uint64

The number of slots inside an epoch

secondsPerSlot

uint64

The number of seconds inside a slot

genesisTime

uint64

The genesis timestamp

epochsToAssumedFinality

uint64

The number of epochs before an epoch is considered final

SetTotalSupply

event SetTotalSupply(uint256 totalSupply)

Emitted when the total supply is changed

Parameters

Name
Type
Description

totalSupply

uint256

undefined

SetWithdrawalCredentials

event SetWithdrawalCredentials(bytes32 withdrawalCredentials)

The stored withdrawal credentials changed

Parameters

Name
Type
Description

withdrawalCredentials

bytes32

The withdrawal credentials to use for deposits

Transfer

event Transfer(address indexed from, address indexed to, uint256 value)

Emitted when value tokens are moved from one account (from) to another (to). Note that value may be zero.

Parameters

Name
Type
Description

from indexed

address

undefined

to indexed

address

undefined

value

uint256

undefined

UserDeposit

event UserDeposit(address indexed depositor, address indexed recipient, uint256 amount)

User deposited ETH in the system

Parameters

Name
Type
Description

depositor indexed

address

Address performing the deposit

recipient indexed

address

Address receiving the minted shares

amount

uint256

Amount in ETH deposited

Errors

AllowanceTooLow

error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)

Allowance too low to perform operation

Parameters

Name
Type
Description

_from

address

Account where funds are sent from

_operator

address

Account attempting the transfer

_allowance

uint256

Current allowance

_value

uint256

Requested transfer value in shares

BalanceTooLow

error BalanceTooLow()

Balance too low to perform operation

Denied

error Denied(address account)

The access was denied

Parameters

Name
Type
Description

account

address

The account that was denied

EmptyDeposit

error EmptyDeposit()

And empty deposit attempt was made

ErrorOnDeposit

error ErrorOnDeposit()

An error occurred during the deposit

InconsistentPublicKeys

error InconsistentPublicKeys()

The length of the BLS Public key is invalid during deposit

InconsistentSignatures

error InconsistentSignatures()

The length of the BLS Signature is invalid during deposit

InvalidDecreasingValidatorsExitedBalance

error InvalidDecreasingValidatorsExitedBalance(uint256 currentValidatorsExitedBalance, uint256 newValidatorsExitedBalance)

The total exited balance decreased

Parameters

Name
Type
Description

currentValidatorsExitedBalance

uint256

The current exited balance

newValidatorsExitedBalance

uint256

The new exited balance

InvalidDecreasingValidatorsSkimmedBalance

error InvalidDecreasingValidatorsSkimmedBalance(uint256 currentValidatorsSkimmedBalance, uint256 newValidatorsSkimmedBalance)

The total skimmed balance decreased

Parameters

Name
Type
Description

currentValidatorsSkimmedBalance

uint256

The current exited balance

newValidatorsSkimmedBalance

uint256

The new exited balance

InvalidDepositRoot

error InvalidDepositRoot()

Invalid deposit root

InvalidEpoch

error InvalidEpoch(uint256 epoch)

Thrown when an invalid epoch was reported

Parameters

Name
Type
Description

epoch

uint256

Invalid epoch

InvalidPublicKeyCount

error InvalidPublicKeyCount()

The received count of public keys to deposit is invalid

InvalidPulledClFundsAmount

error InvalidPulledClFundsAmount(uint256 requested, uint256 received)

Thrown when the amount received from the Withdraw contract doe not match the requested amount

Parameters

Name
Type
Description

requested

uint256

The amount that was requested

received

uint256

The amount that was received

InvalidSignatureCount

error InvalidSignatureCount()

The received count of signatures to deposit is invalid

InvalidValidatorCountReport

error InvalidValidatorCountReport(uint256 providedValidatorCount, uint256 depositedValidatorCount, uint256 lastReportedValidatorCount)

The reported validator count is invalid

Parameters

Name
Type
Description

providedValidatorCount

uint256

The received validator count value

depositedValidatorCount

uint256

The number of deposits performed by the system

lastReportedValidatorCount

uint256

The last reported validator count

InvalidWithdrawalCredentials

error InvalidWithdrawalCredentials()

The withdrawal credentials value is null

NoAvailableValidatorKeys

error NoAvailableValidatorKeys()

The internal key retrieval returned no keys

NotEnoughFunds

error NotEnoughFunds()

Not enough funds to deposit one validator

NullTransfer

error NullTransfer()

Invalid empty transfer

OnlyKeeper

error OnlyKeeper()

TotalValidatorBalanceDecreaseOutOfBound

error TotalValidatorBalanceDecreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 relativeLowerBound)

The balance decrease is higher than the maximum allowed by the lower bound

Parameters

Name
Type
Description

prevTotalEthIncludingExited

uint256

The previous total balance, including all exited balance

postTotalEthIncludingExited

uint256

The post-report total balance, including all exited balance

timeElapsed

uint256

The time in seconds since last report

relativeLowerBound

uint256

The lower bound value that was used

TotalValidatorBalanceIncreaseOutOfBound

error TotalValidatorBalanceIncreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 annualAprUpperBound)

The balance increase is higher than the maximum allowed by the upper bound

Parameters

Name
Type
Description

prevTotalEthIncludingExited

uint256

The previous total balance, including all exited balance

postTotalEthIncludingExited

uint256

The post-report total balance, including all exited balance

timeElapsed

uint256

The time in seconds since last report

annualAprUpperBound

uint256

The upper bound value that was used

UnauthorizedTransfer

error UnauthorizedTransfer(address _from, address _to)

Invalid transfer recipients

Parameters

Name
Type
Description

_from

address

Account sending the funds in the invalid transfer

_to

address

Account receiving the funds in the invalid transfer

ZeroMintedShares

error ZeroMintedShares()

The computed amount of shares to mint is 0

OracleMembers

Oracle Members Storage

Utility to manage the Oracle Members in storage

There can only be up to 256 oracle members. This is due to how report statuses are stored in Reports Positions

AllowlistAddress

Allowlist Address Storage

Utility to manage the Allowlist Address in storage

BufferedExceedingEth

Buffered Exceeding Eth storage

Redeem Manager utility to manage the exceeding ETH with a redeem request

CLValidatorCount

Consensus Layer Validator Count Storage

Utility to manage the Consensus Layer Validator Count in storageThis state variable is deprecated and was kept due to migration logic needs