arrow-left

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

Live

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Overview

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.

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 LsETH receipt token. 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.

hashtag
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.

ETH Liquid Staking Documentation

Liquid Collectivearrow-up-right 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.

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

For general Liquid Collective documentation, visit Liquid Collective's core documentation herearrow-up-right.

hashtag
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.

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

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

  • All code deployed to mainnet has been audited by leading security expertsarrow-up-right

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

  • Liquid Staked ETH (LsETH)
    ERC-20 cToken model
    slashing coverage
    LsETH User Agreement
    diversified Node Operator set

    Tokenomics

    Technical Reference

    Components

    Oracles

    Roles & Staking Infrastructure

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

    hashtag
    Key roles in Liquid Collective

    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 postarrow-up-right.

    hashtag
    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.

    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 .

    hashtag
    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.

    hashtag
    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.

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

    hashtag
    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.

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

    hashtag
    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.

    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.

    hashtag
    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.

    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 .

    Architecture

    Liquid Collective's protocol architecture on Ethereum

    hashtag
    Smart Contracts

    hashtag
    River

    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

    Ethereum architecture
    Platform Operations documentationarrow-up-right
    Alluvialarrow-up-right
    Exigerarrow-up-right
    Ratedarrow-up-right
    Node Operations documentationarrow-up-right
    LsETH's Conversion Rate
    Slashing Coverage Program
    Node Operations Validator Infrastructure
    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.

    • Consensus Layer Deposits: River orchestrates the delegation of ETH to validators and deposits to the official Ethereum deposit contractarrow-up-right.

    hashtag
    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.

    hashtag
    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

    hashtag
    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.

    hashtag
    ELFeeRecipient

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

    hashtag
    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.

    hashtag
    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.

    hashtag
    Queues, stacks, and buffers

    hashtag
    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.

    hashtag
    Redemption Buffer

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

    hashtag
    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.

    hashtag
    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.

    Liquid Collective protocol architecture

    Smart Contracts

    Platforms

    LastEpochId

    Last Epoch Id Storage

    Utility to manage the Last Epoch Id in storage

    OperatorsRegistry

    LibUnstructuredStorage

    Lib Unstructured Storage

    Utilities to work with unstructured storage

    RedeemManager

    LibBasisPoints

    Lib Basis Points

    Holds the basis points max value

    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

    Libraries

    Node Operations

    LibAdministrable

    Alluvial Finance Inc.

    Lib Administrable

    This library handles the admin and pending admin storage vars

    LibUint256

    Lib Uint256

    Utilities to perform uint operations

    State

    Interfaces

    RedeemDemand

    Redeem Demand storage

    Redeem Manager utility to store the current demand in LsETH

    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

    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

    WithdrawalStack

    Redeem Manager Withdrawal Stack storage

    Utility to manage the Withdrawal Stack in the Redeem Manager

    LibAllowlistMasks

    Lib Allowlist Masks

    Holds all the mask values

    LibSanitize

    Lib Sanitize

    Utilities to sanitize input values

    AllowlistAddress

    Allowlist Address Storage

    Utility to manage the Allowlist Address in storage

    ReportsVariants

    Reports Variants Storage

    Utility to manage the Reports Variants in storage

    AllowList

    IRedeemManagerV1

    CLSpec

    Consensus Layer Spec Storage

    Utility to manage the Consensus Layer Spec 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

    Oracle

    BufferedExceedingEth

    Buffered Exceeding Eth storage

    Redeem Manager utility to manage the exceeding ETH with a redeem request

    AllowerAddress

    Allower Address Storage

    Utility to manage the Allower Address in storage

    Quorum

    Quorum Storage

    Utility to manage the Quorum in storage

    DenierAddress

    Denier Address Storage

    Utility to manage the Denier Address in storage

    Allowlist

    Allowlist Storage

    Utility to manage the Allowlist mapping in storage

    BalanceToDeposit

    RedeemQueueV2

    Redeem Manager Redeem Queue storage

    Utility to manage the Redeem Queue in the Redeem Manager

    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

    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.

    Below is an example of an RPC call to get Liquid Collective metadata URI using castarrow-up-right

    $ cast call 0x8c1BEd5b9a0928467c9B1341Da1D7BD5e10b6549 "getMetadataURI()(string)"
    ipfs://QmZrpoUUKZ2n5Pd3EAG38HRHjNh66MRBFMMBqsFUVS6NpB

    Validator Infrastructure

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

    hashtag
    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.

    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.

    hashtag
    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.

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

    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.

    hashtag
    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.

    hashtag
    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.

    hashtag
    Enterprise integration APIs

    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.

    IProtocolVersion

    hashtag
    Methods

    hashtag
    version

    function version() external pure returns (string)

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    LibBytes

    Lib Bytes

    This library helps manipulating bytes

    hashtag
    Errors

    hashtag
    SliceOutOfBounds

    The slice is outside of the initial bytes bounds

    hashtag
    SliceOverflow

    The length overflows an uint

    Oracle Infrastructure

    Oracle operations on Liquid Collective report on consensus layer data

    hashtag
    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.

    ProtocolMetrics

    hashtag
    Methods

    hashtag
    getRate

    Initializable

    Alluvial Finance Inc.

    Initializable

    This contract ensures that initializers are called only once per version

    hashtag
    Events

    IDepositContract

    Deposit Contract Interface

    This interface exposes methods to perform validator deposits

    hashtag
    Methods

    OperatorsV2

    Operators Storage

    Utility to manage the Operators in storage

    hashtag
    Errors

    ValidatorKeys

    Validator Keys Storage

    Utility to manage the validator keys in storage

    hashtag
    Errors

    hashtag
    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.

    hashtag
    Epochs

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

    circle-info

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

    hashtag
    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.

    hashtag
    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.

    hashtag
    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.

    hashtag
    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.

    _0

    string

    Version of the contract

    Slashing Coverage Program
    Operate Validator Nodes
    Alluvial documentationarrow-up-right
    Alluvial Onboarding APIarrow-up-right

    River

    BalanceToRedeem

    error SliceOutOfBounds()
    error SliceOverflow()
    hashtag
    Returns
    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    initProtocolMetricsV1

    hashtag
    Parameters

    Name
    Type
    Description

    river

    address

    undefined

    hashtag
    Events

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    hashtag
    Errors

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    hashtag
    Errors

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    hashtag
    OperatorNotFound

    The operator was not found

    hashtag
    Parameters

    Name
    Type
    Description

    index

    uint256

    The provided index

    error OperatorNotFound(uint256 index)
    hashtag
    InvalidPublicKey

    The provided public key is not matching the expected length

    hashtag
    InvalidSignature

    The provided signature is not matching the expected length

    error InvalidPublicKey()
    error InvalidSignature()
    function getRate() external view returns (uint256)
    function initProtocolMetricsV1(address river) external nonpayable
    event Initialize(uint256 version, bytes cdata)
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    error InvalidZeroAddress()
    event Initialize(uint256 version, bytes cdata)
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    hashtag
    deposit

    Official deposit method to activate a validator on the consensus layer

    hashtag
    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

    hashtag
    get_deposit_root

    Query the current deposit root hash.

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bytes32

    The deposit root hash.

    LsETH (cToken)

    Liquid Staked ETH, Liquid Collective's liquid staking token

    LsETH is a fungible receipt token based on the Ethereum ERC-20 cTokenarrow-up-right 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.

    circle-exclamation

    Ethereum mainnet: Verify the LsETH token address on Etherscan herearrow-up-right. The LsETH contract address is: 0x8c1BEd5b9a0928467c9B1341Da1D7BD5e10b6549

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

    hashtag
    LsETH User Agreement

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

    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.

    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 .

    hashtag
    cToken

    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.

    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.

    hashtag
    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.

    hashtag
    Formula

    circle-info

    At first deposit, the conversionRate is set to 1.

    hashtag
    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

    hashtag
    What are the tax implications?

    circle-exclamation

    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.

    Deployment Addresses

    Liquid Collective deployment addresses

    Contract
    Mainnet
    Hoodi

    LibErrors

    Lib Errors

    Library of common errors

    hashtag
    Errors

    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

    hashtag
    Methods

    Slashing Coverage

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

    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.

    hashtag

    UserDepositManagerV1

    Alluvial Finance Inc.

    User Deposit Manager (v1)

    This contract handles the inbound transfers cases or the explicit submissions

    hashtag
    Methods

    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

    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

    hashtag
    Methods

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

    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.

    hashtag
    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 Allowlister, which is a trusted party responsible for allowing users to participate in the Liquid Collective protocol. Typically Platforms that enable minting and redemptionarrow-up-right (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

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

    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 Platform Operations documentationarrow-up-right.

    hashtag
    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.

    Requests by third parties for denial of access to an address must be submitted in writing to [email protected]envelope. 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.

    The root hash of the whole deposit data structure

    conversionRate=totalETHSupplytotalLsETHSupplyconversionRate = \frac{totalETHSupply}{totalLsETHSupply}conversionRate=totalLsETHSupplytotalETHSupply​
    LsETH token address on Basescan herearrow-up-right
    LsETH User Agreementarrow-up-right
    herearrow-up-right
    postarrow-up-right
    cToken modelarrow-up-right
    Slashing Coverage Program Summary: 3 layers of coverage

    You can find more details about Liquid Collective's Slashing Coverage Program in this blog postarrow-up-right.

    hashtag
    1. Nexus Mutual Coverage

    Nexus Mutualarrow-up-right 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.

    hashtag
    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.

    hashtag
    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.

    hashtag
    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.

    hashtag
    Slashing Coverage Fund Contract

    The Slashing Coverage Fund contract enables the Liquid Collective Slashing Coverage Programarrow-up-right. 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.

    hashtag
    Fund Supply

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

    Computation and assignation of deductibles following a slashing incident are performed off-chain according to Liquid Collective's Slashing Coverage Programarrow-up-right.

    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.

    hashtag
    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.

    LsETH User Agreementarrow-up-right
    Liquid Collective's Slashing Coverage Programarrow-up-right
    Coverage image
    hashtag
    InvalidArgument

    The argument was invalid

    hashtag
    InvalidCall

    The call was invalid

    hashtag
    InvalidEmptyString

    The string is empty

    hashtag
    InvalidFee

    The fee is invalid

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    caller

    address

    Address performing the call

    hashtag
    getCredentials

    Retrieve the withdrawal credentials to use

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bytes32

    The withdrawal credentials

    hashtag
    getRiver

    Retrieve the linked River address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The River address

    hashtag
    initializeWithdrawV1

    hashtag
    Parameters

    Name
    Type
    Description

    _river

    address

    The address of the River contract

    hashtag
    pullEth

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

    hashtag
    Parameters

    Name
    Type
    Description

    _amount

    uint256

    The amount to pull

    hashtag
    Events

    hashtag
    SetRiver

    Emitted when the linked River address is changed

    hashtag
    Parameters

    Name
    Type
    Description

    river

    address

    The new River address

    hashtag
    deposit

    Explicit deposit method to mint on msg.sender

    hashtag
    depositAndTransfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    _recipient

    address

    Address receiving the minted LsETH

    hashtag
    Events

    hashtag
    UserDeposit

    User deposited ETH in the system

    hashtag
    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

    hashtag
    Errors

    hashtag
    EmptyDeposit

    And empty deposit attempt was made

    hashtag
    InvalidCall

    The call was invalid

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    initELFeeRecipientV1

    Initialize the fee recipient with the required arguments

    hashtag
    Parameters

    Name
    Type
    Description

    _riverAddress

    address

    Address of River

    hashtag
    pullELFees

    Pulls ETH to the River contract

    Only callable by the River contract

    hashtag
    Parameters

    Name
    Type
    Description

    _maxAmount

    uint256

    The maximum amount to pull into the system

    hashtag
    Events

    hashtag
    SetRiver

    The storage river address has changed

    hashtag
    Parameters

    Name
    Type
    Description

    river indexed

    address

    The new river address

    hashtag
    Errors

    hashtag
    InvalidCall

    The fallback has been triggered

    error InvalidArgument()
    error InvalidCall()
    error InvalidEmptyString()
    error InvalidFee()
    error InvalidZeroAddress()
    error Unauthorized(address caller)
    function getCredentials() external view returns (bytes32)
    function getRiver() external view returns (address)
    function initializeWithdrawV1(address _river) external nonpayable
    function pullEth(uint256 _amount) external nonpayable
    event SetRiver(address river)
    function deposit() external payable
    function depositAndTransfer(address _recipient) external payable
    event UserDeposit(address indexed depositor, address indexed recipient, uint256 amount)
    error EmptyDeposit()
    error InvalidCall()
    error InvalidZeroAddress()
    function initELFeeRecipientV1(address _riverAddress) external nonpayable
    function pullELFees(uint256 _maxAmount) external nonpayable
    event SetRiver(address indexed river)
    error InvalidCall()

    n/a

    n/a

    TLCarrow-up-right

    0xb5Fe6946836D687848B5aBd42dAbF531d5819632arrow-up-right

    n/a

    River (LsETH)arrow-up-right

    0x8c1BEd5b9a0928467c9B1341Da1D7BD5e10b6549arrow-up-right

    0x0CA0c58b1986a55876552E0D9532C963625D5646arrow-up-right

    OperatorsRegistryarrow-up-right

    0x1235f1b60df026B2620e48E735C422425E06b725arrow-up-right

    0x08CC4d7cE071BB80EB30184da96692C312Cfa904arrow-up-right

    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

    hashtag
    Methods

    hashtag
    donate

    Donates ETH to the coverage fund contract

    hashtag
    initCoverageFundV1

    Initialize the coverage fund with the required arguments

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    pullCoverageFunds

    Pulls ETH into the River contract

    Only callable by the River contract

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Donate

    A donation has been made to the coverage fund

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetRiver

    The storage river address has changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    EmptyDonation

    A donation with 0 ETH has been performed

    hashtag
    InvalidCall

    The fallback or receive callback has been triggered

    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.

    hashtag
    Methods

    hashtag
    pause

    Pauses system

    hashtag
    paused

    Retrieves Paused state

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    unpause

    Unpauses system

    hashtag
    Events

    hashtag
    AdminChanged

    Emitted when the admin account has changed.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    BeaconUpgraded

    Emitted when the beacon is changed.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Paused

    The system is now paused

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Unpaused

    The system is now unpaused

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Upgraded

    Emitted when the implementation is upgraded.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    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

    hashtag
    Methods

    hashtag
    getCredentials

    Retrieve the withdrawal credentials to use

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getRiver

    Retrieve the linked River address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initializeWithdrawV1

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    pullEth

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    version

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetRiver

    Emitted when the linked River address is changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    IFirewall

    Figment

    Firewall

    This interface exposes methods to accept calls to admin-level functions of an underlying contract.

    hashtag
    Methods

    IAdministrable

    Alluvial Finance Inc.

    Administrable Interface

    This interface exposes methods to handle the ownership of the contracts

    hashtag
    Methods

    Rewards, Fees, & Socialization

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

    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.

    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.

    ELFeeRecipientV1

    Alluvial Finance Inc.

    Execution Layer Fee Recipient (v1)

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

    hashtag
    Methods

    Oraclearrow-up-right
    0x895a57eD71025D51fe4080530A3489D92E230683arrow-up-right
    0xDb9C7257647169c8F48ddEbB3b30b94e5DF37f78arrow-up-right
    Allowlistarrow-up-right
    0xebc83Bb472b2816Ec5B5de8D34F0eFc9088BB2cearrow-up-right
    0x21504e21Dd31ec7f778DFeFc56A5DBaaa63E5BB4arrow-up-right
    CoverageFundarrow-up-right
    0x32aac358b627b9feaa971cc33304027a41e49a81arrow-up-right
    0x2343A2cF4F4b2109400dBC0143437151b119bFddarrow-up-right
    Withdrawarrow-up-right
    0x0AFd81862eEA47322Cf85Db39D3D07e8A3c25154arrow-up-right
    0x9E6Dd63444Af1568261Bea7bB22aB975fA5a5B41arrow-up-right
    ELFeeRecipientarrow-up-right
    0x7D16d2c4e96BCFC8f815E15b771aC847EcbDB48barrow-up-right
    0xf88d4AD5d6f45ce86952DDc5aACCE5A97501e104arrow-up-right
    RedeemManagerarrow-up-right
    0x080b3a41390b357Ad7e8097644d1DEDf57AD3375arrow-up-right
    0x5d51E82b75A4F16ef677d5bE20d707b6441A00b7arrow-up-right
    WLSETHarrow-up-right
    hashtag
    Protocol Service Fee

    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 Slashing Coverage Treasury, 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).

    hashtag
    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.

    circle-exclamation

    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

    circle-info

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

    hashtag
    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.

    hashtag
    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:

    hashtag
    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.

    hashtag
    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%

    hashtag
    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.

    Conversion Rate
    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

    _riverAddress

    address

    Address of River

    _maxAmount

    uint256

    The maximum amount to pull into the system

    donator indexed

    address

    Address that performed the donation

    amount

    uint256

    The amount donated

    river indexed

    address

    The new river address

    _0

    bool

    Paused state

    previousAdmin

    address

    undefined

    newAdmin

    address

    undefined

    beacon indexed

    address

    undefined

    admin

    address

    The admin at the time of the pause event

    admin

    address

    The admin at the time of the unpause event

    implementation indexed

    address

    undefined

    _0

    bytes32

    The withdrawal credentials

    _0

    address

    The River address

    _river

    address

    The address of the River contract

    _max

    uint256

    undefined

    _0

    string

    Version of the contract

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    river

    address

    The new River address

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    caller

    address

    Address performing the call

    hashtag
    allowExecutor

    Sets the permission for a function selector

    hashtag
    Parameters

    Name
    Type
    Description

    _functionSelector

    bytes4

    Method signature on which the permission is changed

    _executorCanCall

    bool

    True if selector is callable by the executor

    hashtag
    destination

    Retrieve the destination address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The destination address

    hashtag
    executor

    Retrieve the executor address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The executor address

    hashtag
    executorCanCall

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

    hashtag
    Parameters

    Name
    Type
    Description

    _selector

    bytes4

    The selector to verify

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if executor is allowed to call

    hashtag
    setExecutor

    Sets the executor address

    hashtag
    Parameters

    Name
    Type
    Description

    _newExecutor

    address

    New address for the executor

    hashtag
    Events

    hashtag
    SetDestination

    The stored destination address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    destination indexed

    address

    The new destination address

    hashtag
    SetExecutor

    The stored executor address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    executor indexed

    address

    The new executor address

    hashtag
    SetExecutorPermissions

    The storage permission for a selector has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    selector

    bytes4

    The 4 bytes method selector

    status

    bool

    True if executor is allowed

    hashtag
    acceptAdmin

    Accept the transfer of ownership

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

    hashtag
    getAdmin

    Retrieves the current admin address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The admin address

    hashtag
    getPendingAdmin

    Retrieve the current pending admin address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The pending admin address

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    _newAdmin

    address

    New admin address

    hashtag
    Events

    hashtag
    SetAdmin

    The admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    admin indexed

    address

    New admin address

    hashtag
    SetPendingAdmin

    The pending admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    pendingAdmin indexed

    address

    New pending admin address

    hashtag
    initELFeeRecipientV1

    Initialize the fee recipient with the required arguments

    hashtag
    Parameters

    Name
    Type
    Description

    _riverAddress

    address

    Address of River

    hashtag
    pullELFees

    Pulls ETH to the River contract

    Only callable by the River contract

    hashtag
    Parameters

    Name
    Type
    Description

    _maxAmount

    uint256

    The maximum amount to pull into the system

    hashtag
    version

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    Version of the contract

    hashtag
    Events

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    hashtag
    SetRiver

    The storage river address has changed

    hashtag
    Parameters

    Name
    Type
    Description

    river indexed

    address

    The new river address

    hashtag
    Errors

    hashtag
    InvalidCall

    The fallback has been triggered

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    caller

    address

    Address performing the call

    function donate() external payable
    function initCoverageFundV1(address _riverAddress) external nonpayable
    function pullCoverageFunds(uint256 _maxAmount) external nonpayable
    event Donate(address indexed donator, uint256 amount)
    event SetRiver(address indexed river)
    error EmptyDonation()
    error InvalidCall()
    function pause() external nonpayable
    function paused() external view returns (bool)
    function unpause() external nonpayable
    event AdminChanged(address previousAdmin, address newAdmin)
    event BeaconUpgraded(address indexed beacon)
    event Paused(address admin)
    event Unpaused(address admin)
    event Upgraded(address indexed implementation)
    error CallWhenPaused()
    function getCredentials() external view returns (bytes32)
    function getRiver() external view returns (address)
    function initializeWithdrawV1(address _river) external nonpayable
    function pullEth(uint256 _max) external nonpayable
    function version() external pure returns (string)
    event Initialize(uint256 version, bytes cdata)
    event SetRiver(address river)
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    error InvalidZeroAddress()
    error Unauthorized(address caller)
    function allowExecutor(bytes4 _functionSelector, bool _executorCanCall) external nonpayable
    function destination() external view returns (address)
    function executor() external view returns (address)
    function executorCanCall(bytes4 _selector) external view returns (bool)
    function setExecutor(address _newExecutor) external nonpayable
    event SetDestination(address indexed destination)
    event SetExecutor(address indexed executor)
    event SetExecutorPermissions(bytes4 selector, bool status)
    function acceptAdmin() external nonpayable
    function getAdmin() external view returns (address)
    function getPendingAdmin() external view returns (address)
    function proposeAdmin(address _newAdmin) external nonpayable
    event SetAdmin(address indexed admin)
    event SetPendingAdmin(address indexed pendingAdmin)
    function initELFeeRecipientV1(address _riverAddress) external nonpayable
    function pullELFees(uint256 _maxAmount) external nonpayable
    function version() external pure returns (string)
    event Initialize(uint256 version, bytes cdata)
    event SetRiver(address indexed river)
    error InvalidCall()
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    error InvalidZeroAddress()
    error Unauthorized(address caller)

    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.

    hashtag
    Methods

    hashtag
    donate

    Donates ETH to the coverage fund contract

    hashtag
    initCoverageFundV1

    Initialize the coverage fund with the required arguments

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    pullCoverageFunds

    Pulls ETH into the River contract

    Only callable by the River contract

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    version

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Donate

    A donation has been made to the coverage fund

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetRiver

    The storage river address has changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    EmptyDonation

    A donation with 0 ETH has been performed

    hashtag
    InvalidCall

    The fallback or receive callback has been triggered

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    Administrable

    Alluvial Finance Inc.

    Administrable

    This contract handles the administration of the contracts

    hashtag
    Methods

    hashtag
    acceptAdmin

    Accept the transfer of ownership

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

    hashtag
    getAdmin

    Retrieves the current admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getPendingAdmin

    Retrieve the current pending admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    SetAdmin

    The admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetPendingAdmin

    The pending admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    IConsensusLayerDepositManagerV1

    Alluvial Finance Inc.

    Consensys Layer Deposit Manager Interface (v1)

    This interface exposes methods to handle the interactions with the official deposit contract

    hashtag
    Methods

    _riverAddress

    address

    Address of River

    _maxAmount

    uint256

    The maximum amount to pull into the system

    _0

    string

    Version of the contract

    donator indexed

    address

    Address that performed the donation

    amount

    uint256

    The amount donated

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    river indexed

    address

    The new river address

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    caller

    address

    Address performing the call

    _0

    address

    The admin address

    _0

    address

    The pending admin address

    _newAdmin

    address

    New admin address

    admin indexed

    address

    New admin address

    pendingAdmin indexed

    address

    New pending admin address

    caller

    address

    Address performing the call

    hashtag
    depositToConsensusLayerWithDepositRoot

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

    hashtag
    Parameters

    Name
    Type
    Description

    _maxCount

    uint256

    The maximum amount of validator keys to fund

    _depositRoot

    bytes32

    The root of the deposit tree

    hashtag
    getBalanceToDeposit

    Returns the amount of ETH not yet committed for deposit

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The amount of ETH not yet committed for deposit

    hashtag
    getCommittedBalance

    Returns the amount of ETH committed for deposit

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The amount of ETH committed for deposit

    hashtag
    getDepositedValidatorCount

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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The deposited validator count

    hashtag
    getKeeper

    Get the keeper address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The keeper address

    hashtag
    getWithdrawalCredentials

    Retrieve the withdrawal credentials

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bytes32

    The withdrawal credentials

    hashtag
    Events

    hashtag
    SetDepositContractAddress

    The stored deposit contract address changed

    hashtag
    Parameters

    Name
    Type
    Description

    depositContract indexed

    address

    Address of the deposit contract

    hashtag
    SetDepositedValidatorCount

    Emitted when the deposited validator count is updated

    hashtag
    Parameters

    Name
    Type
    Description

    oldDepositedValidatorCount

    uint256

    The old deposited validator count value

    newDepositedValidatorCount

    uint256

    The new deposited validator count value

    hashtag
    SetWithdrawalCredentials

    The stored withdrawal credentials changed

    hashtag
    Parameters

    Name
    Type
    Description

    withdrawalCredentials

    bytes32

    The withdrawal credentials to use for deposits

    hashtag
    Errors

    hashtag
    ErrorOnDeposit

    An error occurred during the deposit

    hashtag
    InconsistentPublicKeys

    The length of the BLS Public key is invalid during deposit

    hashtag
    InconsistentSignatures

    The length of the BLS Signature is invalid during deposit

    hashtag
    InvalidDepositRoot

    Invalid deposit root

    hashtag
    InvalidPublicKeyCount

    The received count of public keys to deposit is invalid

    hashtag
    InvalidSignatureCount

    The received count of signatures to deposit is invalid

    hashtag
    InvalidWithdrawalCredentials

    The withdrawal credentials value is null

    hashtag
    NoAvailableValidatorKeys

    The internal key retrieval returned no keys

    hashtag
    NotEnoughFunds

    Not enough funds to deposit one validator

    hashtag
    OnlyKeeper

    function donate() external payable
    function initCoverageFundV1(address _riverAddress) external nonpayable
    function pullCoverageFunds(uint256 _maxAmount) external nonpayable
    function version() external pure returns (string)
    event Donate(address indexed donator, uint256 amount)
    event Initialize(uint256 version, bytes cdata)
    event SetRiver(address indexed river)
    error EmptyDonation()
    error InvalidCall()
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    error InvalidZeroAddress()
    error Unauthorized(address caller)
    function acceptAdmin() external nonpayable
    function getAdmin() external view returns (address)
    function getPendingAdmin() external view returns (address)
    function proposeAdmin(address _newAdmin) external nonpayable
    event SetAdmin(address indexed admin)
    event SetPendingAdmin(address indexed pendingAdmin)
    error InvalidZeroAddress()
    error Unauthorized(address caller)
    function depositToConsensusLayerWithDepositRoot(uint256 _maxCount, bytes32 _depositRoot) external nonpayable
    function getBalanceToDeposit() external view returns (uint256)
    function getCommittedBalance() external view returns (uint256)
    function getDepositedValidatorCount() external view returns (uint256)
    function getKeeper() external view returns (address)
    function getWithdrawalCredentials() external view returns (bytes32)
    event SetDepositContractAddress(address indexed depositContract)
    event SetDepositedValidatorCount(uint256 oldDepositedValidatorCount, uint256 newDepositedValidatorCount)
    event SetWithdrawalCredentials(bytes32 withdrawalCredentials)
    error ErrorOnDeposit()
    error InconsistentPublicKeys()
    error InconsistentSignatures()
    error InvalidDepositRoot()
    error InvalidPublicKeyCount()
    error InvalidSignatureCount()
    error InvalidWithdrawalCredentials()
    error NoAvailableValidatorKeys()
    error NotEnoughFunds()
    error OnlyKeeper()

    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.

    hashtag

    Methods

    hashtag
    DEPOSIT_SIZE

    Size of a deposit in ETH

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    PUBLIC_KEY_LENGTH

    Size of a BLS Public key in bytes

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    SIGNATURE_LENGTH

    Size of a BLS Signature in bytes

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    depositToConsensusLayerWithDepositRoot

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

    hashtag
    Parameters

    Name
    Type
    Description

    _maxCount

    uint256

    The maximum amount of validator keys to fund

    _depositRoot

    bytes32

    The root of the deposit tree

    hashtag
    getBalanceToDeposit

    Returns the amount of ETH not yet committed for deposit

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The amount of ETH not yet committed for deposit

    hashtag
    getCommittedBalance

    Returns the amount of ETH committed for deposit

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The amount of ETH committed for deposit

    hashtag
    getDepositedValidatorCount

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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The deposited validator count

    hashtag
    getKeeper

    Get the keeper address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The keeper address

    hashtag
    getWithdrawalCredentials

    Retrieve the withdrawal credentials

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bytes32

    The withdrawal credentials

    hashtag
    Events

    hashtag
    SetDepositContractAddress

    The stored deposit contract address changed

    hashtag
    Parameters

    Name
    Type
    Description

    depositContract indexed

    address

    Address of the deposit contract

    hashtag
    SetDepositedValidatorCount

    Emitted when the deposited validator count is updated

    hashtag
    Parameters

    Name
    Type
    Description

    oldDepositedValidatorCount

    uint256

    The old deposited validator count value

    newDepositedValidatorCount

    uint256

    The new deposited validator count value

    hashtag
    SetWithdrawalCredentials

    The stored withdrawal credentials changed

    hashtag
    Parameters

    Name
    Type
    Description

    withdrawalCredentials

    bytes32

    The withdrawal credentials to use for deposits

    hashtag
    Errors

    hashtag
    ErrorOnDeposit

    An error occurred during the deposit

    hashtag
    InconsistentPublicKeys

    The length of the BLS Public key is invalid during deposit

    hashtag
    InconsistentSignatures

    The length of the BLS Signature is invalid during deposit

    hashtag
    InvalidDepositRoot

    Invalid deposit root

    hashtag
    InvalidPublicKeyCount

    The received count of public keys to deposit is invalid

    hashtag
    InvalidSignatureCount

    The received count of signatures to deposit is invalid

    hashtag
    InvalidWithdrawalCredentials

    The withdrawal credentials value is null

    hashtag
    NoAvailableValidatorKeys

    The internal key retrieval returned no keys

    hashtag
    NotEnoughFunds

    Not enough funds to deposit one validator

    hashtag
    OnlyKeeper

    hashtag
    SliceOutOfBounds

    The slice is outside of the initial bytes bounds

    hashtag
    SliceOverflow

    The length overflows an uint

    function DEPOSIT_SIZE() external view returns (uint256)
    function PUBLIC_KEY_LENGTH() external view returns (uint256)
    function SIGNATURE_LENGTH() external view returns (uint256)
    function depositToConsensusLayerWithDepositRoot(uint256 _maxCount, bytes32 _depositRoot) external nonpayable
    function getBalanceToDeposit() external view returns (uint256)
    function getCommittedBalance() external view returns (uint256)
    function getDepositedValidatorCount() external view returns (uint256)
    function getKeeper() external view returns (address)
    function getWithdrawalCredentials() external view returns (bytes32)
    event SetDepositContractAddress(address indexed depositContract)
    event SetDepositedValidatorCount(uint256 oldDepositedValidatorCount, uint256 newDepositedValidatorCount)
    event SetWithdrawalCredentials(bytes32 withdrawalCredentials)
    error ErrorOnDeposit()
    error InconsistentPublicKeys()
    error InconsistentSignatures()
    error InvalidDepositRoot()
    error InvalidPublicKeyCount()
    error InvalidSignatureCount()
    error InvalidWithdrawalCredentials()
    error NoAvailableValidatorKeys()
    error NotEnoughFunds()
    error OnlyKeeper()
    error SliceOutOfBounds()
    error SliceOverflow()

    IAllowlistV1

    Alluvial Finance Inc.

    Allowlist Interface (v1)

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

    hashtag
    Methods

    hashtag
    getAllower

    Retrieves the allower address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The address of the allower

    hashtag
    getDenier

    Retrieves the denier address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The address of the denier

    hashtag
    getPermissions

    This method retrieves the raw permission value

    hashtag
    Parameters

    Name
    Type
    Description

    _account

    address

    Recipient to verify

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The raw permissions value of the account

    hashtag
    hasPermission

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

    hashtag
    Parameters

    Name
    Type
    Description

    _account

    address

    Recipient to verify

    _mask

    uint256

    Combination of permissions to verify

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if mask is respected

    hashtag
    initAllowlistV1

    Initializes the allowlist

    hashtag
    Parameters

    Name
    Type
    Description

    _admin

    address

    Address of the Allowlist administrator

    _allower

    address

    Address of the allower

    hashtag
    initAllowlistV1_1

    Initializes the allowlist denier

    hashtag
    Parameters

    Name
    Type
    Description

    _denier

    address

    Address of the denier

    hashtag
    isAllowed

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

    hashtag
    Parameters

    Name
    Type
    Description

    _account

    address

    Recipient to verify

    _mask

    uint256

    Combination of permissions to verify

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if mask is respected and user is allowed

    hashtag
    isDenied

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

    hashtag
    Parameters

    Name
    Type
    Description

    _account

    address

    Recipient to verify

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if user is denied access

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    _account

    address

    Recipient to verify

    _mask

    uint256

    Combination of permissions to verify

    hashtag
    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).

    hashtag
    Parameters

    Name
    Type
    Description

    _accounts

    address[]

    Accounts to update

    _permissions

    uint256[]

    New permission values

    hashtag
    setAllower

    Changes the allower address

    hashtag
    Parameters

    Name
    Type
    Description

    _newAllowerAddress

    address

    New address allowed to edit the allowlist

    hashtag
    setDenier

    Changes the denier address

    hashtag
    Parameters

    Name
    Type
    Description

    _newDenierAddress

    address

    New address allowed to edit the allowlist

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    _accounts

    address[]

    Accounts to update

    _permissions

    uint256[]

    New permission values

    hashtag
    Events

    hashtag
    SetAllower

    The stored allower address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    allower indexed

    address

    The new allower address

    hashtag
    SetAllowlistPermissions

    The permissions of several accounts have changed

    hashtag
    Parameters

    Name
    Type
    Description

    accounts

    address[]

    List of accounts

    permissions

    uint256[]

    New permissions for each account at the same index

    hashtag
    SetDenier

    The stored denier address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    denier indexed

    address

    The new denier address

    hashtag
    Errors

    hashtag
    AttemptToRemoveDenyPermission

    Allower can't remove deny permission

    hashtag
    AttemptToSetDenyPermission

    Allower can't set deny permission

    hashtag
    Denied

    The account is denied access

    hashtag
    Parameters

    Name
    Type
    Description

    _account

    address

    The denied account

    hashtag
    InvalidCount

    The provided accounts list is empty

    hashtag
    MismatchedArrayLengths

    The provided accounts and permissions list have different lengths

    function getAllower() external view returns (address)
    function getDenier() external view returns (address)
    function getPermissions(address _account) external view returns (uint256)
    function hasPermission(address _account, uint256 _mask) external view returns (bool)
    function initAllowlistV1(address _admin, address _allower) external nonpayable
    function initAllowlistV1_1(address _denier) external nonpayable
    function isAllowed(address _account, uint256 _mask) external view returns (bool)
    function isDenied(address _account) external view returns (bool)
    function onlyAllowed(address _account, uint256 _mask) external view
    function setAllowPermissions(address[] _accounts, uint256[] _permissions) external nonpayable
    function setAllower(address _newAllowerAddress) external nonpayable
    function setDenier(address _newDenierAddress) external nonpayable
    function setDenyPermissions(address[] _accounts, uint256[] _permissions) external nonpayable
    event SetAllower(address indexed allower)
    event SetAllowlistPermissions(address[] accounts, uint256[] permissions)
    event SetDenier(address indexed denier)
    error AttemptToRemoveDenyPermission()
    error AttemptToSetDenyPermission()
    error Denied(address _account)
    error InvalidCount()
    error MismatchedArrayLengths()

    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.

    hashtag
    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

    hashtag
    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

    hashtag
    Oracle Daemon

    hashtag
    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.

    hashtag
    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

    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.

    circle-exclamation

    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.)

    hashtag
    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.)

    hashtag
    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.

    hashtag
    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

    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

    hashtag
    Guidelines

    hashtag
    Protocol onboarding

    hashtag
    Generate Oracle member wallet

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

    triangle-exclamation

    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.

    hashtag
    Submit Oracle member

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

    hashtag
    On-going operations

    circle-exclamation

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

    hashtag
    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:

    hashtag
    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.

    circle-exclamation

    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.

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

    hashtag
    Oracle Daemon Command

    hashtag
    Monitoring and Metrics

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

    • /live Liveness endpoint

    • /ready Readiness endpoint

    • /metrics

    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.

    circle-info

    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 .

    IUserDepositManagerV1

    Alluvial Finance Inc.

    User Deposit Manager (v1)

    This interface exposes methods to handle the inbound transfers cases or the explicit submissions

    hashtag
    Methods

    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

    to call the Oracle contract for the next epoch to report

  • Ethereum Consensus Layer HTTP endpoint

    • to query validator data

  • the quorum is 3
  • all operators use an implementation which alternates submissions order

  • Oracle Operators are responsible for paying for the gas implied by the report transaction.
    Prometheus metrics
    hashtag
    deposit

    Explicit deposit method to mint on msg.sender

    hashtag
    depositAndTransfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    _recipient

    address

    Address receiving the minted LsETH

    hashtag
    Events

    hashtag
    UserDeposit

    User deposited ETH in the system

    hashtag
    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

    hashtag
    Errors

    hashtag
    EmptyDeposit

    And empty deposit attempt was made

    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 deposit() external payable
    function depositAndTransfer(address _recipient) external payable
    event UserDeposit(address indexed depositor, address indexed recipient, uint256 amount)
    error EmptyDeposit()
    hashtag
    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

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

    hashtag
    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.

    Name

    Owner

    Role

    Activation Queue

    Ethereum Consensus Protocol

    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 .

    Exit Queue

    Ethereum Consensus Protocol

    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 .

    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.

    hashtag
    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.

    hashtag
    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

    circle-info

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

    hashtag
    Interface level smart contract flow

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

    circle-info

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

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

    hashtag
    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.

    circle-exclamation

    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.

    hashtag
    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.

    hashtag
    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.

    • 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 Ethereum’s exit queue timelinearrow-up-right.

    • 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.

    • When a redemption request is submitted by calling the requestRedeem function, a redeem request id is returned by either using the Alluvial /redeems endpointarrow-up-right or subscribing to RequestedRedeem events.

    • 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.

    hashtag
    Interface level smart contract flow

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

    circle-info

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

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

    hashtag
    Redeem status matrix

    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.

    Platforms can learn more about this process in the Platform redemption guidearrow-up-right

    hashtag
    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

    circle-info

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

    hashtag
    Interface level smart contract flow

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

    circle-info

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

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

    exit queue and withdraw queue times herearrow-up-right

    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.

    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.

    Slashing Coverage Programarrow-up-right
    herearrow-up-right
    herearrow-up-right
    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

    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

    hashtag
    Methods

    hashtag
    acceptAdmin

    Accept the transfer of ownership

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

    hashtag
    getAdmin

    Retrieves the current admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getAllower

    Retrieves the allower address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getDenier

    Retrieves the denier address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getPendingAdmin

    Retrieve the current pending admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getPermissions

    This method retrieves the raw permission value

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    hasPermission

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initAllowlistV1

    Initializes the allowlist

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    initAllowlistV1_1

    Initializes the allowlist denier

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    isAllowed

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    isDenied

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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).

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setAllower

    Changes the allower address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setDenier

    Changes the denier address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    version

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetAdmin

    The admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetAllower

    The stored allower address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetAllowlistPermissions

    The permissions of several accounts have changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetDenier

    The stored denier address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetPendingAdmin

    The pending admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    AttemptToRemoveDenyPermission

    Allower can't remove deny permission

    hashtag
    AttemptToSetDenyPermission

    Allower can't set deny permission

    hashtag
    Denied

    The account is denied access

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidCount

    The provided accounts list is empty

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    MismatchedArrayLengths

    The provided accounts and permissions list have different lengths

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    SharesManagerV1

    Alluvial Finance Inc.

    Shares Manager (v1)

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

    hashtag
    Methods

    IOracleManagerV1

    Alluvial Finance Inc.

    Oracle Manager (v1)

    This interface exposes methods to handle the inputs provided by the oracle

    hashtag
    Methods

    IERC20VestableVotesUpgradeableV1

    Alluvial Finance Inc.

    ERC20 Vestable Votes Upgradeable Interface(v1)

    This interface exposes methods to manage vestings

    hashtag
    Methods

    _0

    address

    The admin address

    _0

    address

    The address of the allower

    _0

    address

    The address of the denier

    _0

    address

    The pending admin address

    _account

    address

    Recipient to verify

    _0

    uint256

    The raw permissions value of the account

    _account

    address

    Recipient to verify

    _mask

    uint256

    Combination of permissions to verify

    _0

    bool

    True if mask is respected

    _admin

    address

    Address of the Allowlist administrator

    _allower

    address

    Address of the allower

    _denier

    address

    Address of the denier

    _account

    address

    Recipient to verify

    _mask

    uint256

    Combination of permissions to verify

    _0

    bool

    True if mask is respected and user is allowed

    _account

    address

    Recipient to verify

    _0

    bool

    True if user is denied access

    _account

    address

    Recipient to verify

    _mask

    uint256

    Combination of permissions to verify

    _newAdmin

    address

    New admin address

    _accounts

    address[]

    Accounts to update

    _permissions

    uint256[]

    New permission values

    _newAllowerAddress

    address

    New address allowed to edit the allowlist

    _newDenierAddress

    address

    New address allowed to edit the allowlist

    _accounts

    address[]

    Accounts to update

    _permissions

    uint256[]

    New permission values

    _0

    string

    Version of the contract

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    admin indexed

    address

    New admin address

    allower indexed

    address

    The new allower address

    accounts

    address[]

    List of accounts

    permissions

    uint256[]

    New permissions for each account at the same index

    denier indexed

    address

    The new denier address

    pendingAdmin indexed

    address

    New pending admin address

    _account

    address

    The denied account

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    caller

    address

    Address performing the call

    function acceptAdmin() external nonpayable
    function getAdmin() external view returns (address)
    function getAllower() external view returns (address)
    function getDenier() external view returns (address)
    function getPendingAdmin() external view returns (address)
    function getPermissions(address _account) external view returns (uint256)
    function hasPermission(address _account, uint256 _mask) external view returns (bool)
    function initAllowlistV1(address _admin, address _allower) external nonpayable
    function initAllowlistV1_1(address _denier) external nonpayable
    function isAllowed(address _account, uint256 _mask) external view returns (bool)
    function isDenied(address _account) external view returns (bool)
    function onlyAllowed(address _account, uint256 _mask) external view
    function proposeAdmin(address _newAdmin) external nonpayable
    function setAllowPermissions(address[] _accounts, uint256[] _permissions) external nonpayable
    function setAllower(address _newAllowerAddress) external nonpayable
    function setDenier(address _newDenierAddress) external nonpayable
    function setDenyPermissions(address[] _accounts, uint256[] _permissions) external nonpayable
    function version() external pure returns (string)
    event Initialize(uint256 version, bytes cdata)
    event SetAdmin(address indexed admin)
    event SetAllower(address indexed allower)
    event SetAllowlistPermissions(address[] accounts, uint256[] permissions)
    event SetDenier(address indexed denier)
    event SetPendingAdmin(address indexed pendingAdmin)
    error AttemptToRemoveDenyPermission()
    error AttemptToSetDenyPermission()
    error Denied(address _account)
    error InvalidCount()
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    error InvalidZeroAddress()
    error MismatchedArrayLengths()
    error Unauthorized(address caller)
    hashtag
    allowance

    Retrieve the allowance value for a spender

    hashtag
    Parameters

    Name
    Type
    Description

    _owner

    address

    Address that issued the allowance

    _spender

    address

    Address that received the allowance

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The allowance in shares for a given spender

    hashtag
    approve

    Approves an account for future spendings

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

    hashtag
    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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    balanceOf

    Retrieve the balance of an account

    hashtag
    Parameters

    Name
    Type
    Description

    _owner

    address

    Address to be checked

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The balance of the account in shares

    hashtag
    balanceOfUnderlying

    Retrieve the underlying asset balance of an account

    hashtag
    Parameters

    Name
    Type
    Description

    _owner

    address

    Address to be checked

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The underlying balance of the account

    hashtag
    decimals

    Retrieve the decimal count

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint8

    The decimal count

    hashtag
    decreaseAllowance

    Decrease allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    _spender

    address

    Spender that receives the allowance

    _subtractableValue

    uint256

    Amount of shares to subtract

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    increaseAllowance

    Increase allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    _spender

    address

    Spender that receives the allowance

    _additionalValue

    uint256

    Amount of shares to add

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    name

    Retrieve the token name

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    The token name

    hashtag
    sharesFromUnderlyingBalance

    Retrieve the shares count from an underlying asset amount

    hashtag
    Parameters

    Name
    Type
    Description

    _underlyingAssetAmount

    uint256

    Amount of underlying asset to convert

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The amount of shares worth the underlying asset amount

    hashtag
    symbol

    Retrieve the token symbol

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    The token symbol

    hashtag
    totalSupply

    Retrieve the total token supply

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The total supply in shares

    hashtag
    totalUnderlyingSupply

    Retrieve the total underlying asset supply

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The total underlying asset supply

    hashtag
    transfer

    Performs a transfer from the message sender to the provided account

    hashtag
    Parameters

    Name
    Type
    Description

    _to

    address

    Address receiving the tokens

    _value

    uint256

    Amount of shares to be sent

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    transferFrom

    Performs a transfer between two recipients

    hashtag
    Parameters

    Name
    Type
    Description

    _from

    address

    Address sending the tokens

    _to

    address

    Address receiving the tokens

    _value

    uint256

    Amount of shares to be sent

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    underlyingBalanceFromShares

    Retrieve the underlying asset balance from an amount of shares

    hashtag
    Parameters

    Name
    Type
    Description

    _shares

    uint256

    Amount of shares to convert

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The underlying asset balance represented by the shares

    hashtag
    Events

    hashtag
    Approval

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

    hashtag
    Parameters

    Name
    Type
    Description

    owner indexed

    address

    undefined

    spender indexed

    address

    undefined

    value

    uint256

    undefined

    hashtag
    SetTotalSupply

    Emitted when the total supply is changed

    hashtag
    Parameters

    Name
    Type
    Description

    totalSupply

    uint256

    undefined

    hashtag
    Transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    from indexed

    address

    undefined

    to indexed

    address

    undefined

    value

    uint256

    undefined

    hashtag
    Errors

    hashtag
    AllowanceTooLow

    Allowance too low to perform operation

    hashtag
    Parameters

    Name
    Type
    Description

    _from

    address

    Account where funds are sent from

    _operator

    address

    Account attempting the transfer

    _allowance

    uint256

    Current allowance

    _value

    uint256

    hashtag
    BalanceTooLow

    Balance too low to perform operation

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    NullTransfer

    Invalid empty transfer

    hashtag
    UnauthorizedTransfer

    Invalid transfer recipients

    hashtag
    Parameters

    Name
    Type
    Description

    _from

    address

    Account sending the funds in the invalid transfer

    _to

    address

    Account receiving the funds in the invalid transfer

    hashtag
    getCLSpec

    Retrieve the current cl spec

    hashtag
    Returns

    Name
    Type
    Description

    _0

    CLSpec.CLSpecStruct

    The Consensus Layer Specification

    hashtag
    getCLValidatorCount

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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The CL validator count

    hashtag
    getCLValidatorTotalBalance

    Get CL validator total balance

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The CL Validator total balance

    hashtag
    getCurrentEpochId

    Retrieve the current epoch id based on block timestamp

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The current epoch id

    hashtag
    getCurrentFrame

    Retrieve the current frame details

    hashtag
    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

    hashtag
    getExpectedEpochId

    Retrieve expected epoch id

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The current expected epoch id

    hashtag
    getFrameFirstEpochId

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

    hashtag
    Parameters

    Name
    Type
    Description

    _epochId

    uint256

    Epoch id used to get the frame

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

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

    hashtag
    getLastCompletedEpochId

    Retrieve the last completed epoch id

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The last completed epoch id

    hashtag
    getLastConsensusLayerReport

    Retrieve the last consensus layer report

    hashtag
    Returns

    Name
    Type
    Description

    _0

    IOracleManagerV1.StoredConsensusLayerReport

    The stored consensus layer report

    hashtag
    getOracle

    Get oracle address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The oracle address

    hashtag
    getReportBounds

    Retrieve the report bounds

    hashtag
    Returns

    Name
    Type
    Description

    _0

    ReportBounds.ReportBoundsStruct

    The report bounds

    hashtag
    getTime

    Retrieve the block timestamp

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The current timestamp from the EVM context

    hashtag
    isValidEpoch

    Verifies if the provided epoch is valid

    hashtag
    Parameters

    Name
    Type
    Description

    epoch

    uint256

    The epoch to lookup

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if valid

    hashtag
    setCLSpec

    hashtag
    Parameters

    Name
    Type
    Description

    _newValue

    CLSpec.CLSpecStruct

    undefined

    hashtag
    setConsensusLayerData

    hashtag
    Parameters

    Name
    Type
    Description

    _report

    IOracleManagerV1.ConsensusLayerReport

    undefined

    hashtag
    setOracle

    Set the oracle address

    hashtag
    Parameters

    Name
    Type
    Description

    _oracleAddress

    address

    Address of the oracle

    hashtag
    setReportBounds

    hashtag
    Parameters

    Name
    Type
    Description

    _newValue

    ReportBounds.ReportBoundsStruct

    undefined

    hashtag
    Events

    hashtag
    ConsensusLayerDataUpdate

    The consensus layer data provided by the oracle has been updated

    hashtag
    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

    hashtag
    ProcessedConsensusLayerReport

    The provided report has been processed

    hashtag
    Parameters

    Name
    Type
    Description

    report

    IOracleManagerV1.ConsensusLayerReport

    The report that was provided

    trace

    IOracleManagerV1.ConsensusLayerDataReportingTrace

    The trace structure providing more insights on internals

    hashtag
    SetBounds

    The Report Bounds are changed

    hashtag
    Parameters

    Name
    Type
    Description

    annualAprUpperBound

    uint256

    The reporting upper bound

    relativeLowerBound

    uint256

    The reporting lower bound

    hashtag
    SetOracle

    The stored oracle address changed

    hashtag
    Parameters

    Name
    Type
    Description

    oracleAddress indexed

    address

    The new oracle address

    hashtag
    SetSpec

    The Consensus Layer Spec is changed

    hashtag
    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

    hashtag
    Errors

    hashtag
    InvalidDecreasingValidatorsExitedBalance

    The total exited balance decreased

    hashtag
    Parameters

    Name
    Type
    Description

    currentValidatorsExitedBalance

    uint256

    The current exited balance

    newValidatorsExitedBalance

    uint256

    The new exited balance

    hashtag
    InvalidDecreasingValidatorsSkimmedBalance

    The total skimmed balance decreased

    hashtag
    Parameters

    Name
    Type
    Description

    currentValidatorsSkimmedBalance

    uint256

    The current exited balance

    newValidatorsSkimmedBalance

    uint256

    The new exited balance

    hashtag
    InvalidEpoch

    Thrown when an invalid epoch was reported

    hashtag
    Parameters

    Name
    Type
    Description

    epoch

    uint256

    Invalid epoch

    hashtag
    InvalidValidatorCountReport

    The reported validator count is invalid

    hashtag
    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

    hashtag
    TotalValidatorBalanceDecreaseOutOfBound

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

    hashtag
    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

    hashtag
    TotalValidatorBalanceIncreaseOutOfBound

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

    hashtag
    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

    hashtag
    computeVestingReleasableAmount

    Computes the releasable amount of tokens for a vesting schedule.

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    amount of releasable tokens

    hashtag
    computeVestingVestedAmount

    Computes the vested amount of tokens for a vesting schedule.

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    amount of vested tokens

    hashtag
    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.

    hashtag
    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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    index of the created vesting schedule

    hashtag
    delegateVestingEscrow

    Delegate vesting escrowed tokens

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    index of the vesting schedule

    _delegatee

    address

    address to delegate the token to

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True on success

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    VestingSchedulesV2.VestingSchedule

    undefined

    hashtag
    getVestingScheduleCount

    Get count of vesting schedules

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    count of vesting schedules

    hashtag
    isGlobalUnlockedScheduleIgnored

    Get vesting global unlock schedule activation status for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    true if the vesting schedule should ignore the global unlock schedule

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule to release

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    released amount

    hashtag
    revokeVestingSchedule

    Revoke vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule to revoke

    _end

    uint64

    End date for the schedule

    hashtag
    Returns

    Name
    Type
    Description

    returnedAmount

    uint256

    amount returned to the vesting schedule creator

    hashtag
    vestingEscrow

    Get the address of the escrow for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    address of the escrow

    hashtag
    Events

    hashtag
    CreatedVestingSchedule

    A new vesting schedule has been created

    hashtag
    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

    hashtag
    DelegatedVestingEscrow

    Vesting escrow has been delegated

    hashtag
    Parameters

    Name
    Type
    Description

    index

    uint256

    Vesting schedule index

    oldDelegatee indexed

    address

    old delegatee

    newDelegatee indexed

    address

    new delegatee

    beneficiary indexed

    address

    hashtag
    ReleasedVestingSchedule

    Vesting schedule has been released

    hashtag
    Parameters

    Name
    Type
    Description

    index

    uint256

    Vesting schedule index

    releasedAmount

    uint256

    Amount of tokens released to the beneficiary

    hashtag
    RevokedVestingSchedule

    Vesting schedule has been revoked

    hashtag
    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

    hashtag
    Errors

    hashtag
    GlobalUnlockUnderlfow

    Underflow in global unlock logic (should never happen)

    hashtag
    InvalidRevokedVestingScheduleEnd

    Attempt to revoke a vesting schedule with an invalid end parameter

    hashtag
    InvalidVestingScheduleParameter

    Invalid parameter for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    msg

    string

    undefined

    hashtag
    UnsufficientVestingScheduleCreatorBalance

    Vesting schedule creator has unsufficient balance to create vesting schedule

    hashtag
    VestingScheduleIsLocked

    The vesting schedule is locked

    hashtag
    VestingScheduleNotRevocable

    The vesting schedule is not revocable

    hashtag
    VestingScheduleNotRevocableInPast

    Attempt to revoke a schedule in the past

    hashtag
    ZeroReleasableAmount

    No token to release

    ISharesManagerV1

    Alluvial Finance Inc.

    Shares Manager Interface (v1)

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

    hashtag
    Methods

    hashtag
    allowance

    Retrieve the allowance value for a spender

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    approve

    Approves an account for future spendings

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    balanceOf

    Retrieve the balance of an account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    balanceOfUnderlying

    Retrieve the underlying asset balance of an account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    decimals

    Retrieve the decimal count

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    decreaseAllowance

    Decrease allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    increaseAllowance

    Increase allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    name

    Retrieve the token name

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    sharesFromUnderlyingBalance

    Retrieve the shares count from an underlying asset amount

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    symbol

    Retrieve the token symbol

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    totalSupply

    Retrieve the total token supply

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    totalUnderlyingSupply

    Retrieve the total underlying asset supply

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transfer

    Performs a transfer from the message sender to the provided account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transferFrom

    Performs a transfer between two recipients

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    underlyingBalanceFromShares

    Retrieve the underlying asset balance from an amount of shares

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Approval

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetTotalSupply

    Emitted when the total supply is changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    AllowanceTooLow

    Allowance too low to perform operation

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    BalanceTooLow

    Balance too low to perform operation

    hashtag
    NullTransfer

    Invalid empty transfer

    hashtag
    UnauthorizedTransfer

    Invalid transfer recipients

    hashtag
    Parameters

    Name
    Type
    Description

    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.

    hashtag
    Methods

    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.

    hashtag
    Methods

    function allowance(address _owner, address _spender) external view returns (uint256)
    function approve(address _spender, uint256 _value) external nonpayable returns (bool)
    function balanceOf(address _owner) external view returns (uint256)
    function balanceOfUnderlying(address _owner) external view returns (uint256)
    function decimals() external pure returns (uint8)
    function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)
    function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)
    function name() external pure returns (string)
    function sharesFromUnderlyingBalance(uint256 _underlyingAssetAmount) external view returns (uint256)
    function symbol() external pure returns (string)
    function totalSupply() external view returns (uint256)
    function totalUnderlyingSupply() external view returns (uint256)
    function transfer(address _to, uint256 _value) external nonpayable returns (bool)
    function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)
    function underlyingBalanceFromShares(uint256 _shares) external view returns (uint256)
    event Approval(address indexed owner, address indexed spender, uint256 value)
    event SetTotalSupply(uint256 totalSupply)
    event Transfer(address indexed from, address indexed to, uint256 value)
    error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)
    error BalanceTooLow()
    error InvalidZeroAddress()
    error NullTransfer()
    error UnauthorizedTransfer(address _from, address _to)
    function getCLSpec() external view returns (struct CLSpec.CLSpecStruct)
    function getCLValidatorCount() external view returns (uint256)
    function getCLValidatorTotalBalance() external view returns (uint256)
    function getCurrentEpochId() external view returns (uint256)
    function getCurrentFrame() external view returns (uint256 _startEpochId, uint256 _startTime, uint256 _endTime)
    function getExpectedEpochId() external view returns (uint256)
    function getFrameFirstEpochId(uint256 _epochId) external view returns (uint256)
    function getLastCompletedEpochId() external view returns (uint256)
    function getLastConsensusLayerReport() external view returns (struct IOracleManagerV1.StoredConsensusLayerReport)
    function getOracle() external view returns (address)
    function getReportBounds() external view returns (struct ReportBounds.ReportBoundsStruct)
    function getTime() external view returns (uint256)
    function isValidEpoch(uint256 epoch) external view returns (bool)
    function setCLSpec(CLSpec.CLSpecStruct _newValue) external nonpayable
    function setConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable
    function setOracle(address _oracleAddress) external nonpayable
    function setReportBounds(ReportBounds.ReportBoundsStruct _newValue) external nonpayable
    event ConsensusLayerDataUpdate(uint256 validatorCount, uint256 validatorTotalBalance, bytes32 roundId)
    event ProcessedConsensusLayerReport(IOracleManagerV1.ConsensusLayerReport report, IOracleManagerV1.ConsensusLayerDataReportingTrace trace)
    event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)
    event SetOracle(address indexed oracleAddress)
    event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime, uint64 epochsToAssumedFinality)
    error InvalidDecreasingValidatorsExitedBalance(uint256 currentValidatorsExitedBalance, uint256 newValidatorsExitedBalance)
    error InvalidDecreasingValidatorsSkimmedBalance(uint256 currentValidatorsSkimmedBalance, uint256 newValidatorsSkimmedBalance)
    error InvalidEpoch(uint256 epoch)
    error InvalidValidatorCountReport(uint256 providedValidatorCount, uint256 depositedValidatorCount, uint256 lastReportedValidatorCount)
    error TotalValidatorBalanceDecreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 relativeLowerBound)
    error TotalValidatorBalanceIncreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 annualAprUpperBound)
    function computeVestingReleasableAmount(uint256 _index) external view returns (uint256)
    function computeVestingVestedAmount(uint256 _index) external view returns (uint256)
    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)
    function delegateVestingEscrow(uint256 _index, address _delegatee) external nonpayable returns (bool)
    function getVestingSchedule(uint256 _index) external view returns (struct VestingSchedulesV2.VestingSchedule)
    function getVestingScheduleCount() external view returns (uint256)
    function isGlobalUnlockedScheduleIgnored(uint256 _index) external view returns (bool)
    function releaseVestingSchedule(uint256 _index) external nonpayable returns (uint256)
    function revokeVestingSchedule(uint256 _index, uint64 _end) external nonpayable returns (uint256 returnedAmount)
    function vestingEscrow(uint256 _index) external view returns (address)
    event CreatedVestingSchedule(uint256 index, address indexed creator, address indexed beneficiary, uint256 amount)
    event DelegatedVestingEscrow(uint256 index, address indexed oldDelegatee, address indexed newDelegatee, address indexed beneficiary)
    event ReleasedVestingSchedule(uint256 index, uint256 releasedAmount)
    event RevokedVestingSchedule(uint256 index, uint256 returnedAmount, uint256 newEnd)
    error GlobalUnlockUnderlfow()
    error InvalidRevokedVestingScheduleEnd()
    error InvalidVestingScheduleParameter(string msg)
    error UnsufficientVestingScheduleCreatorBalance()
    error VestingScheduleIsLocked()
    error VestingScheduleNotRevocable()
    error VestingScheduleNotRevocableInPast()
    error ZeroReleasableAmount()

    Requested transfer value in shares

    The genesis timestamp

    epochsToAssumedFinality

    uint64

    The number of epochs before an epoch is considered final

    The upper bound value that was used

    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

    Vesting schedule amount

    vesting schedule beneficiary

    _owner

    address

    Address that issued the allowance

    _spender

    address

    Address that received the allowance

    _0

    uint256

    The allowance in shares for a given spender

    _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

    _owner

    address

    Address to be checked

    _0

    uint256

    The balance of the account in shares

    _owner

    address

    Address to be checked

    _0

    uint256

    The underlying balance of the account

    _0

    uint8

    The decimal count

    _spender

    address

    Spender that receives the allowance

    _subtractableValue

    uint256

    Amount of shares to subtract

    _0

    bool

    True if success

    _spender

    address

    Spender that receives the allowance

    _additionalValue

    uint256

    Amount of shares to add

    _0

    bool

    True if success

    _0

    string

    The token name

    _underlyingAssetAmount

    uint256

    Amount of underlying asset to convert

    _0

    uint256

    The amount of shares worth the underlying asset amount

    _0

    string

    The token symbol

    _0

    uint256

    The total supply in shares

    _0

    uint256

    The total underlying asset supply

    _to

    address

    Address receiving the tokens

    _value

    uint256

    Amount of shares to be sent

    _0

    bool

    True if success

    _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

    _shares

    uint256

    Amount of shares to convert

    _0

    uint256

    The underlying asset balance represented by the shares

    owner indexed

    address

    undefined

    spender indexed

    address

    undefined

    value

    uint256

    undefined

    totalSupply

    uint256

    undefined

    from indexed

    address

    undefined

    to indexed

    address

    undefined

    value

    uint256

    undefined

    _from

    address

    Account where funds are sent from

    _operator

    address

    Account attempting the transfer

    _allowance

    uint256

    Current allowance

    _value

    uint256

    _from

    address

    Account sending the funds in the invalid transfer

    _to

    address

    Account receiving the funds in the invalid transfer

    Requested transfer value in shares

    function allowance(address _owner, address _spender) external view returns (uint256)
    function approve(address _spender, uint256 _value) external nonpayable returns (bool)
    function balanceOf(address _owner) external view returns (uint256)
    function balanceOfUnderlying(address _owner) external view returns (uint256)
    function decimals() external pure returns (uint8)
    function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)
    function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)
    function name() external pure returns (string)
    function sharesFromUnderlyingBalance(uint256 _underlyingAssetAmount) external view returns (uint256)
    function symbol() external pure returns (string)
    function totalSupply() external view returns (uint256)
    function totalUnderlyingSupply() external view returns (uint256)
    function transfer(address _to, uint256 _value) external nonpayable returns (bool)
    function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)
    function underlyingBalanceFromShares(uint256 _shares) external view returns (uint256)
    event Approval(address indexed owner, address indexed spender, uint256 value)
    event SetTotalSupply(uint256 totalSupply)
    event Transfer(address indexed from, address indexed to, uint256 value)
    error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)
    error BalanceTooLow()
    error NullTransfer()
    error UnauthorizedTransfer(address _from, address _to)
    hashtag
    allowance

    Retrieves the token allowance given from one address to another

    hashtag
    Parameters

    Name
    Type
    Description

    _owner

    address

    Owner that gave the allowance

    _spender

    address

    Spender that received the allowance

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The allowance of the owner to the spender

    hashtag
    approve

    Approves another account to transfer tokens

    hashtag
    Parameters

    Name
    Type
    Description

    _spender

    address

    Spender that receives the allowance

    _value

    uint256

    Amount to allow

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    balanceOf

    Retrieves the token balance of the specified user

    hashtag
    Parameters

    Name
    Type
    Description

    _owner

    address

    Owner to check the balance

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The balance of the owner

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    _recipient

    address

    The account receiving the underlying LsETH tokens after shares are burned

    _shares

    uint256

    Amount of LsETH to free by burning wrapped LsETH

    hashtag
    decimals

    Retrieves the token decimal count

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint8

    The decimal count

    hashtag
    decreaseAllowance

    Decrease allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    _spender

    address

    Spender that receives the allowance

    _subtractableValue

    uint256

    Amount to subtract

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    increaseAllowance

    Increase allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    _spender

    address

    Spender that receives the allowance

    _additionalValue

    uint256

    Amount to add

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    initWLSETHV1

    Initializes the wrapped token contract

    hashtag
    Parameters

    Name
    Type
    Description

    _river

    address

    Address of the River contract

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    _recipient

    address

    The account receiving the new minted wrapped LsETH

    _shares

    uint256

    The amount of LsETH to wrap

    hashtag
    name

    Retrieves the token full name

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    The name of the token

    hashtag
    sharesOf

    Retrieves the raw shares count of the user

    hashtag
    Parameters

    Name
    Type
    Description

    _owner

    address

    Owner to check the shares balance

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The shares of the owner

    hashtag
    symbol

    Retrieves the token symbol

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    The symbol of the token

    hashtag
    totalSupply

    Retrieves the token total supply

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The total supply

    hashtag
    transfer

    Transfers tokens between the message sender and a recipient

    hashtag
    Parameters

    Name
    Type
    Description

    _to

    address

    Recipient of the transfer

    _value

    uint256

    Amount to transfer

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    transferFrom

    Transfers tokens between two accounts

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

    hashtag
    Parameters

    Name
    Type
    Description

    _from

    address

    Sender account

    _to

    address

    Recipient of the transfer

    _value

    uint256

    Amount to transfer

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if success

    hashtag
    Events

    hashtag
    Approval

    An approval has been made

    hashtag
    Parameters

    Name
    Type
    Description

    owner indexed

    address

    The token owner

    spender indexed

    address

    The account allowed by the owner

    value

    uint256

    The amount allowed

    hashtag
    Burn

    Tokens have been burned

    hashtag
    Parameters

    Name
    Type
    Description

    recipient indexed

    address

    The account that receive the underlying LsETH

    shares

    uint256

    The amount of LsETH that got sent back

    hashtag
    Initialized

    Triggered when the contract has been initialized or reinitialized.

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint8

    undefined

    hashtag
    Mint

    Tokens have been minted

    hashtag
    Parameters

    Name
    Type
    Description

    recipient indexed

    address

    The account receiving the new tokens

    shares

    uint256

    The amount of LsETH provided

    hashtag
    SetRiver

    The stored value of river has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    river indexed

    address

    The new address of river

    hashtag
    Transfer

    A transfer has been made

    hashtag
    Parameters

    Name
    Type
    Description

    from indexed

    address

    The transfer sender

    to indexed

    address

    The transfer recipient

    value

    uint256

    The amount transferred

    hashtag
    Errors

    hashtag
    AllowanceTooLow

    Allowance too low to perform operation

    hashtag
    Parameters

    Name
    Type
    Description

    _from

    address

    Account where funds are sent from

    _operator

    address

    Account attempting the transfer

    _allowance

    uint256

    Current allowance

    _value

    uint256

    hashtag
    BalanceTooLow

    Balance too low to perform operation

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    NullTransfer

    Invalid empty transfer

    hashtag
    TokenTransferError

    The token transfer failed during the minting or burning process

    hashtag
    UnauthorizedTransfer

    Invalid transfer recipients

    hashtag
    Parameters

    Name
    Type
    Description

    _from

    address

    Account sending the funds in the invalid transfer

    _to

    address

    Account receiving the funds in the invalid transfer

    hashtag
    _DEPOSIT_SIZE

    Size of a deposit in ETH

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    getCLSpec

    Retrieve the current cl spec

    hashtag
    Returns

    Name
    Type
    Description

    _0

    CLSpec.CLSpecStruct

    The Consensus Layer Specification

    hashtag
    getCLValidatorCount

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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The CL validator count

    hashtag
    getCLValidatorTotalBalance

    Get CL validator total balance

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The CL Validator total balance

    hashtag
    getCurrentEpochId

    Retrieve the current epoch id based on block timestamp

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The current epoch id

    hashtag
    getCurrentFrame

    Retrieve the current frame details

    hashtag
    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

    hashtag
    getExpectedEpochId

    Retrieve expected epoch id

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The current expected epoch id

    hashtag
    getFrameFirstEpochId

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

    hashtag
    Parameters

    Name
    Type
    Description

    _epochId

    uint256

    Epoch id used to get the frame

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

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

    hashtag
    getLastCompletedEpochId

    Retrieve the last completed epoch id

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The last completed epoch id

    hashtag
    getLastConsensusLayerReport

    Retrieve the last consensus layer report

    hashtag
    Returns

    Name
    Type
    Description

    _0

    IOracleManagerV1.StoredConsensusLayerReport

    The stored consensus layer report

    hashtag
    getOracle

    Get oracle address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The oracle address

    hashtag
    getReportBounds

    Retrieve the report bounds

    hashtag
    Returns

    Name
    Type
    Description

    _0

    ReportBounds.ReportBoundsStruct

    The report bounds

    hashtag
    getTime

    Retrieve the block timestamp

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The current timestamp from the EVM context

    hashtag
    isValidEpoch

    Verifies if the provided epoch is valid

    hashtag
    Parameters

    Name
    Type
    Description

    _epoch

    uint256

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if valid

    hashtag
    setCLSpec

    hashtag
    Parameters

    Name
    Type
    Description

    _newValue

    CLSpec.CLSpecStruct

    undefined

    hashtag
    setConsensusLayerData

    hashtag
    Parameters

    Name
    Type
    Description

    _report

    IOracleManagerV1.ConsensusLayerReport

    undefined

    hashtag
    setOracle

    Set the oracle address

    hashtag
    Parameters

    Name
    Type
    Description

    _oracleAddress

    address

    Address of the oracle

    hashtag
    setReportBounds

    hashtag
    Parameters

    Name
    Type
    Description

    _newValue

    ReportBounds.ReportBoundsStruct

    undefined

    hashtag
    Events

    hashtag
    ConsensusLayerDataUpdate

    The consensus layer data provided by the oracle has been updated

    hashtag
    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

    hashtag
    ProcessedConsensusLayerReport

    The provided report has been processed

    hashtag
    Parameters

    Name
    Type
    Description

    report

    IOracleManagerV1.ConsensusLayerReport

    The report that was provided

    trace

    IOracleManagerV1.ConsensusLayerDataReportingTrace

    The trace structure providing more insights on internals

    hashtag
    SetBounds

    The Report Bounds are changed

    hashtag
    Parameters

    Name
    Type
    Description

    annualAprUpperBound

    uint256

    The reporting upper bound

    relativeLowerBound

    uint256

    The reporting lower bound

    hashtag
    SetOracle

    The stored oracle address changed

    hashtag
    Parameters

    Name
    Type
    Description

    oracleAddress indexed

    address

    The new oracle address

    hashtag
    SetSpec

    The Consensus Layer Spec is changed

    hashtag
    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

    hashtag
    Errors

    hashtag
    InvalidDecreasingValidatorsExitedBalance

    The total exited balance decreased

    hashtag
    Parameters

    Name
    Type
    Description

    currentValidatorsExitedBalance

    uint256

    The current exited balance

    newValidatorsExitedBalance

    uint256

    The new exited balance

    hashtag
    InvalidDecreasingValidatorsSkimmedBalance

    The total skimmed balance decreased

    hashtag
    Parameters

    Name
    Type
    Description

    currentValidatorsSkimmedBalance

    uint256

    The current exited balance

    newValidatorsSkimmedBalance

    uint256

    The new exited balance

    hashtag
    InvalidEpoch

    Thrown when an invalid epoch was reported

    hashtag
    Parameters

    Name
    Type
    Description

    epoch

    uint256

    Invalid epoch

    hashtag
    InvalidValidatorCountReport

    The reported validator count is invalid

    hashtag
    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

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    TotalValidatorBalanceDecreaseOutOfBound

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

    hashtag
    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

    hashtag
    TotalValidatorBalanceIncreaseOutOfBound

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

    hashtag
    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

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    caller

    address

    Address performing the call

    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.

    hashtag
    Methods

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    getGlobalReportStatus

    Retrieve member report status

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getLastReportedEpochId

    Retrieve the last reported epoch id

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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getMemberReportStatus

    Retrieve member report status

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getOracleMembers

    Retrieve the list of oracle members

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getQuorum

    Retrieve the current quorum

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getReportVariantDetails

    Retrieve the details of a report variant

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getReportVariantsCount

    Retrieve report variants count

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getRiver

    Retrieve River address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initOracleV1

    Initializes the oracle

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    initOracleV1_1

    Initializes the oracle

    hashtag
    isMember

    Returns true if address is member

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    reportConsensusLayerData

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setMember

    Changes the address of an oracle member

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setQuorum

    Edits the quorum required to forward cl data to River

    Modifying the quorum clears all the reporting data

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    AddMember

    A member has been added to the oracle member list

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ClearedReporting

    Cleared reporting data

    hashtag
    RemoveMember

    A member has been removed from the oracle member list

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ReportedConsensusLayerData

    An oracle member performed a report

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBounds

    The report bounds have been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetLastReportedEpoch

    The last reported epoch has changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetMember

    A member address has been edited

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetQuorum

    The storage quorum value has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetRiver

    The storage river address value has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetSpec

    The consensus layer spec has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    AddressAlreadyInUse

    The address is already in use by an oracle member

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    AlreadyReported

    The member already reported on the given epoch id

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    EpochTooOld

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidEpoch

    Thrown when the reported epoch is invalid

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ReportIndexOutOfBounds

    Thrown when the report indexes fetched is out of bounds

    hashtag
    Parameters

    Name
    Type
    Description
    function allowance(address _owner, address _spender) external view returns (uint256)
    function approve(address _spender, uint256 _value) external nonpayable returns (bool)
    function balanceOf(address _owner) external view returns (uint256)
    function burn(address _recipient, uint256 _shares) external nonpayable
    function decimals() external pure returns (uint8)
    function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)
    function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)
    function initWLSETHV1(address _river) external nonpayable
    function mint(address _recipient, uint256 _shares) external nonpayable
    function name() external pure returns (string)
    function sharesOf(address _owner) external view returns (uint256)
    function symbol() external pure returns (string)
    function totalSupply() external view returns (uint256)
    function transfer(address _to, uint256 _value) external nonpayable returns (bool)
    function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)
    event Approval(address indexed owner, address indexed spender, uint256 value)
    event Burn(address indexed recipient, uint256 shares)
    event Initialized(uint8 version)
    event Mint(address indexed recipient, uint256 shares)
    event SetRiver(address indexed river)
    event Transfer(address indexed from, address indexed to, uint256 value)
    error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)
    error BalanceTooLow()
    error InvalidZeroAddress()
    error NullTransfer()
    error TokenTransferError()
    error UnauthorizedTransfer(address _from, address _to)
    function _DEPOSIT_SIZE() external view returns (uint256)
    function getCLSpec() external view returns (struct CLSpec.CLSpecStruct)
    function getCLValidatorCount() external view returns (uint256)
    function getCLValidatorTotalBalance() external view returns (uint256)
    function getCurrentEpochId() external view returns (uint256)
    function getCurrentFrame() external view returns (uint256 _startEpochId, uint256 _startTime, uint256 _endTime)
    function getExpectedEpochId() external view returns (uint256)
    function getFrameFirstEpochId(uint256 _epochId) external view returns (uint256)
    function getLastCompletedEpochId() external view returns (uint256)
    function getLastConsensusLayerReport() external view returns (struct IOracleManagerV1.StoredConsensusLayerReport)
    function getOracle() external view returns (address)
    function getReportBounds() external view returns (struct ReportBounds.ReportBoundsStruct)
    function getTime() external view returns (uint256)
    function isValidEpoch(uint256 _epoch) external view returns (bool)
    function setCLSpec(CLSpec.CLSpecStruct _newValue) external nonpayable
    function setConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable
    function setOracle(address _oracleAddress) external nonpayable
    function setReportBounds(ReportBounds.ReportBoundsStruct _newValue) external nonpayable
    event ConsensusLayerDataUpdate(uint256 validatorCount, uint256 validatorTotalBalance, bytes32 roundId)
    event ProcessedConsensusLayerReport(IOracleManagerV1.ConsensusLayerReport report, IOracleManagerV1.ConsensusLayerDataReportingTrace trace)
    event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)
    event SetOracle(address indexed oracleAddress)
    event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime, uint64 epochsToAssumedFinality)
    error InvalidDecreasingValidatorsExitedBalance(uint256 currentValidatorsExitedBalance, uint256 newValidatorsExitedBalance)
    error InvalidDecreasingValidatorsSkimmedBalance(uint256 currentValidatorsSkimmedBalance, uint256 newValidatorsSkimmedBalance)
    error InvalidEpoch(uint256 epoch)
    error InvalidValidatorCountReport(uint256 providedValidatorCount, uint256 depositedValidatorCount, uint256 lastReportedValidatorCount)
    error InvalidZeroAddress()
    error TotalValidatorBalanceDecreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 relativeLowerBound)
    error TotalValidatorBalanceIncreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 annualAprUpperBound)
    error Unauthorized(address caller)

    Requested transfer value

    epochsToAssumedFinality

    uint64

    The number of epochs before an epoch is considered final

    The upper bound value that was used

    _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.

    quorum

    uint256

    undefined

    _newOracleMember

    address

    Address of the new member

    _newQuorum

    uint256

    New quorum value

    _0

    uint256

    The raw report status value

    _0

    uint256

    The last reported epoch id

    _oracleMember

    address

    Address of member to check

    _0

    bool

    True if member has reported

    _0

    address[]

    The oracle members

    _0

    uint256

    The current quorum

    _idx

    uint256

    The index of the report variant

    _0

    ReportsVariants.ReportVariantDetails

    The report variant details

    _0

    uint256

    The count of report variants

    _0

    address

    The address of River

    _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

    _memberAddress

    address

    Address of the member

    _0

    bool

    True if address is a member

    _oracleMember

    address

    Address to remove

    _newQuorum

    uint256

    New quorum value

    _report

    IOracleManagerV1.ConsensusLayerReport

    undefined

    _oracleMember

    address

    Address to change

    _newAddress

    address

    New address for the member

    _newQuorum

    uint256

    New quorum parameter

    member indexed

    address

    The address of the member

    member indexed

    address

    The address of the member

    member indexed

    address

    The oracle member

    variant indexed

    bytes32

    The variant of the report

    report

    IOracleManagerV1.ConsensusLayerReport

    The raw report structure

    voteCount

    uint256

    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

    lastReportedEpoch

    uint256

    undefined

    oldAddress indexed

    address

    The previous member address

    newAddress indexed

    address

    The new member address

    newQuorum

    uint256

    The new quorum value

    _river

    address

    The new river address

    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

    newAddress

    address

    The address already in use

    epochId

    uint256

    The epoch id provided as input

    member

    address

    The oracle member

    providedEpochId

    uint256

    The epoch id provided as input

    minExpectedEpochId

    uint256

    The minimum epoch id expected

    epoch

    uint256

    The invalid epoch

    index

    uint256

    Requested index

    length

    uint256

    Size of the variant array

    CL spec parameter. Number of slots in one epoch.

    The vote count

    The timestamp of block #0

    function addMember(address _newOracleMember, uint256 _newQuorum) external nonpayable
    function getGlobalReportStatus() external view returns (uint256)
    function getLastReportedEpochId() external view returns (uint256)
    function getMemberReportStatus(address _oracleMember) external view returns (bool)
    function getOracleMembers() external view returns (address[])
    function getQuorum() external view returns (uint256)
    function getReportVariantDetails(uint256 _idx) external view returns (struct ReportsVariants.ReportVariantDetails)
    function getReportVariantsCount() external view returns (uint256)
    function getRiver() external view returns (address)
    function initOracleV1(address _river, address _administratorAddress, uint64 _epochsPerFrame, uint64 _slotsPerEpoch, uint64 _secondsPerSlot, uint64 _genesisTime, uint256 _annualAprUpperBound, uint256 _relativeLowerBound) external nonpayable
    function initOracleV1_1() external nonpayable
    function isMember(address _memberAddress) external view returns (bool)
    function removeMember(address _oracleMember, uint256 _newQuorum) external nonpayable
    function reportConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable
    function setMember(address _oracleMember, address _newAddress) external nonpayable
    function setQuorum(uint256 _newQuorum) external nonpayable
    event AddMember(address indexed member)
    event ClearedReporting()
    event RemoveMember(address indexed member)
    event ReportedConsensusLayerData(address indexed member, bytes32 indexed variant, IOracleManagerV1.ConsensusLayerReport report, uint256 voteCount, uint256 quorum)
    event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)
    event SetLastReportedEpoch(uint256 lastReportedEpoch)
    event SetMember(address indexed oldAddress, address indexed newAddress)
    event SetQuorum(uint256 newQuorum)
    event SetRiver(address _river)
    event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime)
    error AddressAlreadyInUse(address newAddress)
    error AlreadyReported(uint256 epochId, address member)
    error EpochTooOld(uint256 providedEpochId, uint256 minExpectedEpochId)
    error InvalidEpoch(uint256 epoch)
    error ReportIndexOutOfBounds(uint256 index, uint256 length)

    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.

    hashtag
    Methods

    hashtag
    acceptAdmin

    Accept the transfer of ownership

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

    hashtag
    allowExecutor

    Sets the permission for a function selector

    hashtag
    Parameters

    Name
    Type
    Description

    _functionSelector

    bytes4

    Method signature on which the permission is changed

    _executorCanCall

    bool

    True if selector is callable by the executor

    hashtag
    destination

    Retrieve the destination address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The destination address

    hashtag
    executor

    Retrieve the executor address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The executor address

    hashtag
    executorCanCall

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

    hashtag
    Parameters

    Name
    Type
    Description

    _0

    bytes4

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True if executor is allowed to call

    hashtag
    getAdmin

    Retrieves the current admin address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The admin address

    hashtag
    getPendingAdmin

    Retrieve the current pending admin address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The pending admin address

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    _newAdmin

    address

    New admin address

    hashtag
    setExecutor

    Sets the executor address

    hashtag
    Parameters

    Name
    Type
    Description

    _newExecutor

    address

    New address for the executor

    hashtag
    version

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    Version of the contract

    hashtag
    Events

    hashtag
    SetAdmin

    The admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    admin indexed

    address

    New admin address

    hashtag
    SetDestination

    The stored destination address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    destination indexed

    address

    The new destination address

    hashtag
    SetExecutor

    The stored executor address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    executor indexed

    address

    The new executor address

    hashtag
    SetExecutorPermissions

    The storage permission for a selector has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    selector

    bytes4

    The 4 bytes method selector

    status

    bool

    True if executor is allowed

    hashtag
    SetPendingAdmin

    The pending admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    pendingAdmin indexed

    address

    New pending admin address

    hashtag
    Errors

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    caller

    address

    Address performing the call

    function acceptAdmin() external nonpayable
    function allowExecutor(bytes4 _functionSelector, bool _executorCanCall) external nonpayable
    function destination() external view returns (address)
    function executor() external view returns (address)
    function executorCanCall(bytes4) external view returns (bool)
    function getAdmin() external view returns (address)
    function getPendingAdmin() external view returns (address)
    function proposeAdmin(address _newAdmin) external nonpayable
    function setExecutor(address _newExecutor) external nonpayable
    function version() external pure returns (string)
    event SetAdmin(address indexed admin)
    event SetDestination(address indexed destination)
    event SetExecutor(address indexed executor)
    event SetExecutorPermissions(bytes4 selector, bool status)
    event SetPendingAdmin(address indexed pendingAdmin)
    error InvalidZeroAddress()
    error Unauthorized(address caller)

    RedeemManagerV1

    Alluvial Finance Inc.

    Redeem Manager (v1)

    This contract handles the redeem requests of all users

    hashtag
    Methods

    Operate Validator Nodes

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

    hashtag
    Operate Validator Nodes

    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 .

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

    hashtag
    claimRedeemRequests

    Claims the rewards of the provided redeem request ids

    hashtag
    Parameters

    Name
    Type
    Description

    redeemRequestIds

    uint32[]

    undefined

    withdrawalEventIds

    uint32[]

    undefined

    skipAlreadyClaimed

    bool

    undefined

    _depth

    uint16

    hashtag
    Returns

    Name
    Type
    Description

    claimStatuses

    uint8[]

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

    hashtag
    claimRedeemRequests

    Claims the rewards of the provided redeem request ids

    hashtag
    Parameters

    Name
    Type
    Description

    _redeemRequestIds

    uint32[]

    The list of redeem requests to claim

    _withdrawalEventIds

    uint32[]

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

    hashtag
    Returns

    Name
    Type
    Description

    claimStatuses

    uint8[]

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

    hashtag
    getBufferedExceedingEth

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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The amount of eth in the buffer

    hashtag
    getRedeemDemand

    Retrieve the amount of LsETH waiting to be exited

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The amount of LsETH waiting to be exited

    hashtag
    getRedeemRequestCount

    Retrieve the global count of redeem requests

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    getRedeemRequestDetails

    Retrieve the details of a specific redeem request

    hashtag
    Parameters

    Name
    Type
    Description

    _redeemRequestId

    uint32

    The id of the request

    hashtag
    Returns

    Name
    Type
    Description

    _0

    RedeemQueueV2.RedeemRequest

    The redeem request details

    hashtag
    getRiver

    Retrieve River address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The address of River

    hashtag
    getWithdrawalEventCount

    Retrieve the global count of withdrawal events

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    getWithdrawalEventDetails

    Retrieve the details of a specific withdrawal event

    hashtag
    Parameters

    Name
    Type
    Description

    _withdrawalEventId

    uint32

    The id of the withdrawal event

    hashtag
    Returns

    Name
    Type
    Description

    _0

    WithdrawalStack.WithdrawalEvent

    The withdrawal event details

    hashtag
    initializeRedeemManagerV1

    hashtag
    Parameters

    Name
    Type
    Description

    _river

    address

    The address of the River contract

    hashtag
    initializeRedeemManagerV1_2

    hashtag
    pullExceedingEth

    Pulls exceeding buffer eth

    hashtag
    Parameters

    Name
    Type
    Description

    _max

    uint256

    The maximum amount that should be pulled

    hashtag
    reportWithdraw

    Reports a withdraw event from River

    hashtag
    Parameters

    Name
    Type
    Description

    _lsETHWithdrawable

    uint256

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

    hashtag
    requestRedeem

    Creates a redeem request

    hashtag
    Parameters

    Name
    Type
    Description

    _lsETHAmount

    uint256

    The amount of LsETH to redeem

    _recipient

    address

    The recipient owning the redeem request

    hashtag
    Returns

    Name
    Type
    Description

    redeemRequestId

    uint32

    The id of the redeem request

    hashtag
    requestRedeem

    Creates a redeem request using msg.sender as recipient

    hashtag
    Parameters

    Name
    Type
    Description

    _lsETHAmount

    uint256

    The amount of LsETH to redeem

    hashtag
    Returns

    Name
    Type
    Description

    redeemRequestId

    uint32

    The id of the redeem request

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    _redeemRequestIds

    uint32[]

    The list of redeem requests to resolve

    hashtag
    Returns

    Name
    Type
    Description

    withdrawalEventIds

    int64[]

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

    hashtag
    version

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    Version of the contract

    hashtag
    Events

    hashtag
    ClaimedRedeemRequest

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

    hashtag
    Parameters

    Name
    Type
    Description

    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

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    hashtag
    ReportedWithdrawal

    Emitted when a withdrawal event is created

    hashtag
    Parameters

    Name
    Type
    Description

    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

    hashtag
    RequestedRedeem

    Emitted when a redeem request is created

    hashtag
    Parameters

    Name
    Type
    Description

    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

    hashtag
    SatisfiedRedeemRequest

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

    hashtag
    Parameters

    Name
    Type
    Description

    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

    hashtag
    SetRedeemDemand

    Emitted when the redeem demand is set

    hashtag
    Parameters

    Name
    Type
    Description

    oldRedeemDemand

    uint256

    The old redeem demand

    newRedeemDemand

    uint256

    The new redeem demand

    hashtag
    SetRiver

    Emitted when the River address is set

    hashtag
    Parameters

    Name
    Type
    Description

    river

    address

    The new river address

    hashtag
    Errors

    hashtag
    ClaimInitiatorIsDenied

    Thrown when the claim initiator is denied

    hashtag
    ClaimRecipientIsDenied

    Thrown when the claim recipient is denied

    hashtag
    ClaimRedeemFailed

    Thrown when the payment after a claim failed

    hashtag
    Parameters

    Name
    Type
    Description

    recipient

    address

    The recipient of the payment

    rdata

    bytes

    The revert data

    hashtag
    DoesNotMatch

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

    hashtag
    Parameters

    Name
    Type
    Description

    redeemRequestId

    uint256

    The provided redeem request id

    withdrawalEventId

    uint256

    The provided associated withdrawal event id

    hashtag
    IncompatibleArrayLengths

    Thrown when the provided arrays don't have matching lengths

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    InvalidZeroAmount

    Thrown When a zero value is provided

    hashtag
    RecipientIsDenied

    Thrown when the recipient of redeemRequest is denied

    hashtag
    RedeemRequestAlreadyClaimed

    Thrown when the redeem request id is already claimed

    hashtag
    Parameters

    Name
    Type
    Description

    id

    uint256

    The redeem request id

    hashtag
    RedeemRequestOutOfBounds

    Thrown when the provided redeem request id is out of bounds

    hashtag
    Parameters

    Name
    Type
    Description

    id

    uint256

    The redeem request id

    hashtag
    TransferError

    Thrown when a transfer error occurred with LsETH

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    caller

    address

    Address performing the call

    hashtag
    WithdrawalEventOutOfBounds

    Thrown when the withdrawal request id if out of bounds

    hashtag
    Parameters

    Name
    Type
    Description

    id

    uint256

    The withdrawal event id

    hashtag
    WithdrawalExceedsRedeemDemand

    Thrown when the provided withdrawal event exceeds the redeem demand

    hashtag
    Parameters

    Name
    Type
    Description

    withdrawalAmount

    uint256

    The amount of the withdrawal event

    redeemDemand

    uint256

    The current redeem demand

    hashtag
    Operate Validator Nodes

    hashtag
    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.)

    hashtag
    CLI

    CLI provides various commands to facilitate Node Operators in the process of managing validator keys.

    CLI is compatible with the Ethereum deposit CLIarrow-up-right and can be used in conjunction with it.

    hashtag
    Installation

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

    It is also possible to build the binary from sources.

    hashtag
    Guidelines

    hashtag
    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:

    triangle-exclamation

    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:

    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

    circle-info

    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.

    hashtag
    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

    circle-exclamation

    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.

    For each generated key, a Node Operator is also expected to generate the corresponding DepositMessage and BLS12-381 signature as per the Ethereum 2.0 specsarrow-up-right

    Node Operators are required to set withdrawal credentials to the address of Withdrawal contract.

    circle-info

    Per the Ethereum protocolarrow-up-right, once a Type 1 (0x01) withdrawal address is set those withdrawal credentials cannot be changed.

    To get withdrawal credentials you can run:

    As a result of the validator key generation, a Node Operator should obtain a JSON file matching the following format:

    circle-info

    It is possible to use the Ethereum deposit CLIarrow-up-right to generate keys, which produces a file in the above format.

    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:

    triangle-exclamation

    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:

    To submit validator keys you can run the following command:

    circle-info

    The container runs with 65532:65532 and the keystore directory should be created and then chown'd to the user.

    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.

    hashtag
    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.

    hashtag
    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

    hashtag
    Exit Daemon

    hashtag
    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.

    hashtag
    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.

    hashtag
    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

    hashtag
    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

    Validator Exit Daemon

    Sequence diagram

    Validator Exit Daemon Sequence Diagram

    hashtag
    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.)

    hashtag
    Installation

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

    circle-info

    For those running kubernetes and helm you can use this image:public.ecr.aws/alluvial/helm-charts/lceth:1.3.0

    hashtag
    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.

    circle-info

    Operator index could be retrieved with lceth operators list

    The API meets the following requirements:

    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.

    circle-exclamation

    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:

    • 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.

    circle-info

    The webhook templating imports the Golang Sprig libraryarrow-up-right. Which means additional functions are available to format the output.

    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:

    Usage output:

    Node Operator Performance SLAsarrow-up-right
    function claimRedeemRequests(uint32[] redeemRequestIds, uint32[] withdrawalEventIds, bool skipAlreadyClaimed, uint16 _depth) external nonpayable returns (uint8[] claimStatuses)
    function claimRedeemRequests(uint32[] _redeemRequestIds, uint32[] _withdrawalEventIds) external nonpayable returns (uint8[] claimStatuses)
    function getBufferedExceedingEth() external view returns (uint256)
    function getRedeemDemand() external view returns (uint256)
    function getRedeemRequestCount() external view returns (uint256)
    function getRedeemRequestDetails(uint32 _redeemRequestId) external view returns (struct RedeemQueueV2.RedeemRequest)
    function getRiver() external view returns (address)
    function getWithdrawalEventCount() external view returns (uint256)
    function getWithdrawalEventDetails(uint32 _withdrawalEventId) external view returns (struct WithdrawalStack.WithdrawalEvent)
    function initializeRedeemManagerV1(address _river) external nonpayable
    function initializeRedeemManagerV1_2() external nonpayable
    function pullExceedingEth(uint256 _max) external nonpayable
    function reportWithdraw(uint256 _lsETHWithdrawable) external payable
    function requestRedeem(uint256 _lsETHAmount, address _recipient) external nonpayable returns (uint32 redeemRequestId)
    function requestRedeem(uint256 _lsETHAmount) external nonpayable returns (uint32 redeemRequestId)
    function resolveRedeemRequests(uint32[] _redeemRequestIds) external view returns (int64[] withdrawalEventIds)
    function version() external pure returns (string)
    event ClaimedRedeemRequest(uint32 indexed redeemRequestId, address indexed recipient, uint256 ethAmount, uint256 lsEthAmount, uint256 remainingLsEthAmount)
    event Initialize(uint256 version, bytes cdata)
    event ReportedWithdrawal(uint256 height, uint256 amount, uint256 ethAmount, uint32 id)
    event RequestedRedeem(address indexed recipient, uint256 height, uint256 amount, uint256 maxRedeemableEth, uint32 id)
    event SatisfiedRedeemRequest(uint32 indexed redeemRequestId, uint32 indexed withdrawalEventId, uint256 lsEthAmountSatisfied, uint256 ethAmountSatisfied, uint256 lsEthAmountRemaining, uint256 ethAmountExceeding)
    event SetRedeemDemand(uint256 oldRedeemDemand, uint256 newRedeemDemand)
    event SetRiver(address river)
    error ClaimInitiatorIsDenied()
    error ClaimRecipientIsDenied()
    error ClaimRedeemFailed(address recipient, bytes rdata)
    error DoesNotMatch(uint256 redeemRequestId, uint256 withdrawalEventId)
    error IncompatibleArrayLengths()
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    error InvalidZeroAddress()
    error InvalidZeroAmount()
    error RecipientIsDenied()
    error RedeemRequestAlreadyClaimed(uint256 id)
    error RedeemRequestOutOfBounds(uint256 id)
    error TransferError()
    error Unauthorized(address caller)
    error WithdrawalEventOutOfBounds(uint256 id)
    error WithdrawalExceedsRedeemDemand(uint256 withdrawalAmount, uint256 redeemDemand)
    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:v0.37.0 eth1keys generate
    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:v0.37.0 eth1keys import --priv-key {private key in hex format}
    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:v0.37.0 operators list
    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:v0.37.0 withdrawal credentials
    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:v0.37.0 el-fee-recipient address
    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:v0.37.0 validators add \
        --operator-idx {operator index} \
        --deposit-data /validator_keys.json \
        --from {operator address} \
        --send
    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:v0.37.0 exit run \
        --operator-idx {operator index}
    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:v0.37.0 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"
    validator_keys.json
    [
      {
        "pubkey": "814dc0f55ac3fb02431668adf6f8fa1c37fb9baa5b87f5be519a373205933dfe742f3df566cba3a35b5be1940e1dffd5",
        "signature": "81b24791a89f3596abebb294e13502e398d96cbdd2a70d87b7fa89cc93019080a2905bb7447e0c408f2569a17b0ce628163e8caca4ea5b69af4db458dffcca100f8fcb96edeef30072ca4322721adc5591da8aadffac8b730d78f84c3b9f3f92"
      },
      {
        "pubkey": "88d1ac7f33780fd328bee60957b2325cfa41b3719614b662616d4525e5b478b3a81d490671526936e3ea412428c84451",
        "signature": "9985f2eb6f445f5e2bae226333f4796127c01efed7f4a4a35b62719dd5470879d1377e0035c00ccaa1cf892542bb427b072113a8e690e963d3e5b590ffd0051c0680e345cd1ee9318f2559796585445c490b8e9db417e99ac55e99c7e281aced"
      }
    ]
    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
    )
    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'
    | 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 |
    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]

    The maximum recursive depth for the resolution of the redeem requests

    The total amount of LsETH used to redeem the eth

    remainingLsEthAmount

    uint256

    The amount of LsETH remaining

    The id of the withdrawal event

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

    id

    uint32

    The id of the new redeem request

    The amount of ETH filled

    lsEthAmountRemaining

    uint256

    The amount of LsETH remaining

    ethAmountExceeding

    uint256

    The amount of eth added to the exceeding buffer

    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

  • 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

  • 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

  • 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

  • OracleV1

    Alluvial Finance Inc.

    Oracle (v1)

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

    hashtag
    Methods

    hashtag
    acceptAdmin

    Accept the transfer of ownership

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

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    getAdmin

    Retrieves the current admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getGlobalReportStatus

    Retrieve member report status

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getLastReportedEpochId

    Retrieve the last reported epoch id

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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getMemberReportStatus

    Retrieve member report status

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getOracleMembers

    Retrieve the list of oracle members

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getPendingAdmin

    Retrieve the current pending admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getQuorum

    Retrieve the current quorum

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getReportVariantDetails

    Retrieve the details of a report variant

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getReportVariantsCount

    Retrieve report variants count

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getRiver

    Retrieve River address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initOracleV1

    Initializes the oracle

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    initOracleV1_1

    Initializes the oracle

    hashtag
    isMember

    Returns true if address is member

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    reportConsensusLayerData

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setMember

    Changes the address of an oracle member

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setQuorum

    Edits the quorum required to forward cl data to River

    Modifying the quorum clears all the reporting data

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    version

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    AddMember

    A member has been added to the oracle member list

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ClearedReporting

    Cleared reporting data

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    RemoveMember

    A member has been removed from the oracle member list

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ReportedConsensusLayerData

    An oracle member performed a report

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetAdmin

    The admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBounds

    The report bounds have been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetLastReportedEpoch

    The last reported epoch has changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetMember

    A member address has been edited

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetPendingAdmin

    The pending admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetQuorum

    The storage quorum value has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetRiver

    The storage river address value has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetSpec

    The consensus layer spec has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    AddressAlreadyInUse

    The address is already in use by an oracle member

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    AlreadyReported

    The member already reported on the given epoch id

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    EpochTooOld

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidArgument

    The argument was invalid

    hashtag
    InvalidCall

    The call was invalid

    hashtag
    InvalidEpoch

    Thrown when the reported epoch is invalid

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    ReportIndexOutOfBounds

    Thrown when the report indexes fetched is out of bounds

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    _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.

    quorum

    uint256

    undefined

    _newOracleMember

    address

    Address of the new member

    _newQuorum

    uint256

    New quorum value

    _0

    address

    The admin address

    _0

    uint256

    The raw report status value

    _0

    uint256

    The last reported epoch id

    _oracleMember

    address

    Address of member to check

    _0

    bool

    True if member has reported

    _0

    address[]

    The oracle members

    _0

    address

    The pending admin address

    _0

    uint256

    The current quorum

    _idx

    uint256

    The index of the report variant

    _0

    ReportsVariants.ReportVariantDetails

    The report variant details

    _0

    uint256

    The count of report variants

    _0

    address

    The address of River

    _riverAddress

    address

    undefined

    _administratorAddress

    address

    Address able to call administrative methods

    _epochsPerFrame

    uint64

    CL spec parameter. Number of epochs in a frame.

    _slotsPerEpoch

    uint64

    _memberAddress

    address

    Address of the member

    _0

    bool

    True if address is a member

    _newAdmin

    address

    New admin address

    _oracleMember

    address

    Address to remove

    _newQuorum

    uint256

    New quorum value

    _report

    IOracleManagerV1.ConsensusLayerReport

    undefined

    _oracleMember

    address

    Address to change

    _newAddress

    address

    New address for the member

    _newQuorum

    uint256

    New quorum parameter

    _0

    string

    Version of the contract

    member indexed

    address

    The address of the member

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    member indexed

    address

    The address of the member

    member indexed

    address

    The oracle member

    variant indexed

    bytes32

    The variant of the report

    report

    IOracleManagerV1.ConsensusLayerReport

    The raw report structure

    voteCount

    uint256

    admin indexed

    address

    New admin address

    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

    lastReportedEpoch

    uint256

    undefined

    oldAddress indexed

    address

    The previous member address

    newAddress indexed

    address

    The new member address

    pendingAdmin indexed

    address

    New pending admin address

    newQuorum

    uint256

    The new quorum value

    _river

    address

    The new river address

    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

    newAddress

    address

    The address already in use

    epochId

    uint256

    The epoch id provided as input

    member

    address

    The oracle member

    providedEpochId

    uint256

    The epoch id provided as input

    minExpectedEpochId

    uint256

    The minimum epoch id expected

    epoch

    uint256

    The invalid epoch

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    index

    uint256

    Requested index

    length

    uint256

    Size of the variant array

    caller

    address

    Address performing the call

    CL spec parameter. Number of slots in one epoch.

    The vote count

    The timestamp of block #0

    function acceptAdmin() external nonpayable
    function addMember(address _newOracleMember, uint256 _newQuorum) external nonpayable
    function getAdmin() external view returns (address)
    function getGlobalReportStatus() external view returns (uint256)
    function getLastReportedEpochId() external view returns (uint256)
    function getMemberReportStatus(address _oracleMember) external view returns (bool)
    function getOracleMembers() external view returns (address[])
    function getPendingAdmin() external view returns (address)
    function getQuorum() external view returns (uint256)
    function getReportVariantDetails(uint256 _idx) external view returns (struct ReportsVariants.ReportVariantDetails)
    function getReportVariantsCount() external view returns (uint256)
    function getRiver() external view returns (address)
    function initOracleV1(address _riverAddress, address _administratorAddress, uint64 _epochsPerFrame, uint64 _slotsPerEpoch, uint64 _secondsPerSlot, uint64 _genesisTime, uint256 _annualAprUpperBound, uint256 _relativeLowerBound) external nonpayable
    function initOracleV1_1() external nonpayable
    function isMember(address _memberAddress) external view returns (bool)
    function proposeAdmin(address _newAdmin) external nonpayable
    function removeMember(address _oracleMember, uint256 _newQuorum) external nonpayable
    function reportConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable
    function setMember(address _oracleMember, address _newAddress) external nonpayable
    function setQuorum(uint256 _newQuorum) external nonpayable
    function version() external pure returns (string)
    event AddMember(address indexed member)
    event ClearedReporting()
    event Initialize(uint256 version, bytes cdata)
    event RemoveMember(address indexed member)
    event ReportedConsensusLayerData(address indexed member, bytes32 indexed variant, IOracleManagerV1.ConsensusLayerReport report, uint256 voteCount, uint256 quorum)
    event SetAdmin(address indexed admin)
    event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)
    event SetLastReportedEpoch(uint256 lastReportedEpoch)
    event SetMember(address indexed oldAddress, address indexed newAddress)
    event SetPendingAdmin(address indexed pendingAdmin)
    event SetQuorum(uint256 newQuorum)
    event SetRiver(address _river)
    event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime)
    error AddressAlreadyInUse(address newAddress)
    error AlreadyReported(uint256 epochId, address member)
    error EpochTooOld(uint256 providedEpochId, uint256 minExpectedEpochId)
    error InvalidArgument()
    error InvalidCall()
    error InvalidEpoch(uint256 epoch)
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    error InvalidZeroAddress()
    error ReportIndexOutOfBounds(uint256 index, uint256 length)
    error Unauthorized(address caller)

    ITLCV1

    Alluvial Finance Inc.

    TLC Interface (v1)

    TLC token interface

    hashtag
    Methods

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    balanceOf

    Returns the amount of tokens owned by account.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    computeVestingReleasableAmount

    Computes the releasable amount of tokens for a vesting schedule.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    computeVestingVestedAmount

    Computes the vested amount of tokens for a vesting schedule.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    delegate

    Delegates votes from the sender to delegatee.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    delegateBySig

    Delegates votes from signer to delegatee.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    delegateVestingEscrow

    Delegate vesting escrowed tokens

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    delegates

    Returns the delegate that account has chosen.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getVestingScheduleCount

    Get count of vesting schedules

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getVotes

    Returns the current amount of votes that account has.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initTLCV1

    Initializes the TLC Token

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    isGlobalUnlockedScheduleIgnored

    Get vesting global unlock schedule activation status for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    migrateVestingSchedules

    Migrates the vesting schedule state structures

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    revokeVestingSchedule

    Revoke vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    totalSupply

    Returns the amount of tokens in existence.

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    vestingEscrow

    Get the address of the escrow for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Approval

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    CreatedVestingSchedule

    A new vesting schedule has been created

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    DelegateChanged

    Emitted when an account changes their delegate.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    DelegateVotesChanged

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    DelegatedVestingEscrow

    Vesting escrow has been delegated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ReleasedVestingSchedule

    Vesting schedule has been released

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    RevokedVestingSchedule

    Vesting schedule has been revoked

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    GlobalUnlockUnderlfow

    Underflow in global unlock logic (should never happen)

    hashtag
    InvalidRevokedVestingScheduleEnd

    Attempt to revoke a vesting schedule with an invalid end parameter

    hashtag
    InvalidVestingScheduleParameter

    Invalid parameter for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    UnsufficientVestingScheduleCreatorBalance

    Vesting schedule creator has unsufficient balance to create vesting schedule

    hashtag
    VestingScheduleIsLocked

    The vesting schedule is locked

    hashtag
    VestingScheduleNotRevocable

    The vesting schedule is not revocable

    hashtag
    VestingScheduleNotRevocableInPast

    Attempt to revoke a schedule in the past

    hashtag
    ZeroReleasableAmount

    No token to release

    _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

    r

    bytes32

    undefined

    s

    bytes32

    undefined

    owner

    address

    undefined

    spender

    address

    undefined

    _0

    uint256

    undefined

    spender

    address

    undefined

    amount

    uint256

    undefined

    _0

    bool

    undefined

    account

    address

    undefined

    _0

    uint256

    undefined

    _index

    uint256

    index of the vesting schedule

    _0

    uint256

    amount of releasable tokens

    _index

    uint256

    index of the vesting schedule

    _0

    uint256

    amount of vested tokens

    _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

    _0

    uint256

    index of the created vesting schedule

    delegatee

    address

    undefined

    delegatee

    address

    undefined

    nonce

    uint256

    undefined

    expiry

    uint256

    undefined

    v

    uint8

    _index

    uint256

    index of the vesting schedule

    _delegatee

    address

    address to delegate the token to

    _0

    bool

    True on success

    account

    address

    undefined

    _0

    address

    undefined

    timepoint

    uint256

    undefined

    _0

    uint256

    undefined

    account

    address

    undefined

    timepoint

    uint256

    undefined

    _0

    uint256

    undefined

    _index

    uint256

    Index of the vesting schedule

    _0

    VestingSchedulesV2.VestingSchedule

    undefined

    _0

    uint256

    count of vesting schedules

    account

    address

    undefined

    _0

    uint256

    undefined

    _account

    address

    The initial account to grant all the minted tokens

    _index

    uint256

    Index of the vesting schedule

    _0

    bool

    true if the vesting schedule should ignore the global unlock schedule

    _index

    uint256

    Index of the vesting schedule to release

    _0

    uint256

    released amount

    _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

    _0

    uint256

    undefined

    to

    address

    undefined

    amount

    uint256

    undefined

    _0

    bool

    undefined

    from

    address

    undefined

    to

    address

    undefined

    amount

    uint256

    undefined

    _0

    bool

    undefined

    _index

    uint256

    Index of the vesting schedule

    _0

    address

    address of the escrow

    owner indexed

    address

    undefined

    spender indexed

    address

    undefined

    value

    uint256

    undefined

    index

    uint256

    Vesting schedule index

    creator indexed

    address

    Creator of the vesting schedule

    beneficiary indexed

    address

    Vesting beneficiary address

    amount

    uint256

    delegator indexed

    address

    undefined

    fromDelegate indexed

    address

    undefined

    toDelegate indexed

    address

    undefined

    delegate indexed

    address

    undefined

    previousBalance

    uint256

    undefined

    newBalance

    uint256

    undefined

    index

    uint256

    Vesting schedule index

    oldDelegatee indexed

    address

    old delegatee

    newDelegatee indexed

    address

    new delegatee

    beneficiary indexed

    address

    index

    uint256

    Vesting schedule index

    releasedAmount

    uint256

    Amount of tokens released to the beneficiary

    index

    uint256

    Vesting schedule index

    returnedAmount

    uint256

    Amount of tokens returned to the creator

    newEnd

    uint256

    New end timestamp after revoke action

    from indexed

    address

    undefined

    to indexed

    address

    undefined

    value

    uint256

    undefined

    msg

    string

    undefined

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

    undefined

    Vesting schedule amount

    vesting schedule beneficiary

    function allowance(address owner, address spender) external view returns (uint256)
    function approve(address spender, uint256 amount) external nonpayable returns (bool)
    function balanceOf(address account) external view returns (uint256)
    function computeVestingReleasableAmount(uint256 _index) external view returns (uint256)
    function computeVestingVestedAmount(uint256 _index) external view returns (uint256)
    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)
    function delegate(address delegatee) external nonpayable
    function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external nonpayable
    function delegateVestingEscrow(uint256 _index, address _delegatee) external nonpayable returns (bool)
    function delegates(address account) external view returns (address)
    function getPastTotalSupply(uint256 timepoint) external view returns (uint256)
    function getPastVotes(address account, uint256 timepoint) external view returns (uint256)
    function getVestingSchedule(uint256 _index) external view returns (struct VestingSchedulesV2.VestingSchedule)
    function getVestingScheduleCount() external view returns (uint256)
    function getVotes(address account) external view returns (uint256)
    function initTLCV1(address _account) external nonpayable
    function isGlobalUnlockedScheduleIgnored(uint256 _index) external view returns (bool)
    function migrateVestingSchedules() external nonpayable
    function releaseVestingSchedule(uint256 _index) external nonpayable returns (uint256)
    function revokeVestingSchedule(uint256 _index, uint64 _end) external nonpayable returns (uint256 returnedAmount)
    function totalSupply() external view returns (uint256)
    function transfer(address to, uint256 amount) external nonpayable returns (bool)
    function transferFrom(address from, address to, uint256 amount) external nonpayable returns (bool)
    function vestingEscrow(uint256 _index) external view returns (address)
    event Approval(address indexed owner, address indexed spender, uint256 value)
    event CreatedVestingSchedule(uint256 index, address indexed creator, address indexed beneficiary, uint256 amount)
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance)
    event DelegatedVestingEscrow(uint256 index, address indexed oldDelegatee, address indexed newDelegatee, address indexed beneficiary)
    event ReleasedVestingSchedule(uint256 index, uint256 releasedAmount)
    event RevokedVestingSchedule(uint256 index, uint256 returnedAmount, uint256 newEnd)
    event Transfer(address indexed from, address indexed to, uint256 value)
    error GlobalUnlockUnderlfow()
    error InvalidRevokedVestingScheduleEnd()
    error InvalidVestingScheduleParameter(string msg)
    error UnsufficientVestingScheduleCreatorBalance()
    error VestingScheduleIsLocked()
    error VestingScheduleNotRevocable()
    error VestingScheduleNotRevocableInPast()
    error ZeroReleasableAmount()

    IOperatorsRegistryV1

    Alluvial Finance Inc.

    Operators Registry Interface (v1)

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

    hashtag
    Methods

    hashtag
    addOperator

    Adds an operator to the registry

    Only callable by the administrator

    hashtag
    Parameters

    Name
    Type
    Description

    _name

    string

    The name identifying the operator

    _operator

    address

    The address representing the operator, receiving the rewards

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The index of the new operator

    hashtag
    addValidators

    Adds new keys for an operator

    Only callable by the administrator or the operator address

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    The operator index

    _keyCount

    uint32

    The amount of keys provided

    _publicKeysAndSignatures

    bytes

    Public keys of the validator, concatenated

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    _count

    uint256

    The amount of exit requests to add to the demand

    _depositedValidatorCount

    uint256

    The total deposited validator count

    hashtag
    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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The current exit request demand

    hashtag
    getNextValidatorsToDepositFromActiveOperators

    Get the next validators that would be funded

    hashtag
    Parameters

    Name
    Type
    Description

    _count

    uint256

    Count of validators that would be funded next

    hashtag
    Returns

    Name
    Type
    Description

    publicKeys

    bytes[]

    An array of fundable public keys

    signatures

    bytes[]

    An array of signatures linked to the public keys

    hashtag
    getOperator

    Get operator details

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    The index of the operator

    hashtag
    Returns

    Name
    Type
    Description

    _0

    OperatorsV2.Operator

    The details of the operator

    hashtag
    getOperatorCount

    Get operator count

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The operator count

    hashtag
    getOperatorStoppedValidatorCount

    Retrieve the stopped validator count for an operator index

    hashtag
    Parameters

    Name
    Type
    Description

    _idx

    uint256

    The index of the operator

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint32

    The stopped validator count of the operator

    hashtag
    getRiver

    Retrieve the River address

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    The address of River

    hashtag
    getStoppedAndRequestedExitCounts

    Retrieve the total stopped and requested exit count

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint32

    The total stopped count

    _1

    uint256

    The total requested exit count

    hashtag
    getStoppedValidatorCountPerOperator

    Retrieve the raw stopped validators array from storage

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint32[]

    The stopped validator array

    hashtag
    getTotalStoppedValidatorCount

    Retrieve the total stopped validator count

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint32

    The total stopped validator count

    hashtag
    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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    The total requested exit count

    hashtag
    getValidator

    Get the details of a validator

    hashtag
    Parameters

    Name
    Type
    Description

    _operatorIndex

    uint256

    The index of the operator

    _validatorIndex

    uint256

    The index of the validator

    hashtag
    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

    hashtag
    initOperatorsRegistryV1

    Initializes the operators registry

    hashtag
    Parameters

    Name
    Type
    Description

    _admin

    address

    Admin in charge of managing operators

    _river

    address

    Address of River system

    hashtag
    initOperatorsRegistryV1_1

    Initializes the operators registry for V1_1

    hashtag
    listActiveOperators

    Retrieve the active operator set

    hashtag
    Returns

    Name
    Type
    Description

    _0

    OperatorsV2.Operator[]

    The list of active operators and their details

    hashtag
    pickNextValidatorsToDeposit

    Retrieve validator keys based on operator statuses

    hashtag
    Parameters

    Name
    Type
    Description

    _count

    uint256

    Max amount of keys requested

    hashtag
    Returns

    Name
    Type
    Description

    publicKeys

    bytes[]

    An array of public keys

    signatures

    bytes[]

    An array of signatures linked to the public keys

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    The operator index

    _indexes

    uint256[]

    The indexes of the keys to remove

    hashtag
    reportStoppedValidatorCounts

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

    hashtag
    Parameters

    Name
    Type
    Description

    _stoppedValidatorCounts

    uint32[]

    The new stopped validators array

    _depositedValidatorCount

    uint256

    The total deposited validator count

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    _count

    uint256

    Max amount of exits to request

    hashtag
    setOperatorAddress

    Changes the operator address of an operator

    Only callable by the administrator or the previous operator address

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    The operator index

    _newOperatorAddress

    address

    The new address of the operator

    hashtag
    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.

    hashtag
    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

    hashtag
    setOperatorName

    Changes the operator name

    Only callable by the administrator or the operator

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    The operator index

    _newName

    string

    The new operator name

    hashtag
    setOperatorStatus

    Changes the operator status

    Only callable by the administrator

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    The operator index

    _newStatus

    bool

    The new status of the operator

    hashtag
    Events

    hashtag
    AddedOperator

    A new operator has been added to the registry

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    name

    string

    The operator display name

    operatorAddress indexed

    address

    The operator address

    hashtag
    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)

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    publicKeysAndSignatures

    bytes

    The concatenated public keys and signatures

    hashtag
    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.

    hashtag
    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

    hashtag
    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

    hashtag
    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

    hashtag
    OperatorLimitUnchanged

    The call didn't alter the limit of the operator

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    limit

    uint256

    The limit of the operator

    hashtag
    RemovedValidatorKey

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

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    publicKey

    bytes

    The BLS public key that has been removed

    hashtag
    RequestedValidatorExits

    The requested exit count has been updated

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    count

    uint256

    The count of requested exits

    hashtag
    SetCurrentValidatorExitsDemand

    The exit request demand has been updated

    hashtag
    Parameters

    Name
    Type
    Description

    previousValidatorExitsDemand

    uint256

    The previous exit request demand

    nextValidatorExitsDemand

    uint256

    The new exit request demand

    hashtag
    SetOperatorAddress

    The operator address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    newOperatorAddress indexed

    address

    The new operator address

    hashtag
    SetOperatorLimit

    The operator limit has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    newLimit

    uint256

    The new operator staking limit

    hashtag
    SetOperatorName

    The operator display name has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    newName

    string

    The new display name

    hashtag
    SetOperatorStatus

    The operator status has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    active

    bool

    True if the operator is active

    hashtag
    SetOperatorStoppedValidatorCount

    The operator stopped validator count has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    newStoppedValidatorCount

    uint256

    The new stopped validator count

    hashtag
    SetRiver

    The stored river address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    river indexed

    address

    The new river address

    hashtag
    SetTotalValidatorExitsRequested

    The total requested exit has been updated

    hashtag
    Parameters

    Name
    Type
    Description

    previousTotalValidatorExitsRequested

    uint256

    The previous total requested exit

    newTotalValidatorExitsRequested

    uint256

    The new total requested exit

    hashtag
    UpdatedRequestedValidatorExitsUponStopped

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

    hashtag
    Parameters

    Name
    Type
    Description

    index indexed

    uint256

    The operator index

    oldRequestedExits

    uint32

    The old requested exit count

    newRequestedExits

    uint32

    The new requested exit count

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    stoppedValidatorCounts

    uint32[]

    The new stopped validator counts

    hashtag
    Errors

    hashtag
    InactiveOperator

    The calling operator is inactive

    hashtag
    Parameters

    Name
    Type
    Description

    index

    uint256

    The operator index

    hashtag
    InvalidArrayLengths

    The provided operator and limits array have different lengths

    hashtag
    InvalidEmptyArray

    The provided operator and limits array are empty

    hashtag
    InvalidEmptyStoppedValidatorCountsArray

    Thrown when an invalid empty stopped validator array is provided

    hashtag
    InvalidFundedKeyDeletionAttempt

    A funded key deletion has been attempted

    hashtag
    InvalidIndexOutOfBounds

    The index that is removed is out of bounds

    hashtag
    InvalidKeyCount

    The provided key count is 0

    hashtag
    InvalidKeysLength

    The provided concatenated keys do not have the expected length

    hashtag
    InvalidStoppedValidatorCountsSum

    Thrown when the sum of stopped validators is invalid

    hashtag
    InvalidUnsortedIndexes

    The index provided are not sorted properly (descending order)

    hashtag
    NoExitRequestsToPerform

    Thrown when no exit requests can be performed

    hashtag
    OperatorLimitTooHigh

    The value for the operator limit is too high

    hashtag
    Parameters

    Name
    Type
    Description

    index

    uint256

    The operator index

    limit

    uint256

    The new limit provided

    keyCount

    uint256

    The operator key count

    hashtag
    OperatorLimitTooLow

    The value for the limit is too low

    hashtag
    Parameters

    Name
    Type
    Description

    index

    uint256

    The operator index

    limit

    uint256

    The new limit provided

    fundedKeyCount

    uint256

    The operator funded key count

    hashtag
    StoppedValidatorCountAboveFundedCount

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

    hashtag
    Parameters

    Name
    Type
    Description

    operatorIndex

    uint256

    undefined

    stoppedCount

    uint32

    undefined

    fundedCount

    uint32

    undefined

    hashtag
    StoppedValidatorCountArrayShrinking

    The provided stopped validator count array is shrinking

    hashtag
    StoppedValidatorCountsDecreased

    Throw when an element in the stopped validator array is decreasing

    hashtag
    StoppedValidatorCountsTooHigh

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

    hashtag
    UnorderedOperatorList

    The provided list of operators is not in increasing order

    IWLSETHV1

    Alluvial Finance Inc.

    Wrapped LsETH Interface (v1)

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

    hashtag
    Methods

    hashtag
    allowance

    Retrieves the token allowance given from one address to another

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    approve

    Approves another account to transfer tokens

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    balanceOf

    Retrieves the token balance of the specified user

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    decimals

    Retrieves the token decimal count

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    decreaseAllowance

    Decrease allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    increaseAllowance

    Increase allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initWLSETHV1

    Initializes the wrapped token contract

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    name

    Retrieves the token full name

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    sharesOf

    Retrieves the raw shares count of the user

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    symbol

    Retrieves the token symbol

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    totalSupply

    Retrieves the token total supply

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transfer

    Transfers tokens between the message sender and a recipient

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transferFrom

    Transfers tokens between two accounts

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Approval

    An approval has been made

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Burn

    Tokens have been burned

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Mint

    Tokens have been minted

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetRiver

    The stored value of river has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Transfer

    A transfer has been made

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    AllowanceTooLow

    Allowance too low to perform operation

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    BalanceTooLow

    Balance too low to perform operation

    hashtag
    NullTransfer

    Invalid empty transfer

    hashtag
    TokenTransferError

    The token transfer failed during the minting or burning process

    hashtag
    UnauthorizedTransfer

    Invalid transfer recipients

    hashtag
    Parameters

    Name
    Type
    Description
    function addOperator(string _name, address _operator) external nonpayable returns (uint256)
    function addValidators(uint256 _index, uint32 _keyCount, bytes _publicKeysAndSignatures) external nonpayable
    function demandValidatorExits(uint256 _count, uint256 _depositedValidatorCount) external nonpayable
    function getCurrentValidatorExitsDemand() external view returns (uint256)
    function getNextValidatorsToDepositFromActiveOperators(uint256 _count) external view returns (bytes[] publicKeys, bytes[] signatures)
    function getOperator(uint256 _index) external view returns (struct OperatorsV2.Operator)
    function getOperatorCount() external view returns (uint256)
    function getOperatorStoppedValidatorCount(uint256 _idx) external view returns (uint32)
    function getRiver() external view returns (address)
    function getStoppedAndRequestedExitCounts() external view returns (uint32, uint256)
    function getStoppedValidatorCountPerOperator() external view returns (uint32[])
    function getTotalStoppedValidatorCount() external view returns (uint32)
    function getTotalValidatorExitsRequested() external view returns (uint256)
    function getValidator(uint256 _operatorIndex, uint256 _validatorIndex) external view returns (bytes publicKey, bytes signature, bool funded)
    function initOperatorsRegistryV1(address _admin, address _river) external nonpayable
    function initOperatorsRegistryV1_1() external nonpayable
    function listActiveOperators() external view returns (struct OperatorsV2.Operator[])
    function pickNextValidatorsToDeposit(uint256 _count) external nonpayable returns (bytes[] publicKeys, bytes[] signatures)
    function removeValidators(uint256 _index, uint256[] _indexes) external nonpayable
    function reportStoppedValidatorCounts(uint32[] _stoppedValidatorCounts, uint256 _depositedValidatorCount) external nonpayable
    function requestValidatorExits(uint256 _count) external nonpayable
    function setOperatorAddress(uint256 _index, address _newOperatorAddress) external nonpayable
    function setOperatorLimits(uint256[] _operatorIndexes, uint32[] _newLimits, uint256 _snapshotBlock) external nonpayable
    function setOperatorName(uint256 _index, string _newName) external nonpayable
    function setOperatorStatus(uint256 _index, bool _newStatus) external nonpayable
    event AddedOperator(uint256 indexed index, string name, address indexed operatorAddress)
    event AddedValidatorKeys(uint256 indexed index, bytes publicKeysAndSignatures)
    event FundedValidatorKeys(uint256 indexed index, bytes[] publicKeys, bool deferred)
    event OperatorEditsAfterSnapshot(uint256 indexed index, uint256 currentLimit, uint256 newLimit, uint256 indexed latestKeysEditBlockNumber, uint256 indexed snapshotBlock)
    event OperatorLimitUnchanged(uint256 indexed index, uint256 limit)
    event RemovedValidatorKey(uint256 indexed index, bytes publicKey)
    event RequestedValidatorExits(uint256 indexed index, uint256 count)
    event SetCurrentValidatorExitsDemand(uint256 previousValidatorExitsDemand, uint256 nextValidatorExitsDemand)
    event SetOperatorAddress(uint256 indexed index, address indexed newOperatorAddress)
    event SetOperatorLimit(uint256 indexed index, uint256 newLimit)
    event SetOperatorName(uint256 indexed index, string newName)
    event SetOperatorStatus(uint256 indexed index, bool active)
    event SetOperatorStoppedValidatorCount(uint256 indexed index, uint256 newStoppedValidatorCount)
    event SetRiver(address indexed river)
    event SetTotalValidatorExitsRequested(uint256 previousTotalValidatorExitsRequested, uint256 newTotalValidatorExitsRequested)
    event UpdatedRequestedValidatorExitsUponStopped(uint256 indexed index, uint32 oldRequestedExits, uint32 newRequestedExits)
    event UpdatedStoppedValidators(uint32[] stoppedValidatorCounts)
    error InactiveOperator(uint256 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)
    error OperatorLimitTooLow(uint256 index, uint256 limit, uint256 fundedKeyCount)
    error StoppedValidatorCountAboveFundedCount(uint256 operatorIndex, uint32 stoppedCount, uint32 fundedCount)
    error StoppedValidatorCountArrayShrinking()
    error StoppedValidatorCountsDecreased()
    error StoppedValidatorCountsTooHigh()
    error UnorderedOperatorList()

    snapshotBlock indexed

    uint256

    The block number of the snapshot

    _owner

    address

    Owner that gave the allowance

    _spender

    address

    Spender that received the allowance

    _0

    uint256

    The allowance of the owner to the spender

    _spender

    address

    Spender that receives the allowance

    _value

    uint256

    Amount to allow

    _0

    bool

    True if success

    _owner

    address

    Owner to check the balance

    _0

    uint256

    The balance of the owner

    _recipient

    address

    The account receiving the underlying LsETH tokens after shares are burned

    _shares

    uint256

    Amount of LsETH to free by burning wrapped LsETH

    _0

    uint8

    The decimal count

    _spender

    address

    Spender that receives the allowance

    _subtractableValue

    uint256

    Amount to subtract

    _0

    bool

    True if success

    _spender

    address

    Spender that receives the allowance

    _additionalValue

    uint256

    Amount to add

    _0

    bool

    True if success

    _river

    address

    Address of the River contract

    _recipient

    address

    The account receiving the new minted wrapped LsETH

    _shares

    uint256

    The amount of LsETH to wrap

    _0

    string

    The name of the token

    _owner

    address

    Owner to check the shares balance

    _0

    uint256

    The shares of the owner

    _0

    string

    The symbol of the token

    _0

    uint256

    The total supply

    _to

    address

    Recipient of the transfer

    _value

    uint256

    Amount to transfer

    _0

    bool

    True if success

    _from

    address

    Sender account

    _to

    address

    Recipient of the transfer

    _value

    uint256

    Amount to transfer

    _0

    bool

    True if success

    owner indexed

    address

    The token owner

    spender indexed

    address

    The account allowed by the owner

    value

    uint256

    The amount allowed

    recipient indexed

    address

    The account that receive the underlying LsETH

    shares

    uint256

    The amount of LsETH that got sent back

    recipient indexed

    address

    The account receiving the new tokens

    shares

    uint256

    The amount of LsETH provided

    river indexed

    address

    The new address of river

    from indexed

    address

    The transfer sender

    to indexed

    address

    The transfer recipient

    value

    uint256

    The amount transferred

    _from

    address

    Account where funds are sent from

    _operator

    address

    Account attempting the transfer

    _allowance

    uint256

    Current allowance

    _value

    uint256

    _from

    address

    Account sending the funds in the invalid transfer

    _to

    address

    Account receiving the funds in the invalid transfer

    Requested transfer value

    function allowance(address _owner, address _spender) external view returns (uint256)
    function approve(address _spender, uint256 _value) external nonpayable returns (bool)
    function balanceOf(address _owner) external view returns (uint256)
    function burn(address _recipient, uint256 _shares) external nonpayable
    function decimals() external pure returns (uint8)
    function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)
    function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)
    function initWLSETHV1(address _river) external nonpayable
    function mint(address _recipient, uint256 _shares) external nonpayable
    function name() external pure returns (string)
    function sharesOf(address _owner) external view returns (uint256)
    function symbol() external pure returns (string)
    function totalSupply() external view returns (uint256)
    function transfer(address _to, uint256 _value) external nonpayable returns (bool)
    function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)
    event Approval(address indexed owner, address indexed spender, uint256 value)
    event Burn(address indexed recipient, uint256 shares)
    event Mint(address indexed recipient, uint256 shares)
    event SetRiver(address indexed river)
    event Transfer(address indexed from, address indexed to, uint256 value)
    error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)
    error BalanceTooLow()
    error NullTransfer()
    error TokenTransferError()
    error UnauthorizedTransfer(address _from, address _to)

    OperatorsRegistryV1

    Alluvial Finance Inc.

    Operators Registry (v1)

    This contract handles the list of operators and their keys

    hashtag
    Methods

    hashtag
    acceptAdmin

    Accept the transfer of ownership

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

    hashtag
    addOperator

    Adds an operator to the registry

    Only callable by the administrator

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    addValidators

    Adds new keys for an operator

    Only callable by the administrator or the operator address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    forceFundedValidatorKeysEventEmission

    Utility to force the broadcasting of events. Will keep its progress in storage to prevent being DoSed by the number of keys

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    getAdmin

    Retrieves the current admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getNextValidatorsToDepositFromActiveOperators

    Get the next validators that would be funded

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getOperator

    Get operator details

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getOperatorCount

    Get operator count

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getOperatorStoppedValidatorCount

    Retrieve the stopped validator count for an operator index

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getPendingAdmin

    Retrieve the current pending admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getRiver

    Retrieve the River address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getStoppedAndRequestedExitCounts

    Retrieve the total stopped and requested exit count

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getStoppedValidatorCountPerOperator

    Retrieve the raw stopped validators array from storage

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getTotalStoppedValidatorCount

    Retrieve the total stopped validator count

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getValidator

    Get the details of a validator

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initOperatorsRegistryV1

    Initializes the operators registry

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    initOperatorsRegistryV1_1

    Initializes the operators registry for V1_1

    hashtag
    listActiveOperators

    Retrieve the active operator set

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    pickNextValidatorsToDeposit

    Retrieve validator keys based on operator statuses

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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 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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    reportStoppedValidatorCounts

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setOperatorAddress

    Changes the operator address of an operator

    Only callable by the administrator or the previous operator address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setOperatorName

    Changes the operator name

    Only callable by the administrator or the operator

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setOperatorStatus

    Changes the operator status

    Only callable by the administrator

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    version

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    AddedOperator

    A new operator has been added to the registry

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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)

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    OperatorLimitUnchanged

    The call didn't alter the limit of the operator

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    RemovedValidatorKey

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    RequestedValidatorExits

    The requested exit count has been updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetAdmin

    The admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetCurrentValidatorExitsDemand

    The exit request demand has been updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetOperatorAddress

    The operator address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetOperatorLimit

    The operator limit has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetOperatorName

    The operator display name has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetOperatorStatus

    The operator status has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetOperatorStoppedValidatorCount

    The operator stopped validator count has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetPendingAdmin

    The pending admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetRiver

    The stored river address has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetTotalValidatorExitsRequested

    The total requested exit has been updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    UpdatedRequestedValidatorExitsUponStopped

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    FundedKeyEventMigrationComplete

    Emitted when the event rebroadcasting is done and we attempt to broadcast new events

    hashtag
    InactiveOperator

    The calling operator is inactive

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidArrayLengths

    The provided operator and limits array have different lengths

    hashtag
    InvalidEmptyArray

    The provided operator and limits array are empty

    hashtag
    InvalidEmptyStoppedValidatorCountsArray

    Thrown when an invalid empty stopped validator array is provided

    hashtag
    InvalidEmptyString

    The string is empty

    hashtag
    InvalidFundedKeyDeletionAttempt

    A funded key deletion has been attempted

    hashtag
    InvalidIndexOutOfBounds

    The index that is removed is out of bounds

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidKeyCount

    The provided key count is 0

    hashtag
    InvalidKeysLength

    The provided concatenated keys do not have the expected length

    hashtag
    InvalidStoppedValidatorCountsSum

    Thrown when the sum of stopped validators is invalid

    hashtag
    InvalidUnsortedIndexes

    The index provided are not sorted properly (descending order)

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    NoExitRequestsToPerform

    Thrown when no exit requests can be performed

    hashtag
    OperatorLimitTooHigh

    The value for the operator limit is too high

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    OperatorLimitTooLow

    The value for the limit is too low

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    OperatorNotFound

    The operator was not found

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SliceOutOfBounds

    The slice is outside of the initial bytes bounds

    hashtag
    SliceOverflow

    The length overflows an uint

    hashtag
    StoppedValidatorCountAboveFundedCount

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    StoppedValidatorCountArrayShrinking

    The provided stopped validator count array is shrinking

    hashtag
    StoppedValidatorCountsDecreased

    Throw when an element in the stopped validator array is decreasing

    hashtag
    StoppedValidatorCountsTooHigh

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

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    UnorderedOperatorList

    The provided list of operators is not in increasing order

    snapshotBlock indexed

    uint256

    The block number of the snapshot

    _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

    _index

    uint256

    The operator index

    _keyCount

    uint32

    The amount of keys provided

    _publicKeysAndSignatures

    bytes

    Public keys of the validator, concatenated

    _count

    uint256

    The amount of exit requests to add to the demand

    _depositedValidatorCount

    uint256

    The total deposited validator count

    _amountToEmit

    uint256

    The amount of events to emit at maximum in this call

    _0

    address

    The admin address

    _0

    uint256

    The current exit request demand

    _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

    _index

    uint256

    The index of the operator

    _0

    OperatorsV2.Operator

    The details of the operator

    _0

    uint256

    The operator count

    _idx

    uint256

    The index of the operator

    _0

    uint32

    The stopped validator count of the operator

    _0

    address

    The pending admin address

    _0

    address

    The address of River

    _0

    uint32

    The total stopped count

    _1

    uint256

    The total requested exit count

    _0

    uint32[]

    The stopped validator array

    _0

    uint32

    The total stopped validator count

    _0

    uint256

    The total requested exit count

    _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

    _admin

    address

    Admin in charge of managing operators

    _river

    address

    Address of River system

    _0

    OperatorsV2.Operator[]

    The list of active operators and their details

    _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

    _newAdmin

    address

    New admin address

    _index

    uint256

    The operator index

    _indexes

    uint256[]

    The indexes of the keys to remove

    _stoppedValidatorCounts

    uint32[]

    The new stopped validators array

    _depositedValidatorCount

    uint256

    The total deposited validator count

    _count

    uint256

    Max amount of exits to request

    _index

    uint256

    The operator index

    _newOperatorAddress

    address

    The new address of the operator

    _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

    _index

    uint256

    The operator index

    _newName

    string

    The new operator name

    _index

    uint256

    The operator index

    _newStatus

    bool

    The new status of the operator

    _0

    string

    Version of the contract

    index indexed

    uint256

    The operator index

    name

    string

    The operator display name

    operatorAddress indexed

    address

    The operator address

    index indexed

    uint256

    The operator index

    publicKeysAndSignatures

    bytes

    The concatenated public keys and signatures

    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

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    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

    index indexed

    uint256

    The operator index

    limit

    uint256

    The limit of the operator

    index indexed

    uint256

    The operator index

    publicKey

    bytes

    The BLS public key that has been removed

    index indexed

    uint256

    The operator index

    count

    uint256

    The count of requested exits

    admin indexed

    address

    New admin address

    previousValidatorExitsDemand

    uint256

    The previous exit request demand

    nextValidatorExitsDemand

    uint256

    The new exit request demand

    index indexed

    uint256

    The operator index

    newOperatorAddress indexed

    address

    The new operator address

    index indexed

    uint256

    The operator index

    newLimit

    uint256

    The new operator staking limit

    index indexed

    uint256

    The operator index

    newName

    string

    The new display name

    index indexed

    uint256

    The operator index

    active

    bool

    True if the operator is active

    index indexed

    uint256

    The operator index

    newStoppedValidatorCount

    uint256

    The new stopped validator count

    pendingAdmin indexed

    address

    New pending admin address

    river indexed

    address

    The new river address

    previousTotalValidatorExitsRequested

    uint256

    The previous total requested exit

    newTotalValidatorExitsRequested

    uint256

    The new total requested exit

    index indexed

    uint256

    The operator index

    oldRequestedExits

    uint32

    The old requested exit count

    newRequestedExits

    uint32

    The new requested exit count

    stoppedValidatorCounts

    uint32[]

    The new stopped validator counts

    index

    uint256

    The operator index

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    index

    uint256

    The operator index

    limit

    uint256

    The new limit provided

    keyCount

    uint256

    The operator key count

    index

    uint256

    The operator index

    limit

    uint256

    The new limit provided

    fundedKeyCount

    uint256

    The operator funded key count

    index

    uint256

    The provided index

    operatorIndex

    uint256

    undefined

    stoppedCount

    uint32

    undefined

    fundedCount

    uint32

    undefined

    caller

    address

    Address performing the call

    function acceptAdmin() external nonpayable
    function addOperator(string _name, address _operator) external nonpayable returns (uint256)
    function addValidators(uint256 _index, uint32 _keyCount, bytes _publicKeysAndSignatures) external nonpayable
    function demandValidatorExits(uint256 _count, uint256 _depositedValidatorCount) external nonpayable
    function forceFundedValidatorKeysEventEmission(uint256 _amountToEmit) external nonpayable
    function getAdmin() external view returns (address)
    function getCurrentValidatorExitsDemand() external view returns (uint256)
    function getNextValidatorsToDepositFromActiveOperators(uint256 _count) external view returns (bytes[] publicKeys, bytes[] signatures)
    function getOperator(uint256 _index) external view returns (struct OperatorsV2.Operator)
    function getOperatorCount() external view returns (uint256)
    function getOperatorStoppedValidatorCount(uint256 _idx) external view returns (uint32)
    function getPendingAdmin() external view returns (address)
    function getRiver() external view returns (address)
    function getStoppedAndRequestedExitCounts() external view returns (uint32, uint256)
    function getStoppedValidatorCountPerOperator() external view returns (uint32[])
    function getTotalStoppedValidatorCount() external view returns (uint32)
    function getTotalValidatorExitsRequested() external view returns (uint256)
    function getValidator(uint256 _operatorIndex, uint256 _validatorIndex) external view returns (bytes publicKey, bytes signature, bool funded)
    function initOperatorsRegistryV1(address _admin, address _river) external nonpayable
    function initOperatorsRegistryV1_1() external nonpayable
    function listActiveOperators() external view returns (struct OperatorsV2.Operator[])
    function pickNextValidatorsToDeposit(uint256 _count) external nonpayable returns (bytes[] publicKeys, bytes[] signatures)
    function proposeAdmin(address _newAdmin) external nonpayable
    function removeValidators(uint256 _index, uint256[] _indexes) external nonpayable
    function reportStoppedValidatorCounts(uint32[] _stoppedValidatorCounts, uint256 _depositedValidatorCount) external nonpayable
    function requestValidatorExits(uint256 _count) external nonpayable
    function setOperatorAddress(uint256 _index, address _newOperatorAddress) external nonpayable
    function setOperatorLimits(uint256[] _operatorIndexes, uint32[] _newLimits, uint256 _snapshotBlock) external nonpayable
    function setOperatorName(uint256 _index, string _newName) external nonpayable
    function setOperatorStatus(uint256 _index, bool _newStatus) external nonpayable
    function version() external pure returns (string)
    event AddedOperator(uint256 indexed index, string name, address indexed operatorAddress)
    event AddedValidatorKeys(uint256 indexed index, bytes publicKeysAndSignatures)
    event FundedValidatorKeys(uint256 indexed index, bytes[] publicKeys, bool deferred)
    event Initialize(uint256 version, bytes cdata)
    event OperatorEditsAfterSnapshot(uint256 indexed index, uint256 currentLimit, uint256 newLimit, uint256 indexed latestKeysEditBlockNumber, uint256 indexed snapshotBlock)
    event OperatorLimitUnchanged(uint256 indexed index, uint256 limit)
    event RemovedValidatorKey(uint256 indexed index, bytes publicKey)
    event RequestedValidatorExits(uint256 indexed index, uint256 count)
    event SetAdmin(address indexed admin)
    event SetCurrentValidatorExitsDemand(uint256 previousValidatorExitsDemand, uint256 nextValidatorExitsDemand)
    event SetOperatorAddress(uint256 indexed index, address indexed newOperatorAddress)
    event SetOperatorLimit(uint256 indexed index, uint256 newLimit)
    event SetOperatorName(uint256 indexed index, string newName)
    event SetOperatorStatus(uint256 indexed index, bool active)
    event SetOperatorStoppedValidatorCount(uint256 indexed index, uint256 newStoppedValidatorCount)
    event SetPendingAdmin(address indexed pendingAdmin)
    event SetRiver(address indexed river)
    event SetTotalValidatorExitsRequested(uint256 previousTotalValidatorExitsRequested, uint256 newTotalValidatorExitsRequested)
    event UpdatedRequestedValidatorExitsUponStopped(uint256 indexed index, uint32 oldRequestedExits, uint32 newRequestedExits)
    event UpdatedStoppedValidators(uint32[] stoppedValidatorCounts)
    error FundedKeyEventMigrationComplete()
    error InactiveOperator(uint256 index)
    error InvalidArrayLengths()
    error InvalidEmptyArray()
    error InvalidEmptyStoppedValidatorCountsArray()
    error InvalidEmptyString()
    error InvalidFundedKeyDeletionAttempt()
    error InvalidIndexOutOfBounds()
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    error InvalidKeyCount()
    error InvalidKeysLength()
    error InvalidStoppedValidatorCountsSum()
    error InvalidUnsortedIndexes()
    error InvalidZeroAddress()
    error NoExitRequestsToPerform()
    error OperatorLimitTooHigh(uint256 index, uint256 limit, uint256 keyCount)
    error OperatorLimitTooLow(uint256 index, uint256 limit, uint256 fundedKeyCount)
    error OperatorNotFound(uint256 index)
    error SliceOutOfBounds()
    error SliceOverflow()
    error StoppedValidatorCountAboveFundedCount(uint256 operatorIndex, uint32 stoppedCount, uint32 fundedCount)
    error StoppedValidatorCountArrayShrinking()
    error StoppedValidatorCountsDecreased()
    error StoppedValidatorCountsTooHigh()
    error Unauthorized(address caller)
    error UnorderedOperatorList()

    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

    hashtag
    Methods

    hashtag
    CLOCK_MODE

    Description of the clock

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    DOMAIN_SEPARATOR

    See {IERC20Permit-DOMAIN_SEPARATOR}.

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    allowance

    See {IERC20-allowance}.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    approve

    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    balanceOf

    See {IERC20-balanceOf}.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    checkpoints

    Get the pos-th checkpoint for account.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    clock

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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    computeVestingReleasableAmount

    Computes the releasable amount of tokens for a vesting schedule.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    computeVestingVestedAmount

    Computes the vested amount of tokens for a vesting schedule.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    decimals

    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}.

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    decreaseAllowance

    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    delegate

    Delegate votes from the sender to delegatee.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    delegateBySig

    Delegates votes from signer to delegatee

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    delegateVestingEscrow

    Delegate vesting escrowed tokens

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    delegates

    Get the address account is currently delegating to.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    eip712Domain

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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getPastTotalSupply

    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getPastVotes

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getVestingScheduleCount

    Get count of vesting schedules

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getVotes

    Gets the current votes balance for account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    increaseAllowance

    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initTLCV1

    Initializes the TLC Token

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    isGlobalUnlockedScheduleIgnored

    Get vesting global unlock schedule activation status for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    migrateVestingSchedules

    Migrates the vesting schedule state structures

    hashtag
    name

    Returns the name of the token.

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    nonces

    See {IERC20Permit-nonces}.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    numCheckpoints

    Get number of checkpoints for account.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    permit

    See {IERC20Permit-permit}.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    revokeVestingSchedule

    Revoke vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    symbol

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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    totalSupply

    See {IERC20-totalSupply}.

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transferFrom

    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    vestingEscrow

    Get the address of the escrow for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Approval

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    CreatedVestingSchedule

    A new vesting schedule has been created

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    DelegateChanged

    Emitted when an account changes their delegate.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    DelegateVotesChanged

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    DelegatedVestingEscrow

    Vesting escrow has been delegated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    EIP712DomainChanged

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

    hashtag
    Initialized

    Triggered when the contract has been initialized or reinitialized.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ReleasedVestingSchedule

    Vesting schedule has been released

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    RevokedVestingSchedule

    Vesting schedule has been revoked

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    GlobalUnlockUnderlfow

    Underflow in global unlock logic (should never happen)

    hashtag
    InvalidRevokedVestingScheduleEnd

    Attempt to revoke a vesting schedule with an invalid end parameter

    hashtag
    InvalidVestingScheduleParameter

    Invalid parameter for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    UnsufficientVestingScheduleCreatorBalance

    Vesting schedule creator has unsufficient balance to create vesting schedule

    hashtag
    VestingScheduleIsLocked

    The vesting schedule is locked

    hashtag
    VestingScheduleNotFound

    The VestingSchedule was not found

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    VestingScheduleNotRevocable

    The vesting schedule is not revocable

    hashtag
    VestingScheduleNotRevocableInPast

    Attempt to revoke a schedule in the past

    hashtag
    ZeroReleasableAmount

    No token to release

    ERC20VestableVotesUpgradeableV1

    Alluvial Finance Inc.

    ERC20VestableVotesUpgradeableV1

    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.

    _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

    r

    bytes32

    undefined

    s

    bytes32

    undefined

    verifyingContract

    address

    undefined

    salt

    bytes32

    undefined

    extensions

    uint256[]

    undefined

    v

    uint8

    undefined

    r

    bytes32

    undefined

    s

    bytes32

    undefined

    _0

    string

    undefined

    _0

    bytes32

    undefined

    owner

    address

    undefined

    spender

    address

    undefined

    _0

    uint256

    undefined

    spender

    address

    undefined

    amount

    uint256

    undefined

    _0

    bool

    undefined

    account

    address

    undefined

    _0

    uint256

    undefined

    account

    address

    undefined

    pos

    uint32

    undefined

    _0

    ERC20VotesUpgradeable.Checkpoint

    undefined

    _0

    uint48

    undefined

    _index

    uint256

    index of the vesting schedule

    _0

    uint256

    amount of releasable tokens

    _index

    uint256

    index of the vesting schedule

    _0

    uint256

    amount of vested tokens

    _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

    _0

    uint256

    index of the created vesting schedule

    _0

    uint8

    undefined

    spender

    address

    undefined

    subtractedValue

    uint256

    undefined

    _0

    bool

    undefined

    delegatee

    address

    undefined

    delegatee

    address

    undefined

    nonce

    uint256

    undefined

    expiry

    uint256

    undefined

    v

    uint8

    _index

    uint256

    index of the vesting schedule

    _delegatee

    address

    address to delegate the token to

    _0

    bool

    True on success

    account

    address

    undefined

    _0

    address

    undefined

    fields

    bytes1

    undefined

    name

    string

    undefined

    version

    string

    undefined

    chainId

    uint256

    timepoint

    uint256

    undefined

    _0

    uint256

    undefined

    account

    address

    undefined

    timepoint

    uint256

    undefined

    _0

    uint256

    undefined

    _index

    uint256

    Index of the vesting schedule

    _0

    VestingSchedulesV2.VestingSchedule

    undefined

    _0

    uint256

    count of vesting schedules

    account

    address

    undefined

    _0

    uint256

    undefined

    spender

    address

    undefined

    addedValue

    uint256

    undefined

    _0

    bool

    undefined

    _account

    address

    The initial account to grant all the minted tokens

    _index

    uint256

    Index of the vesting schedule

    _0

    bool

    true if the vesting schedule should ignore the global unlock schedule

    _0

    string

    undefined

    owner

    address

    undefined

    _0

    uint256

    undefined

    account

    address

    undefined

    _0

    uint32

    undefined

    owner

    address

    undefined

    spender

    address

    undefined

    value

    uint256

    undefined

    deadline

    uint256

    _index

    uint256

    Index of the vesting schedule to release

    _0

    uint256

    released amount

    _index

    uint256

    Index of the vesting schedule to revoke

    _end

    uint64

    End date for the schedule

    _0

    uint256

    amount returned to the vesting schedule creator

    _0

    string

    undefined

    _0

    uint256

    undefined

    to

    address

    undefined

    amount

    uint256

    undefined

    _0

    bool

    undefined

    from

    address

    undefined

    to

    address

    undefined

    amount

    uint256

    undefined

    _0

    bool

    undefined

    _index

    uint256

    Index of the vesting schedule

    _0

    address

    address of the escrow

    owner indexed

    address

    undefined

    spender indexed

    address

    undefined

    value

    uint256

    undefined

    index

    uint256

    Vesting schedule index

    creator indexed

    address

    Creator of the vesting schedule

    beneficiary indexed

    address

    Vesting beneficiary address

    amount

    uint256

    delegator indexed

    address

    undefined

    fromDelegate indexed

    address

    undefined

    toDelegate indexed

    address

    undefined

    delegate indexed

    address

    undefined

    previousBalance

    uint256

    undefined

    newBalance

    uint256

    undefined

    index

    uint256

    Vesting schedule index

    oldDelegatee indexed

    address

    old delegatee

    newDelegatee indexed

    address

    new delegatee

    beneficiary indexed

    address

    version

    uint8

    undefined

    index

    uint256

    Vesting schedule index

    releasedAmount

    uint256

    Amount of tokens released to the beneficiary

    index

    uint256

    Vesting schedule index

    returnedAmount

    uint256

    Amount of tokens returned to the creator

    newEnd

    uint256

    New end timestamp after revoke action

    from indexed

    address

    undefined

    to indexed

    address

    undefined

    value

    uint256

    undefined

    msg

    string

    undefined

    caller

    address

    Address performing the call

    index

    uint256

    vesting schedule index

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

    undefined

    undefined

    undefined

    Vesting schedule amount

    vesting schedule beneficiary

    function CLOCK_MODE() external view returns (string)
    function DOMAIN_SEPARATOR() external view returns (bytes32)
    function allowance(address owner, address spender) external view returns (uint256)
    function approve(address spender, uint256 amount) external nonpayable returns (bool)
    function balanceOf(address account) external view returns (uint256)
    function checkpoints(address account, uint32 pos) external view returns (struct ERC20VotesUpgradeable.Checkpoint)
    function clock() external view returns (uint48)
    function computeVestingReleasableAmount(uint256 _index) external view returns (uint256)
    function computeVestingVestedAmount(uint256 _index) external view returns (uint256)
    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)
    function decimals() external view returns (uint8)
    function decreaseAllowance(address spender, uint256 subtractedValue) external nonpayable returns (bool)
    function delegate(address delegatee) external nonpayable
    function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external nonpayable
    function delegateVestingEscrow(uint256 _index, address _delegatee) external nonpayable returns (bool)
    function delegates(address account) external view returns (address)
    function eip712Domain() external view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
    function getPastTotalSupply(uint256 timepoint) external view returns (uint256)
    function getPastVotes(address account, uint256 timepoint) external view returns (uint256)
    function getVestingSchedule(uint256 _index) external view returns (struct VestingSchedulesV2.VestingSchedule)
    function getVestingScheduleCount() external view returns (uint256)
    function getVotes(address account) external view returns (uint256)
    function increaseAllowance(address spender, uint256 addedValue) external nonpayable returns (bool)
    function initTLCV1(address _account) external nonpayable
    function isGlobalUnlockedScheduleIgnored(uint256 _index) external view returns (bool)
    function migrateVestingSchedules() external nonpayable
    function name() external view returns (string)
    function nonces(address owner) external view returns (uint256)
    function numCheckpoints(address account) external view returns (uint32)
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external nonpayable
    function releaseVestingSchedule(uint256 _index) external nonpayable returns (uint256)
    function revokeVestingSchedule(uint256 _index, uint64 _end) external nonpayable returns (uint256)
    function symbol() external view returns (string)
    function totalSupply() external view returns (uint256)
    function transfer(address to, uint256 amount) external nonpayable returns (bool)
    function transferFrom(address from, address to, uint256 amount) external nonpayable returns (bool)
    function vestingEscrow(uint256 _index) external view returns (address)
    event Approval(address indexed owner, address indexed spender, uint256 value)
    event CreatedVestingSchedule(uint256 index, address indexed creator, address indexed beneficiary, uint256 amount)
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance)
    event DelegatedVestingEscrow(uint256 index, address indexed oldDelegatee, address indexed newDelegatee, address indexed beneficiary)
    event EIP712DomainChanged()
    event Initialized(uint8 version)
    event ReleasedVestingSchedule(uint256 index, uint256 releasedAmount)
    event RevokedVestingSchedule(uint256 index, uint256 returnedAmount, uint256 newEnd)
    event Transfer(address indexed from, address indexed to, uint256 value)
    error GlobalUnlockUnderlfow()
    error InvalidRevokedVestingScheduleEnd()
    error InvalidVestingScheduleParameter(string msg)
    error InvalidZeroAddress()
    error Unauthorized(address caller)
    error UnsufficientVestingScheduleCreatorBalance()
    error VestingScheduleIsLocked()
    error VestingScheduleNotFound(uint256 index)
    error VestingScheduleNotRevocable()
    error VestingScheduleNotRevocableInPast()
    error ZeroReleasableAmount()

    hashtag
    Methods

    hashtag
    CLOCK_MODE

    Description of the clock

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    undefined

    hashtag
    DOMAIN_SEPARATOR

    See {IERC20Permit-DOMAIN_SEPARATOR}.

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bytes32

    undefined

    hashtag
    allowance

    See {IERC20-allowance}.

    hashtag
    Parameters

    Name
    Type
    Description

    owner

    address

    undefined

    spender

    address

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    approve

    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.

    hashtag
    Parameters

    Name
    Type
    Description

    spender

    address

    undefined

    amount

    uint256

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    undefined

    hashtag
    balanceOf

    See {IERC20-balanceOf}.

    hashtag
    Parameters

    Name
    Type
    Description

    account

    address

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    checkpoints

    Get the pos-th checkpoint for account.

    hashtag
    Parameters

    Name
    Type
    Description

    account

    address

    undefined

    pos

    uint32

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    ERC20VotesUpgradeable.Checkpoint

    undefined

    hashtag
    clock

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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint48

    undefined

    hashtag
    computeVestingReleasableAmount

    Computes the releasable amount of tokens for a vesting schedule.

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    amount of releasable tokens

    hashtag
    computeVestingVestedAmount

    Computes the vested amount of tokens for a vesting schedule.

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    amount of vested tokens

    hashtag
    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.

    hashtag
    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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    index of the created vesting schedule

    hashtag
    decimals

    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}.

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint8

    undefined

    hashtag
    decreaseAllowance

    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.

    hashtag
    Parameters

    Name
    Type
    Description

    spender

    address

    undefined

    subtractedValue

    uint256

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    undefined

    hashtag
    delegate

    Delegate votes from the sender to delegatee.

    hashtag
    Parameters

    Name
    Type
    Description

    delegatee

    address

    undefined

    hashtag
    delegateBySig

    Delegates votes from signer to delegatee

    hashtag
    Parameters

    Name
    Type
    Description

    delegatee

    address

    undefined

    nonce

    uint256

    undefined

    expiry

    uint256

    undefined

    v

    uint8

    hashtag
    delegateVestingEscrow

    Delegate vesting escrowed tokens

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    index of the vesting schedule

    _delegatee

    address

    address to delegate the token to

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    True on success

    hashtag
    delegates

    Get the address account is currently delegating to.

    hashtag
    Parameters

    Name
    Type
    Description

    account

    address

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    undefined

    hashtag
    eip712Domain

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

    hashtag
    Returns

    Name
    Type
    Description

    fields

    bytes1

    undefined

    name

    string

    undefined

    version

    string

    undefined

    chainId

    uint256

    undefined

    hashtag
    getPastTotalSupply

    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

    hashtag
    Parameters

    Name
    Type
    Description

    timepoint

    uint256

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    getPastVotes

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

    hashtag
    Parameters

    Name
    Type
    Description

    account

    address

    undefined

    timepoint

    uint256

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    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

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    VestingSchedulesV2.VestingSchedule

    undefined

    hashtag
    getVestingScheduleCount

    Get count of vesting schedules

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    count of vesting schedules

    hashtag
    getVotes

    Gets the current votes balance for account

    hashtag
    Parameters

    Name
    Type
    Description

    account

    address

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    increaseAllowance

    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.

    hashtag
    Parameters

    Name
    Type
    Description

    spender

    address

    undefined

    addedValue

    uint256

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    undefined

    hashtag
    isGlobalUnlockedScheduleIgnored

    Get vesting global unlock schedule activation status for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    true if the vesting schedule should ignore the global unlock schedule

    hashtag
    name

    Returns the name of the token.

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    undefined

    hashtag
    nonces

    See {IERC20Permit-nonces}.

    hashtag
    Parameters

    Name
    Type
    Description

    owner

    address

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    numCheckpoints

    Get number of checkpoints for account.

    hashtag
    Parameters

    Name
    Type
    Description

    account

    address

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint32

    undefined

    hashtag
    permit

    See {IERC20Permit-permit}.

    hashtag
    Parameters

    Name
    Type
    Description

    owner

    address

    undefined

    spender

    address

    undefined

    value

    uint256

    undefined

    deadline

    uint256

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule to release

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    released amount

    hashtag
    revokeVestingSchedule

    Revoke vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule to revoke

    _end

    uint64

    End date for the schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    amount returned to the vesting schedule creator

    hashtag
    symbol

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

    hashtag
    Returns

    Name
    Type
    Description

    _0

    string

    undefined

    hashtag
    totalSupply

    See {IERC20-totalSupply}.

    hashtag
    Returns

    Name
    Type
    Description

    _0

    uint256

    undefined

    hashtag
    transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    to

    address

    undefined

    amount

    uint256

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    undefined

    hashtag
    transferFrom

    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.

    hashtag
    Parameters

    Name
    Type
    Description

    from

    address

    undefined

    to

    address

    undefined

    amount

    uint256

    undefined

    hashtag
    Returns

    Name
    Type
    Description

    _0

    bool

    undefined

    hashtag
    vestingEscrow

    Get the address of the escrow for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    _index

    uint256

    Index of the vesting schedule

    hashtag
    Returns

    Name
    Type
    Description

    _0

    address

    address of the escrow

    hashtag
    Events

    hashtag
    Approval

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

    hashtag
    Parameters

    Name
    Type
    Description

    owner indexed

    address

    undefined

    spender indexed

    address

    undefined

    value

    uint256

    undefined

    hashtag
    CreatedVestingSchedule

    A new vesting schedule has been created

    hashtag
    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

    hashtag
    DelegateChanged

    Emitted when an account changes their delegate.

    hashtag
    Parameters

    Name
    Type
    Description

    delegator indexed

    address

    undefined

    fromDelegate indexed

    address

    undefined

    toDelegate indexed

    address

    undefined

    hashtag
    DelegateVotesChanged

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

    hashtag
    Parameters

    Name
    Type
    Description

    delegate indexed

    address

    undefined

    previousBalance

    uint256

    undefined

    newBalance

    uint256

    undefined

    hashtag
    DelegatedVestingEscrow

    Vesting escrow has been delegated

    hashtag
    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

    hashtag
    EIP712DomainChanged

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

    hashtag
    Initialized

    Triggered when the contract has been initialized or reinitialized.

    hashtag
    Parameters

    Name
    Type
    Description

    version

    uint8

    undefined

    hashtag
    ReleasedVestingSchedule

    Vesting schedule has been released

    hashtag
    Parameters

    Name
    Type
    Description

    index

    uint256

    Vesting schedule index

    releasedAmount

    uint256

    Amount of tokens released to the beneficiary

    hashtag
    RevokedVestingSchedule

    Vesting schedule has been revoked

    hashtag
    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

    hashtag
    Transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    from indexed

    address

    undefined

    to indexed

    address

    undefined

    value

    uint256

    undefined

    hashtag
    Errors

    hashtag
    GlobalUnlockUnderlfow

    Underflow in global unlock logic (should never happen)

    hashtag
    InvalidRevokedVestingScheduleEnd

    Attempt to revoke a vesting schedule with an invalid end parameter

    hashtag
    InvalidVestingScheduleParameter

    Invalid parameter for a vesting schedule

    hashtag
    Parameters

    Name
    Type
    Description

    msg

    string

    undefined

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    caller

    address

    Address performing the call

    hashtag
    UnsufficientVestingScheduleCreatorBalance

    Vesting schedule creator has unsufficient balance to create vesting schedule

    hashtag
    VestingScheduleIsLocked

    The vesting schedule is locked

    hashtag
    VestingScheduleNotFound

    The VestingSchedule was not found

    hashtag
    Parameters

    Name
    Type
    Description

    index

    uint256

    vesting schedule index

    hashtag
    VestingScheduleNotRevocable

    The vesting schedule is not revocable

    hashtag
    VestingScheduleNotRevocableInPast

    Attempt to revoke a schedule in the past

    hashtag
    ZeroReleasableAmount

    No token to release

    ERC20VotesUpgradeablearrow-up-right
    function CLOCK_MODE() external view returns (string)
    function DOMAIN_SEPARATOR() external view returns (bytes32)
    function allowance(address owner, address spender) external view returns (uint256)
    function approve(address spender, uint256 amount) external nonpayable returns (bool)
    function balanceOf(address account) external view returns (uint256)
    function checkpoints(address account, uint32 pos) external view returns (struct ERC20VotesUpgradeable.Checkpoint)
    function clock() external view returns (uint48)
    function computeVestingReleasableAmount(uint256 _index) external view returns (uint256)
    function computeVestingVestedAmount(uint256 _index) external view returns (uint256)
    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)
    function decimals() external view returns (uint8)
    function decreaseAllowance(address spender, uint256 subtractedValue) external nonpayable returns (bool)
    function delegate(address delegatee) external nonpayable
    function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external nonpayable
    function delegateVestingEscrow(uint256 _index, address _delegatee) external nonpayable returns (bool)
    function delegates(address account) external view returns (address)
    function eip712Domain() external view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
    function getPastTotalSupply(uint256 timepoint) external view returns (uint256)
    function getPastVotes(address account, uint256 timepoint) external view returns (uint256)
    function getVestingSchedule(uint256 _index) external view returns (struct VestingSchedulesV2.VestingSchedule)
    function getVestingScheduleCount() external view returns (uint256)
    function getVotes(address account) external view returns (uint256)
    function increaseAllowance(address spender, uint256 addedValue) external nonpayable returns (bool)
    function isGlobalUnlockedScheduleIgnored(uint256 _index) external view returns (bool)
    function name() external view returns (string)
    function nonces(address owner) external view returns (uint256)
    function numCheckpoints(address account) external view returns (uint32)
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external nonpayable
    function releaseVestingSchedule(uint256 _index) external nonpayable returns (uint256)
    function revokeVestingSchedule(uint256 _index, uint64 _end) external nonpayable returns (uint256)
    function symbol() external view returns (string)
    function totalSupply() external view returns (uint256)
    function transfer(address to, uint256 amount) external nonpayable returns (bool)
    function transferFrom(address from, address to, uint256 amount) external nonpayable returns (bool)
    function vestingEscrow(uint256 _index) external view returns (address)
    event Approval(address indexed owner, address indexed spender, uint256 value)
    event CreatedVestingSchedule(uint256 index, address indexed creator, address indexed beneficiary, uint256 amount)
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance)
    event DelegatedVestingEscrow(uint256 index, address indexed oldDelegatee, address indexed newDelegatee, address indexed beneficiary)
    event EIP712DomainChanged()
    event Initialized(uint8 version)
    event ReleasedVestingSchedule(uint256 index, uint256 releasedAmount)
    event RevokedVestingSchedule(uint256 index, uint256 returnedAmount, uint256 newEnd)
    event Transfer(address indexed from, address indexed to, uint256 value)
    error GlobalUnlockUnderlfow()
    error InvalidRevokedVestingScheduleEnd()
    error InvalidVestingScheduleParameter(string msg)
    error Unauthorized(address caller)
    error UnsufficientVestingScheduleCreatorBalance()
    error VestingScheduleIsLocked()
    error VestingScheduleNotFound(uint256 index)
    error VestingScheduleNotRevocable()
    error VestingScheduleNotRevocableInPast()
    error ZeroReleasableAmount()

    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

    undefined

    r

    bytes32

    undefined

    s

    bytes32

    undefined

    verifyingContract

    address

    undefined

    salt

    bytes32

    undefined

    extensions

    uint256[]

    undefined

    undefined

    v

    uint8

    undefined

    r

    bytes32

    undefined

    s

    bytes32

    undefined

    Vesting schedule amount

    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.

    hashtag
    Methods

    hashtag
    DEPOSIT_SIZE

    Size of a deposit in ETH

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    PUBLIC_KEY_LENGTH

    Size of a BLS Public key in bytes

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    SIGNATURE_LENGTH

    Size of a BLS Signature in bytes

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    _DEPOSIT_SIZE

    Size of a deposit in ETH

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    acceptAdmin

    Accept the transfer of ownership

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

    hashtag
    allowance

    Retrieve the allowance value for a spender

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    approve

    Approves an account for future spendings

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    balanceOf

    Retrieve the balance of an account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    balanceOfUnderlying

    Retrieve the underlying asset balance of an account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    claimRedeemRequests

    Claims several redeem requests

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    decimals

    Retrieve the decimal count

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    decreaseAllowance

    Decrease allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    deposit

    Explicit deposit method to mint on msg.sender

    hashtag
    depositAndTransfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    depositToConsensusLayerWithDepositRoot

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    getAdmin

    Retrieves the current admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getAllowlist

    Retrieve the allowlist address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getBalanceToDeposit

    Returns the amount of ETH not yet committed for deposit

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getBalanceToRedeem

    Retrieve the current balance to redeem

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCLSpec

    Retrieve the current cl spec

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCLValidatorCount

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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCLValidatorTotalBalance

    Get CL validator total balance

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCollector

    Retrieve the collector address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCommittedBalance

    Returns the amount of ETH committed for deposit

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCoverageFund

    Retrieve the coverage fund

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCurrentEpochId

    Retrieve the current epoch id based on block timestamp

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCurrentFrame

    Retrieve the current frame details

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getDailyCommittableLimits

    Retrieve the configured daily committable limits

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getDepositedValidatorCount

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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getELFeeRecipient

    Retrieve the execution layer fee recipient

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getExpectedEpochId

    Retrieve expected epoch id

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getFrameFirstEpochId

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getGlobalFee

    Get the current global fee

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getKeeper

    Get the keeper address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getLastCompletedEpochId

    Retrieve the last completed epoch id

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getLastConsensusLayerReport

    Retrieve the last consensus layer report

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getMetadataURI

    Retrieve the metadata uri string value

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getOperatorsRegistry

    Retrieve the operators registry

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getOracle

    Get oracle address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getPendingAdmin

    Retrieve the current pending admin address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getRedeemManager

    Retrieve the redeem manager

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getReportBounds

    Retrieve the report bounds

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getTime

    Retrieve the block timestamp

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getWithdrawalCredentials

    Retrieve the withdrawal credentials

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    increaseAllowance

    Increase allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initRiverV1

    Initializes the River system

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    initRiverV1_1

    Initialized version 1.1 of the River System

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    initRiverV1_2

    Initializes version 1.2 of the River System

    hashtag
    isValidEpoch

    Verifies if the provided epoch is valid

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    name

    Retrieve the token name

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    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.

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    requestRedeem

    Performs a redeem request on the redeem manager

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    resolveRedeemRequests

    Resolves the provided redeem requests by calling the redeem manager

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    sendCLFunds

    Input for consensus layer funds, containing both exit and skimming

    hashtag
    sendCoverageFunds

    Input for coverage funds

    hashtag
    sendELFees

    Input for execution layer fee earnings

    hashtag
    sendRedeemManagerExceedingFunds

    Input for the redeem manager funds

    hashtag
    setAllowlist

    Changes the allowlist address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setCLSpec

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setCollector

    Changes the collector address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setConsensusLayerData

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setCoverageFund

    Changes the coverage fund

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setDailyCommittableLimits

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setELFeeRecipient

    Changes the execution layer fee recipient

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setGlobalFee

    Changes the global fee parameter

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setKeeper

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setMetadataURI

    Sets the metadata uri string value

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setOracle

    Set the oracle address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setReportBounds

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    sharesFromUnderlyingBalance

    Retrieve the shares count from an underlying asset amount

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    symbol

    Retrieve the token symbol

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    totalSupply

    Retrieve the total token supply

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    totalUnderlyingSupply

    Retrieve the total underlying asset supply

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transfer

    Performs a transfer from the message sender to the provided account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transferFrom

    Performs a transfer between two recipients

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    underlyingBalanceFromShares

    Retrieve the underlying asset balance from an amount of shares

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    version

    Retrieves the version of the contract

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Approval

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ConsensusLayerDataUpdate

    The consensus layer data provided by the oracle has been updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Initialize

    Emitted when the contract is properly initialized

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ProcessedConsensusLayerReport

    The provided report has been processed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    PulledCLFunds

    Emitted when funds are pulled from the CL recipient

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    PulledCoverageFunds

    Funds have been pulled from the Coverage Fund

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    PulledELFees

    Funds have been pulled from the Execution Layer Fee Recipient

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    PulledRedeemManagerExceedingEth

    Emitted when funds are pulled from the redeem manager

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ReportedRedeemManager

    Emitted when the redeem manager received a withdraw event report

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    RewardsEarned

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetAdmin

    The admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetAllowlist

    The stored Allowlist has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBalanceCommittedToDeposit

    Emitted when the balance committed to deposit

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBalanceToDeposit

    Emitted when the balance to deposit is updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBalanceToRedeem

    Emitted when the balance to redeem is updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBounds

    The Report Bounds are changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetCollector

    The stored Collector has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetCoverageFund

    The stored Coverage Fund has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetDepositContractAddress

    The stored deposit contract address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetDepositedValidatorCount

    Emitted when the deposited validator count is updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetELFeeRecipient

    The stored Execution Layer Fee Recipient has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetGlobalFee

    The stored Global Fee has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetMaxDailyCommittableAmounts

    Emitted when the daily committable limits are changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetMetadataURI

    The stored Metadata URI string has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetOperatorsRegistry

    The stored Operators Registry has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetOracle

    The stored oracle address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetPendingAdmin

    The pending admin address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetRedeemManager

    Emitted when the redeem manager address is changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetSpec

    The Consensus Layer Spec is changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetTotalSupply

    Emitted when the total supply is changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetWithdrawalCredentials

    The stored withdrawal credentials changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    UserDeposit

    User deposited ETH in the system

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    AllowanceTooLow

    Allowance too low to perform operation

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    BalanceTooLow

    Balance too low to perform operation

    hashtag
    Denied

    The access was denied

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    EmptyDeposit

    And empty deposit attempt was made

    hashtag
    ErrorOnDeposit

    An error occurred during the deposit

    hashtag
    InconsistentPublicKeys

    The length of the BLS Public key is invalid during deposit

    hashtag
    InconsistentSignatures

    The length of the BLS Signature is invalid during deposit

    hashtag
    InvalidArgument

    The argument was invalid

    hashtag
    InvalidCall

    The call was invalid

    hashtag
    InvalidDecreasingValidatorsExitedBalance

    The total exited balance decreased

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidDecreasingValidatorsSkimmedBalance

    The total skimmed balance decreased

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidDepositRoot

    Invalid deposit root

    hashtag
    InvalidEmptyString

    The string is empty

    hashtag
    InvalidEpoch

    Thrown when an invalid epoch was reported

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidFee

    The fee is invalid

    hashtag
    InvalidInitialization

    An error occurred during the initialization

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidPublicKeyCount

    The received count of public keys to deposit is invalid

    hashtag
    InvalidPulledClFundsAmount

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidSignatureCount

    The received count of signatures to deposit is invalid

    hashtag
    InvalidValidatorCountReport

    The reported validator count is invalid

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidWithdrawalCredentials

    The withdrawal credentials value is null

    hashtag
    InvalidZeroAddress

    The address is zero

    hashtag
    NoAvailableValidatorKeys

    The internal key retrieval returned no keys

    hashtag
    NotEnoughFunds

    Not enough funds to deposit one validator

    hashtag
    NullTransfer

    Invalid empty transfer

    hashtag
    OnlyKeeper

    hashtag
    SliceOutOfBounds

    The slice is outside of the initial bytes bounds

    hashtag
    SliceOverflow

    The length overflows an uint

    hashtag
    TotalValidatorBalanceDecreaseOutOfBound

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    TotalValidatorBalanceIncreaseOutOfBound

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Unauthorized

    The operator is unauthorized for the caller

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    UnauthorizedTransfer

    Invalid transfer recipients

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ZeroMintedShares

    The computed amount of shares to mint is 0

    _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

    _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

    _newTotalSupply

    uint256

    New total supply in shares

    epochsToAssumedFinality

    uint64

    The number of epochs before an epoch is considered final

    _0

    uint256

    undefined

    _0

    uint256

    undefined

    _0

    uint256

    undefined

    _0

    uint256

    undefined

    _owner

    address

    Address that issued the allowance

    _spender

    address

    Address that received the allowance

    _0

    uint256

    The allowance in shares for a given spender

    _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

    _owner

    address

    Address to be checked

    _0

    uint256

    The balance of the account in shares

    _owner

    address

    Address to be checked

    _0

    uint256

    The underlying balance of the account

    _redeemRequestIds

    uint32[]

    The list of redeem requests to claim

    _withdrawalEventIds

    uint32[]

    The list of resolved withdrawal event ids

    claimStatuses

    uint8[]

    The operation status results

    _0

    uint8

    The decimal count

    _spender

    address

    Spender that receives the allowance

    _subtractableValue

    uint256

    Amount of shares to subtract

    _0

    bool

    True if success

    _recipient

    address

    Address receiving the minted LsETH

    _maxCount

    uint256

    The maximum amount of validator keys to fund

    _depositRoot

    bytes32

    The root of the deposit tree

    _0

    address

    The admin address

    _0

    address

    The allowlist address

    _0

    uint256

    The amount of ETH not yet committed for deposit

    _0

    uint256

    The current balance to redeem

    _0

    CLSpec.CLSpecStruct

    The Consensus Layer Specification

    _0

    uint256

    The CL validator count

    _0

    uint256

    The CL Validator total balance

    _0

    address

    The collector address

    _0

    uint256

    The amount of ETH committed for deposit

    _0

    address

    The coverage fund address

    _0

    uint256

    The current epoch id

    _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

    _0

    DailyCommittableLimits.DailyCommittableLimitsStruct

    The daily committable limits structure

    _0

    uint256

    The deposited validator count

    _0

    address

    The execution layer fee recipient address

    _0

    uint256

    The current expected epoch id

    _epochId

    uint256

    Epoch id used to get the frame

    _0

    uint256

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

    _0

    uint256

    The global fee

    _0

    address

    The keeper address

    _0

    uint256

    The last completed epoch id

    _0

    IOracleManagerV1.StoredConsensusLayerReport

    The stored consensus layer report

    _0

    string

    The metadata uri string value

    _0

    address

    The operators registry address

    _0

    address

    The oracle address

    _0

    address

    The pending admin address

    _0

    address

    The redeem manager address

    _0

    ReportBounds.ReportBoundsStruct

    The report bounds

    _0

    uint256

    The current timestamp from the EVM context

    _0

    bytes32

    The withdrawal credentials

    _spender

    address

    Spender that receives the allowance

    _additionalValue

    uint256

    Amount of shares to add

    _0

    bool

    True if success

    _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

    _redeemManager

    address

    The redeem manager address

    _epochsPerFrame

    uint64

    The amounts of epochs in a frame

    _slotsPerEpoch

    uint64

    The slots inside an epoch

    _secondsPerSlot

    uint64

    _epoch

    uint256

    undefined

    _0

    bool

    True if valid

    _0

    string

    The token name

    _newAdmin

    address

    New admin address

    _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

    _redeemRequestIds

    uint32[]

    The list of redeem requests to resolve

    withdrawalEventIds

    int64[]

    The list of matching withdrawal events, or error codes

    _newAllowlist

    address

    New address for the allowlist

    _newValue

    CLSpec.CLSpecStruct

    undefined

    _newCollector

    address

    New address for the collector

    _report

    IOracleManagerV1.ConsensusLayerReport

    undefined

    _newCoverageFund

    address

    New address for the fund

    _dcl

    DailyCommittableLimits.DailyCommittableLimitsStruct

    undefined

    _newELFeeRecipient

    address

    New address for the recipient

    _newFee

    uint256

    New fee value

    _keeper

    address

    undefined

    _metadataURI

    string

    The new metadata uri string value

    _oracleAddress

    address

    Address of the oracle

    _newValue

    ReportBounds.ReportBoundsStruct

    undefined

    _underlyingAssetAmount

    uint256

    Amount of underlying asset to convert

    _0

    uint256

    The amount of shares worth the underlying asset amount

    _0

    string

    The token symbol

    _0

    uint256

    The total supply in shares

    _0

    uint256

    The total underlying asset supply

    _to

    address

    Address receiving the tokens

    _value

    uint256

    Amount of shares to be sent

    _0

    bool

    True if success

    _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

    _shares

    uint256

    Amount of shares to convert

    _0

    uint256

    The underlying asset balance represented by the shares

    _0

    string

    Version of the contract

    owner indexed

    address

    undefined

    spender indexed

    address

    undefined

    value

    uint256

    undefined

    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

    version

    uint256

    New version of the contracts

    cdata

    bytes

    Complete calldata that was used during the initialization

    report

    IOracleManagerV1.ConsensusLayerReport

    The report that was provided

    trace

    IOracleManagerV1.ConsensusLayerDataReportingTrace

    The trace structure providing more insights on internals

    pulledSkimmedEthAmount

    uint256

    The amount of skimmed ETH pulled

    pullExitedEthAmount

    uint256

    The amount of exited ETH pulled

    amount

    uint256

    The amount pulled

    amount

    uint256

    The amount pulled

    amount

    uint256

    The amount pulled

    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

    _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

    admin indexed

    address

    New admin address

    allowlist indexed

    address

    The new Allowlist

    oldAmount

    uint256

    The old balance committed to deposit

    newAmount

    uint256

    The new balance committed to deposit

    oldAmount

    uint256

    The old balance to deposit

    newAmount

    uint256

    The new balance to deposit

    oldAmount

    uint256

    The old balance to redeem

    newAmount

    uint256

    The new balance to redeem

    annualAprUpperBound

    uint256

    The reporting upper bound

    relativeLowerBound

    uint256

    The reporting lower bound

    collector indexed

    address

    The new Collector

    coverageFund indexed

    address

    The new Coverage Fund

    depositContract indexed

    address

    Address of the deposit contract

    oldDepositedValidatorCount

    uint256

    The old deposited validator count value

    newDepositedValidatorCount

    uint256

    The new deposited validator count value

    elFeeRecipient indexed

    address

    The new Execution Layer Fee Recipient

    fee

    uint256

    The new Global Fee

    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

    metadataURI

    string

    The new Metadata URI string

    operatorRegistry indexed

    address

    The new Operators Registry

    oracleAddress indexed

    address

    The new oracle address

    pendingAdmin indexed

    address

    New pending admin address

    redeemManager

    address

    The address of the redeem manager

    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

    totalSupply

    uint256

    undefined

    withdrawalCredentials

    bytes32

    The withdrawal credentials to use for deposits

    from indexed

    address

    undefined

    to indexed

    address

    undefined

    value

    uint256

    undefined

    depositor indexed

    address

    Address performing the deposit

    recipient indexed

    address

    Address receiving the minted shares

    amount

    uint256

    Amount in ETH deposited

    _from

    address

    Account where funds are sent from

    _operator

    address

    Account attempting the transfer

    _allowance

    uint256

    Current allowance

    _value

    uint256

    account

    address

    The account that was denied

    currentValidatorsExitedBalance

    uint256

    The current exited balance

    newValidatorsExitedBalance

    uint256

    The new exited balance

    currentValidatorsSkimmedBalance

    uint256

    The current exited balance

    newValidatorsSkimmedBalance

    uint256

    The new exited balance

    epoch

    uint256

    Invalid epoch

    version

    uint256

    The version that was attempting to be initialized

    expectedVersion

    uint256

    The version that was expected

    requested

    uint256

    The amount that was requested

    received

    uint256

    The amount that was received

    providedValidatorCount

    uint256

    The received validator count value

    depositedValidatorCount

    uint256

    The number of deposits performed by the system

    lastReportedValidatorCount

    uint256

    The last reported validator count

    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

    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

    caller

    address

    Address performing the call

    _from

    address

    Account sending the funds in the invalid transfer

    _to

    address

    Account receiving the funds in the invalid transfer

    The address of the Oracle contract

    The seconds inside a slot

    New total ETH balance under management by River

    The genesis timestamp

    Requested transfer value in shares

    The upper bound value that was used

    function DEPOSIT_SIZE() external view returns (uint256)
    function PUBLIC_KEY_LENGTH() external view returns (uint256)
    function SIGNATURE_LENGTH() external view returns (uint256)
    function _DEPOSIT_SIZE() external view returns (uint256)
    function acceptAdmin() external nonpayable
    function allowance(address _owner, address _spender) external view returns (uint256)
    function approve(address _spender, uint256 _value) external nonpayable returns (bool)
    function balanceOf(address _owner) external view returns (uint256)
    function balanceOfUnderlying(address _owner) external view returns (uint256)
    function claimRedeemRequests(uint32[] _redeemRequestIds, uint32[] _withdrawalEventIds) external nonpayable returns (uint8[] claimStatuses)
    function decimals() external pure returns (uint8)
    function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)
    function deposit() external payable
    function depositAndTransfer(address _recipient) external payable
    function depositToConsensusLayerWithDepositRoot(uint256 _maxCount, bytes32 _depositRoot) external nonpayable
    function getAdmin() external view returns (address)
    function getAllowlist() external view returns (address)
    function getBalanceToDeposit() external view returns (uint256)
    function getBalanceToRedeem() external view returns (uint256)
    function getCLSpec() external view returns (struct CLSpec.CLSpecStruct)
    function getCLValidatorCount() external view returns (uint256)
    function getCLValidatorTotalBalance() external view returns (uint256)
    function getCollector() external view returns (address)
    function getCommittedBalance() external view returns (uint256)
    function getCoverageFund() external view returns (address)
    function getCurrentEpochId() external view returns (uint256)
    function getCurrentFrame() external view returns (uint256 _startEpochId, uint256 _startTime, uint256 _endTime)
    function getDailyCommittableLimits() external view returns (struct DailyCommittableLimits.DailyCommittableLimitsStruct)
    function getDepositedValidatorCount() external view returns (uint256)
    function getELFeeRecipient() external view returns (address)
    function getExpectedEpochId() external view returns (uint256)
    function getFrameFirstEpochId(uint256 _epochId) external view returns (uint256)
    function getGlobalFee() external view returns (uint256)
    function getKeeper() external view returns (address)
    function getLastCompletedEpochId() external view returns (uint256)
    function getLastConsensusLayerReport() external view returns (struct IOracleManagerV1.StoredConsensusLayerReport)
    function getMetadataURI() external view returns (string)
    function getOperatorsRegistry() external view returns (address)
    function getOracle() external view returns (address)
    function getPendingAdmin() external view returns (address)
    function getRedeemManager() external view returns (address)
    function getReportBounds() external view returns (struct ReportBounds.ReportBoundsStruct)
    function getTime() external view returns (uint256)
    function getWithdrawalCredentials() external view returns (bytes32)
    function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)
    function initRiverV1(address _depositContractAddress, address _elFeeRecipientAddress, bytes32 _withdrawalCredentials, address _oracleAddress, address _systemAdministratorAddress, address _allowlistAddress, address _operatorRegistryAddress, address _collectorAddress, uint256 _globalFee) external nonpayable
    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
    function initRiverV1_2() external nonpayable
    function isValidEpoch(uint256 _epoch) external view returns (bool)
    function name() external pure returns (string)
    function proposeAdmin(address _newAdmin) external nonpayable
    function requestRedeem(uint256 _lsETHAmount, address _recipient) external nonpayable returns (uint32 _redeemRequestId)
    function resolveRedeemRequests(uint32[] _redeemRequestIds) external view returns (int64[] withdrawalEventIds)
    function sendCLFunds() external payable
    function sendCoverageFunds() external payable
    function sendELFees() external payable
    function sendRedeemManagerExceedingFunds() external payable
    function setAllowlist(address _newAllowlist) external nonpayable
    function setCLSpec(CLSpec.CLSpecStruct _newValue) external nonpayable
    function setCollector(address _newCollector) external nonpayable
    function setConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable
    function setCoverageFund(address _newCoverageFund) external nonpayable
    function setDailyCommittableLimits(DailyCommittableLimits.DailyCommittableLimitsStruct _dcl) external nonpayable
    function setELFeeRecipient(address _newELFeeRecipient) external nonpayable
    function setGlobalFee(uint256 _newFee) external nonpayable
    function setKeeper(address _keeper) external nonpayable
    function setMetadataURI(string _metadataURI) external nonpayable
    function setOracle(address _oracleAddress) external nonpayable
    function setReportBounds(ReportBounds.ReportBoundsStruct _newValue) external nonpayable
    function sharesFromUnderlyingBalance(uint256 _underlyingAssetAmount) external view returns (uint256)
    function symbol() external pure returns (string)
    function totalSupply() external view returns (uint256)
    function totalUnderlyingSupply() external view returns (uint256)
    function transfer(address _to, uint256 _value) external nonpayable returns (bool)
    function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)
    function underlyingBalanceFromShares(uint256 _shares) external view returns (uint256)
    function version() external pure returns (string)
    event Approval(address indexed owner, address indexed spender, uint256 value)
    event ConsensusLayerDataUpdate(uint256 validatorCount, uint256 validatorTotalBalance, bytes32 roundId)
    event Initialize(uint256 version, bytes cdata)
    event ProcessedConsensusLayerReport(IOracleManagerV1.ConsensusLayerReport report, IOracleManagerV1.ConsensusLayerDataReportingTrace trace)
    event PulledCLFunds(uint256 pulledSkimmedEthAmount, uint256 pullExitedEthAmount)
    event PulledCoverageFunds(uint256 amount)
    event PulledELFees(uint256 amount)
    event PulledRedeemManagerExceedingEth(uint256 amount)
    event ReportedRedeemManager(uint256 redeemManagerDemand, uint256 suppliedRedeemManagerDemand, uint256 suppliedRedeemManagerDemandInEth)
    event RewardsEarned(address indexed _collector, uint256 _oldTotalUnderlyingBalance, uint256 _oldTotalSupply, uint256 _newTotalUnderlyingBalance, uint256 _newTotalSupply)
    event SetAdmin(address indexed admin)
    event SetAllowlist(address indexed allowlist)
    event SetBalanceCommittedToDeposit(uint256 oldAmount, uint256 newAmount)
    event SetBalanceToDeposit(uint256 oldAmount, uint256 newAmount)
    event SetBalanceToRedeem(uint256 oldAmount, uint256 newAmount)
    event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)
    event SetCollector(address indexed collector)
    event SetCoverageFund(address indexed coverageFund)
    event SetDepositContractAddress(address indexed depositContract)
    event SetDepositedValidatorCount(uint256 oldDepositedValidatorCount, uint256 newDepositedValidatorCount)
    event SetELFeeRecipient(address indexed elFeeRecipient)
    event SetGlobalFee(uint256 fee)
    event SetMaxDailyCommittableAmounts(uint256 minNetAmount, uint256 maxRelativeAmount)
    event SetMetadataURI(string metadataURI)
    event SetOperatorsRegistry(address indexed operatorRegistry)
    event SetOracle(address indexed oracleAddress)
    event SetPendingAdmin(address indexed pendingAdmin)
    event SetRedeemManager(address redeemManager)
    event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime, uint64 epochsToAssumedFinality)
    event SetTotalSupply(uint256 totalSupply)
    event SetWithdrawalCredentials(bytes32 withdrawalCredentials)
    event Transfer(address indexed from, address indexed to, uint256 value)
    event UserDeposit(address indexed depositor, address indexed recipient, uint256 amount)
    error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)
    error BalanceTooLow()
    error Denied(address account)
    error EmptyDeposit()
    error ErrorOnDeposit()
    error InconsistentPublicKeys()
    error InconsistentSignatures()
    error InvalidArgument()
    error InvalidCall()
    error InvalidDecreasingValidatorsExitedBalance(uint256 currentValidatorsExitedBalance, uint256 newValidatorsExitedBalance)
    error InvalidDecreasingValidatorsSkimmedBalance(uint256 currentValidatorsSkimmedBalance, uint256 newValidatorsSkimmedBalance)
    error InvalidDepositRoot()
    error InvalidEmptyString()
    error InvalidEpoch(uint256 epoch)
    error InvalidFee()
    error InvalidInitialization(uint256 version, uint256 expectedVersion)
    error InvalidPublicKeyCount()
    error InvalidPulledClFundsAmount(uint256 requested, uint256 received)
    error InvalidSignatureCount()
    error InvalidValidatorCountReport(uint256 providedValidatorCount, uint256 depositedValidatorCount, uint256 lastReportedValidatorCount)
    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)
    error TotalValidatorBalanceIncreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 annualAprUpperBound)
    error Unauthorized(address caller)
    error UnauthorizedTransfer(address _from, address _to)
    error ZeroMintedShares()

    IRiverV1

    Alluvial Finance Inc.

    River Interface (v1)

    The main system interface

    hashtag
    Methods

    hashtag
    allowance

    Retrieve the allowance value for a spender

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    approve

    Approves an account for future spendings

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    balanceOf

    Retrieve the balance of an account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    balanceOfUnderlying

    Retrieve the underlying asset balance of an account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    claimRedeemRequests

    Claims several redeem requests

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    decimals

    Retrieve the decimal count

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    decreaseAllowance

    Decrease allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    deposit

    Explicit deposit method to mint on msg.sender

    hashtag
    depositAndTransfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    depositToConsensusLayerWithDepositRoot

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    getAllowlist

    Retrieve the allowlist address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getBalanceToDeposit

    Returns the amount of ETH not yet committed for deposit

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getBalanceToRedeem

    Retrieve the current balance to redeem

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCLSpec

    Retrieve the current cl spec

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCLValidatorCount

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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCLValidatorTotalBalance

    Get CL validator total balance

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCollector

    Retrieve the collector address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCommittedBalance

    Returns the amount of ETH committed for deposit

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCoverageFund

    Retrieve the coverage fund

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCurrentEpochId

    Retrieve the current epoch id based on block timestamp

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getCurrentFrame

    Retrieve the current frame details

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getDailyCommittableLimits

    Retrieve the configured daily committable limits

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getDepositedValidatorCount

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

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getELFeeRecipient

    Retrieve the execution layer fee recipient

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getExpectedEpochId

    Retrieve expected epoch id

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getFrameFirstEpochId

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getGlobalFee

    Get the current global fee

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getKeeper

    Get the keeper address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getLastCompletedEpochId

    Retrieve the last completed epoch id

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getLastConsensusLayerReport

    Retrieve the last consensus layer report

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getMetadataURI

    Retrieve the metadata uri string value

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getOperatorsRegistry

    Retrieve the operators registry

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getOracle

    Get oracle address

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getRedeemManager

    Retrieve the redeem manager

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getReportBounds

    Retrieve the report bounds

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getTime

    Retrieve the block timestamp

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    getWithdrawalCredentials

    Retrieve the withdrawal credentials

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    increaseAllowance

    Increase allowance to another account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    initRiverV1

    Initializes the River system

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    initRiverV1_1

    Initialized version 1.1 of the River System

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    initRiverV1_2

    Initializes version 1.2 of the River System

    hashtag
    isValidEpoch

    Verifies if the provided epoch is valid

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    name

    Retrieve the token name

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    requestRedeem

    Performs a redeem request on the redeem manager

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    resolveRedeemRequests

    Resolves the provided redeem requests by calling the redeem manager

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    sendCLFunds

    Input for consensus layer funds, containing both exit and skimming

    hashtag
    sendCoverageFunds

    Input for coverage funds

    hashtag
    sendELFees

    Input for execution layer fee earnings

    hashtag
    sendRedeemManagerExceedingFunds

    Input for the redeem manager funds

    hashtag
    setAllowlist

    Changes the allowlist address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setCLSpec

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setCollector

    Changes the collector address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setConsensusLayerData

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setCoverageFund

    Changes the coverage fund

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setDailyCommittableLimits

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setELFeeRecipient

    Changes the execution layer fee recipient

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setGlobalFee

    Changes the global fee parameter

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setMetadataURI

    Sets the metadata uri string value

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setOracle

    Set the oracle address

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    setReportBounds

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    sharesFromUnderlyingBalance

    Retrieve the shares count from an underlying asset amount

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    symbol

    Retrieve the token symbol

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    totalSupply

    Retrieve the total token supply

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    totalUnderlyingSupply

    Retrieve the total underlying asset supply

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transfer

    Performs a transfer from the message sender to the provided account

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    transferFrom

    Performs a transfer between two recipients

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    underlyingBalanceFromShares

    Retrieve the underlying asset balance from an amount of shares

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Returns

    Name
    Type
    Description

    hashtag
    Events

    hashtag
    Approval

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ConsensusLayerDataUpdate

    The consensus layer data provided by the oracle has been updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ProcessedConsensusLayerReport

    The provided report has been processed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    PulledCLFunds

    Emitted when funds are pulled from the CL recipient

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    PulledCoverageFunds

    Funds have been pulled from the Coverage Fund

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    PulledELFees

    Funds have been pulled from the Execution Layer Fee Recipient

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    PulledRedeemManagerExceedingEth

    Emitted when funds are pulled from the redeem manager

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ReportedRedeemManager

    Emitted when the redeem manager received a withdraw event report

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    RewardsEarned

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetAllowlist

    The stored Allowlist has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBalanceCommittedToDeposit

    Emitted when the balance committed to deposit

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBalanceToDeposit

    Emitted when the balance to deposit is updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBalanceToRedeem

    Emitted when the balance to redeem is updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetBounds

    The Report Bounds are changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetCollector

    The stored Collector has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetCoverageFund

    The stored Coverage Fund has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetDepositContractAddress

    The stored deposit contract address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetDepositedValidatorCount

    Emitted when the deposited validator count is updated

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetELFeeRecipient

    The stored Execution Layer Fee Recipient has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetGlobalFee

    The stored Global Fee has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetMaxDailyCommittableAmounts

    Emitted when the daily committable limits are changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetMetadataURI

    The stored Metadata URI string has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetOperatorsRegistry

    The stored Operators Registry has been changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetOracle

    The stored oracle address changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetRedeemManager

    Emitted when the redeem manager address is changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetSpec

    The Consensus Layer Spec is changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetTotalSupply

    Emitted when the total supply is changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    SetWithdrawalCredentials

    The stored withdrawal credentials changed

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Transfer

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    UserDeposit

    User deposited ETH in the system

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    Errors

    hashtag
    AllowanceTooLow

    Allowance too low to perform operation

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    BalanceTooLow

    Balance too low to perform operation

    hashtag
    Denied

    The access was denied

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    EmptyDeposit

    And empty deposit attempt was made

    hashtag
    ErrorOnDeposit

    An error occurred during the deposit

    hashtag
    InconsistentPublicKeys

    The length of the BLS Public key is invalid during deposit

    hashtag
    InconsistentSignatures

    The length of the BLS Signature is invalid during deposit

    hashtag
    InvalidDecreasingValidatorsExitedBalance

    The total exited balance decreased

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidDecreasingValidatorsSkimmedBalance

    The total skimmed balance decreased

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidDepositRoot

    Invalid deposit root

    hashtag
    InvalidEpoch

    Thrown when an invalid epoch was reported

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidPublicKeyCount

    The received count of public keys to deposit is invalid

    hashtag
    InvalidPulledClFundsAmount

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidSignatureCount

    The received count of signatures to deposit is invalid

    hashtag
    InvalidValidatorCountReport

    The reported validator count is invalid

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    InvalidWithdrawalCredentials

    The withdrawal credentials value is null

    hashtag
    NoAvailableValidatorKeys

    The internal key retrieval returned no keys

    hashtag
    NotEnoughFunds

    Not enough funds to deposit one validator

    hashtag
    NullTransfer

    Invalid empty transfer

    hashtag
    OnlyKeeper

    hashtag
    TotalValidatorBalanceDecreaseOutOfBound

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    TotalValidatorBalanceIncreaseOutOfBound

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

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    UnauthorizedTransfer

    Invalid transfer recipients

    hashtag
    Parameters

    Name
    Type
    Description

    hashtag
    ZeroMintedShares

    The computed amount of shares to mint is 0

    _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

    _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

    _newTotalSupply

    uint256

    New total supply in shares

    epochsToAssumedFinality

    uint64

    The number of epochs before an epoch is considered final

    _owner

    address

    Address that issued the allowance

    _spender

    address

    Address that received the allowance

    _0

    uint256

    The allowance in shares for a given spender

    _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

    _owner

    address

    Address to be checked

    _0

    uint256

    The balance of the account in shares

    _owner

    address

    Address to be checked

    _0

    uint256

    The underlying balance of the account

    _redeemRequestIds

    uint32[]

    The list of redeem requests to claim

    _withdrawalEventIds

    uint32[]

    The list of resolved withdrawal event ids

    claimStatuses

    uint8[]

    The operation status results

    _0

    uint8

    The decimal count

    _spender

    address

    Spender that receives the allowance

    _subtractableValue

    uint256

    Amount of shares to subtract

    _0

    bool

    True if success

    _recipient

    address

    Address receiving the minted LsETH

    _maxCount

    uint256

    The maximum amount of validator keys to fund

    _depositRoot

    bytes32

    The root of the deposit tree

    _0

    address

    The allowlist address

    _0

    uint256

    The amount of ETH not yet committed for deposit

    _0

    uint256

    The current balance to redeem

    _0

    CLSpec.CLSpecStruct

    The Consensus Layer Specification

    _0

    uint256

    The CL validator count

    _0

    uint256

    The CL Validator total balance

    _0

    address

    The collector address

    _0

    uint256

    The amount of ETH committed for deposit

    _0

    address

    The coverage fund address

    _0

    uint256

    The current epoch id

    _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

    _0

    DailyCommittableLimits.DailyCommittableLimitsStruct

    The daily committable limits structure

    _0

    uint256

    The deposited validator count

    _0

    address

    The execution layer fee recipient address

    _0

    uint256

    The current expected epoch id

    _epochId

    uint256

    Epoch id used to get the frame

    _0

    uint256

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

    _0

    uint256

    The global fee

    _0

    address

    The keeper address

    _0

    uint256

    The last completed epoch id

    _0

    IOracleManagerV1.StoredConsensusLayerReport

    The stored consensus layer report

    _0

    string

    The metadata uri string value

    _0

    address

    The operators registry address

    _0

    address

    The oracle address

    _0

    address

    The redeem manager address

    _0

    ReportBounds.ReportBoundsStruct

    The report bounds

    _0

    uint256

    The current timestamp from the EVM context

    _0

    bytes32

    The withdrawal credentials

    _spender

    address

    Spender that receives the allowance

    _additionalValue

    uint256

    Amount of shares to add

    _0

    bool

    True if success

    _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

    _redeemManager

    address

    The redeem manager address

    _epochsPerFrame

    uint64

    The amounts of epochs in a frame

    _slotsPerEpoch

    uint64

    The slots inside an epoch

    _secondsPerSlot

    uint64

    epoch

    uint256

    The epoch to lookup

    _0

    bool

    True if valid

    _0

    string

    The token name

    _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

    _redeemRequestIds

    uint32[]

    The list of redeem requests to resolve

    withdrawalEventIds

    int64[]

    The list of matching withdrawal events, or error codes

    _newAllowlist

    address

    New address for the allowlist

    _newValue

    CLSpec.CLSpecStruct

    undefined

    _newCollector

    address

    New address for the collector

    _report

    IOracleManagerV1.ConsensusLayerReport

    undefined

    _newCoverageFund

    address

    New address for the fund

    _dcl

    DailyCommittableLimits.DailyCommittableLimitsStruct

    undefined

    _newELFeeRecipient

    address

    New address for the recipient

    _newFee

    uint256

    New fee value

    _metadataURI

    string

    The new metadata uri string value

    _oracleAddress

    address

    Address of the oracle

    _newValue

    ReportBounds.ReportBoundsStruct

    undefined

    _underlyingAssetAmount

    uint256

    Amount of underlying asset to convert

    _0

    uint256

    The amount of shares worth the underlying asset amount

    _0

    string

    The token symbol

    _0

    uint256

    The total supply in shares

    _0

    uint256

    The total underlying asset supply

    _to

    address

    Address receiving the tokens

    _value

    uint256

    Amount of shares to be sent

    _0

    bool

    True if success

    _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

    _shares

    uint256

    Amount of shares to convert

    _0

    uint256

    The underlying asset balance represented by the shares

    owner indexed

    address

    undefined

    spender indexed

    address

    undefined

    value

    uint256

    undefined

    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

    report

    IOracleManagerV1.ConsensusLayerReport

    The report that was provided

    trace

    IOracleManagerV1.ConsensusLayerDataReportingTrace

    The trace structure providing more insights on internals

    pulledSkimmedEthAmount

    uint256

    The amount of skimmed ETH pulled

    pullExitedEthAmount

    uint256

    The amount of exited ETH pulled

    amount

    uint256

    The amount pulled

    amount

    uint256

    The amount pulled

    amount

    uint256

    The amount pulled

    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

    _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

    allowlist indexed

    address

    The new Allowlist

    oldAmount

    uint256

    The old balance committed to deposit

    newAmount

    uint256

    The new balance committed to deposit

    oldAmount

    uint256

    The old balance to deposit

    newAmount

    uint256

    The new balance to deposit

    oldAmount

    uint256

    The old balance to redeem

    newAmount

    uint256

    The new balance to redeem

    annualAprUpperBound

    uint256

    The reporting upper bound

    relativeLowerBound

    uint256

    The reporting lower bound

    collector indexed

    address

    The new Collector

    coverageFund indexed

    address

    The new Coverage Fund

    depositContract indexed

    address

    Address of the deposit contract

    oldDepositedValidatorCount

    uint256

    The old deposited validator count value

    newDepositedValidatorCount

    uint256

    The new deposited validator count value

    elFeeRecipient indexed

    address

    The new Execution Layer Fee Recipient

    fee

    uint256

    The new Global Fee

    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

    metadataURI

    string

    The new Metadata URI string

    operatorRegistry indexed

    address

    The new Operators Registry

    oracleAddress indexed

    address

    The new oracle address

    redeemManager

    address

    The address of the redeem manager

    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

    totalSupply

    uint256

    undefined

    withdrawalCredentials

    bytes32

    The withdrawal credentials to use for deposits

    from indexed

    address

    undefined

    to indexed

    address

    undefined

    value

    uint256

    undefined

    depositor indexed

    address

    Address performing the deposit

    recipient indexed

    address

    Address receiving the minted shares

    amount

    uint256

    Amount in ETH deposited

    _from

    address

    Account where funds are sent from

    _operator

    address

    Account attempting the transfer

    _allowance

    uint256

    Current allowance

    _value

    uint256

    account

    address

    The account that was denied

    currentValidatorsExitedBalance

    uint256

    The current exited balance

    newValidatorsExitedBalance

    uint256

    The new exited balance

    currentValidatorsSkimmedBalance

    uint256

    The current exited balance

    newValidatorsSkimmedBalance

    uint256

    The new exited balance

    epoch

    uint256

    Invalid epoch

    requested

    uint256

    The amount that was requested

    received

    uint256

    The amount that was received

    providedValidatorCount

    uint256

    The received validator count value

    depositedValidatorCount

    uint256

    The number of deposits performed by the system

    lastReportedValidatorCount

    uint256

    The last reported validator count

    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

    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

    _from

    address

    Account sending the funds in the invalid transfer

    _to

    address

    Account receiving the funds in the invalid transfer

    The address of the Oracle contract

    The seconds inside a slot

    The genesis timestamp

    Requested transfer value in shares

    The upper bound value that was used

    function allowance(address _owner, address _spender) external view returns (uint256)
    function approve(address _spender, uint256 _value) external nonpayable returns (bool)
    function balanceOf(address _owner) external view returns (uint256)
    function balanceOfUnderlying(address _owner) external view returns (uint256)
    function claimRedeemRequests(uint32[] _redeemRequestIds, uint32[] _withdrawalEventIds) external nonpayable returns (uint8[] claimStatuses)
    function decimals() external pure returns (uint8)
    function decreaseAllowance(address _spender, uint256 _subtractableValue) external nonpayable returns (bool)
    function deposit() external payable
    function depositAndTransfer(address _recipient) external payable
    function depositToConsensusLayerWithDepositRoot(uint256 _maxCount, bytes32 _depositRoot) external nonpayable
    function getAllowlist() external view returns (address)
    function getBalanceToDeposit() external view returns (uint256)
    function getBalanceToRedeem() external view returns (uint256)
    function getCLSpec() external view returns (struct CLSpec.CLSpecStruct)
    function getCLValidatorCount() external view returns (uint256)
    function getCLValidatorTotalBalance() external view returns (uint256)
    function getCollector() external view returns (address)
    function getCommittedBalance() external view returns (uint256)
    function getCoverageFund() external view returns (address)
    function getCurrentEpochId() external view returns (uint256)
    function getCurrentFrame() external view returns (uint256 _startEpochId, uint256 _startTime, uint256 _endTime)
    function getDailyCommittableLimits() external view returns (struct DailyCommittableLimits.DailyCommittableLimitsStruct)
    function getDepositedValidatorCount() external view returns (uint256)
    function getELFeeRecipient() external view returns (address)
    function getExpectedEpochId() external view returns (uint256)
    function getFrameFirstEpochId(uint256 _epochId) external view returns (uint256)
    function getGlobalFee() external view returns (uint256)
    function getKeeper() external view returns (address)
    function getLastCompletedEpochId() external view returns (uint256)
    function getLastConsensusLayerReport() external view returns (struct IOracleManagerV1.StoredConsensusLayerReport)
    function getMetadataURI() external view returns (string)
    function getOperatorsRegistry() external view returns (address)
    function getOracle() external view returns (address)
    function getRedeemManager() external view returns (address)
    function getReportBounds() external view returns (struct ReportBounds.ReportBoundsStruct)
    function getTime() external view returns (uint256)
    function getWithdrawalCredentials() external view returns (bytes32)
    function increaseAllowance(address _spender, uint256 _additionalValue) external nonpayable returns (bool)
    function initRiverV1(address _depositContractAddress, address _elFeeRecipientAddress, bytes32 _withdrawalCredentials, address _oracleAddress, address _systemAdministratorAddress, address _allowlistAddress, address _operatorRegistryAddress, address _collectorAddress, uint256 _globalFee) external nonpayable
    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
    function initRiverV1_2() external nonpayable
    function isValidEpoch(uint256 epoch) external view returns (bool)
    function name() external pure returns (string)
    function requestRedeem(uint256 _lsETHAmount, address _recipient) external nonpayable returns (uint32 redeemRequestId)
    function resolveRedeemRequests(uint32[] _redeemRequestIds) external view returns (int64[] withdrawalEventIds)
    function sendCLFunds() external payable
    function sendCoverageFunds() external payable
    function sendELFees() external payable
    function sendRedeemManagerExceedingFunds() external payable
    function setAllowlist(address _newAllowlist) external nonpayable
    function setCLSpec(CLSpec.CLSpecStruct _newValue) external nonpayable
    function setCollector(address _newCollector) external nonpayable
    function setConsensusLayerData(IOracleManagerV1.ConsensusLayerReport _report) external nonpayable
    function setCoverageFund(address _newCoverageFund) external nonpayable
    function setDailyCommittableLimits(DailyCommittableLimits.DailyCommittableLimitsStruct _dcl) external nonpayable
    function setELFeeRecipient(address _newELFeeRecipient) external nonpayable
    function setGlobalFee(uint256 _newFee) external nonpayable
    function setMetadataURI(string _metadataURI) external nonpayable
    function setOracle(address _oracleAddress) external nonpayable
    function setReportBounds(ReportBounds.ReportBoundsStruct _newValue) external nonpayable
    function sharesFromUnderlyingBalance(uint256 _underlyingAssetAmount) external view returns (uint256)
    function symbol() external pure returns (string)
    function totalSupply() external view returns (uint256)
    function totalUnderlyingSupply() external view returns (uint256)
    function transfer(address _to, uint256 _value) external nonpayable returns (bool)
    function transferFrom(address _from, address _to, uint256 _value) external nonpayable returns (bool)
    function underlyingBalanceFromShares(uint256 _shares) external view returns (uint256)
    event Approval(address indexed owner, address indexed spender, uint256 value)
    event ConsensusLayerDataUpdate(uint256 validatorCount, uint256 validatorTotalBalance, bytes32 roundId)
    event ProcessedConsensusLayerReport(IOracleManagerV1.ConsensusLayerReport report, IOracleManagerV1.ConsensusLayerDataReportingTrace trace)
    event PulledCLFunds(uint256 pulledSkimmedEthAmount, uint256 pullExitedEthAmount)
    event PulledCoverageFunds(uint256 amount)
    event PulledELFees(uint256 amount)
    event PulledRedeemManagerExceedingEth(uint256 amount)
    event ReportedRedeemManager(uint256 redeemManagerDemand, uint256 suppliedRedeemManagerDemand, uint256 suppliedRedeemManagerDemandInEth)
    event RewardsEarned(address indexed _collector, uint256 _oldTotalUnderlyingBalance, uint256 _oldTotalSupply, uint256 _newTotalUnderlyingBalance, uint256 _newTotalSupply)
    event SetAllowlist(address indexed allowlist)
    event SetBalanceCommittedToDeposit(uint256 oldAmount, uint256 newAmount)
    event SetBalanceToDeposit(uint256 oldAmount, uint256 newAmount)
    event SetBalanceToRedeem(uint256 oldAmount, uint256 newAmount)
    event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound)
    event SetCollector(address indexed collector)
    event SetCoverageFund(address indexed coverageFund)
    event SetDepositContractAddress(address indexed depositContract)
    event SetDepositedValidatorCount(uint256 oldDepositedValidatorCount, uint256 newDepositedValidatorCount)
    event SetELFeeRecipient(address indexed elFeeRecipient)
    event SetGlobalFee(uint256 fee)
    event SetMaxDailyCommittableAmounts(uint256 minNetAmount, uint256 maxRelativeAmount)
    event SetMetadataURI(string metadataURI)
    event SetOperatorsRegistry(address indexed operatorRegistry)
    event SetOracle(address indexed oracleAddress)
    event SetRedeemManager(address redeemManager)
    event SetSpec(uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime, uint64 epochsToAssumedFinality)
    event SetTotalSupply(uint256 totalSupply)
    event SetWithdrawalCredentials(bytes32 withdrawalCredentials)
    event Transfer(address indexed from, address indexed to, uint256 value)
    event UserDeposit(address indexed depositor, address indexed recipient, uint256 amount)
    error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value)
    error BalanceTooLow()
    error Denied(address account)
    error EmptyDeposit()
    error ErrorOnDeposit()
    error InconsistentPublicKeys()
    error InconsistentSignatures()
    error InvalidDecreasingValidatorsExitedBalance(uint256 currentValidatorsExitedBalance, uint256 newValidatorsExitedBalance)
    error InvalidDecreasingValidatorsSkimmedBalance(uint256 currentValidatorsSkimmedBalance, uint256 newValidatorsSkimmedBalance)
    error InvalidDepositRoot()
    error InvalidEpoch(uint256 epoch)
    error InvalidPublicKeyCount()
    error InvalidPulledClFundsAmount(uint256 requested, uint256 received)
    error InvalidSignatureCount()
    error InvalidValidatorCountReport(uint256 providedValidatorCount, uint256 depositedValidatorCount, uint256 lastReportedValidatorCount)
    error InvalidWithdrawalCredentials()
    error NoAvailableValidatorKeys()
    error NotEnoughFunds()
    error NullTransfer()
    error OnlyKeeper()
    error TotalValidatorBalanceDecreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 relativeLowerBound)
    error TotalValidatorBalanceIncreaseOutOfBound(uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 annualAprUpperBound)
    error UnauthorizedTransfer(address _from, address _to)
    error ZeroMintedShares()