OracleReportSanityChecker
Some vital data for the Lido protocol is collected off-chain and delivered on-chain via Oracle contracts:
AccountingOracle
, ValidatorsExitBusOracle
.
Due to the high impact of data provided by the Oracles on the state of the protocol, each Oracle's
report passes a set of onchain
sanity checks.
For the simplicity of the contracts responsible for handling Oracle's reports, all sanity checks were collected in the
standalone OracleReportSanityChecker
contract.
Besides the validation methods, the OracleReportSanityChecker
contract contains a set of tunable limits and restrictions
used during the report validation process.
To configure the limits values contract provides the lever methods described in the standalone section.
Access to lever methods is restricted using the functionality of the
AccessControlEnumerable
contract and a bunch of granular roles.
Limits List
OracleReportSanityChecker
introduces a new type LimitsList
which contains all the limits used by the contract.
struct LimitsList {
uint256 exitedValidatorsPerDayLimit;
uint256 appearedValidatorsPerDayLimit;
uint256 annualBalanceIncreaseBPLimit;
uint256 simulatedShareRateDeviationBPLimit;
uint256 maxValidatorExitRequestsPerReport;
uint256 maxItemsPerExtraDataTransaction;
uint256 maxNodeOperatorsPerExtraDataItem;
uint256 requestTimestampMargin;
uint256 maxPositiveTokenRebase;
uint256 initialSlashingAmountPWei;
uint256 inactivityPenaltiesAmountPWei;
uint256 clBalanceOraclesErrorUpperBPLimit;
}
exitedValidatorsPerDayLimit
∈ [0, 65535] — the max possible number of validators that might be reported as exited per single day, exited are reported according to the Consensus Layer churn limit.appearedValidatorsPerDayLimit
∈ [0, 65535] — the max possible number of validators that might been reported as appeared during a single day.AccountingOracle
reports validators as appeared once them become pending (might be not activated yet). Thus, this limit should be high enough for such cases because Consensus Layer has no intrinsic churn limit for the amount of pending validators (only for activated instead). For Lido it's limited by the max daily deposits viaDepositSecurityModule
.annualBalanceIncreaseBPLimit
∈ [0, 10000] — the max annual increase of the total validators' balances on the Consensus Layer since the previous oracle report. Represented in the Basis Points (100% == 10000).simulatedShareRateDeviationBPLimit
∈ [0, 10000] — the max deviation of the providedsimulatedShareRate
and the actual one within the currently processing oracle report. Represented in the Basis Points (100% == 10000).maxValidatorExitRequestsPerReport
∈ [0, 65535] — the max number of exit requests allowed in report to ValidatorsExitBusOraclemaxItemsPerExtraDataTransaction
∈ [0, 65535] — the max number of data list items reported to accounting oracle in extra data per single transaction.maxNodeOperatorsPerExtraDataItem
∈ [0, 65535] — the max number of node operators reported per extra data list itemrequestTimestampMargin
∈ [0, type(uint64).max] — the min time required to be passed from the creation of the request to be finalized till the time of the oracle reportmaxPositiveTokenRebase
∈ [1, type(uint64).max] — the max positive token rebase allowed per single oracle report token rebase happens on total supply adjustment, huge positive rebase can incur oracle report sandwiching. Uses 1e9 precision, e.g.:1e6
— 0.1%;1e9
— 100%;type(uint64).max
— unlimited rebase.initialSlashingAmountPWei
∈ [0, 65535] - initial slashing amount per one validator to calculate initial slashing of the validators' balances on the Consensus Layer.inactivityPenaltiesAmountPWei
∈ [0, 65535] - inactivity penalties amount per one validator to calculate penalties of the validators' balances on the Consensus Layer.clBalanceOraclesErrorUpperBPLimit
∈ [0, 10000] - the maximum percent on how Second Opinion Oracle reported value could be greater than reported by the AccountingOracle. There is an assumption that second opinion oracle CL balance can be greater as calculated for the withdrawal credentials. Represented in the Basis Points (100% == 10000).
There is also parameter for Second Opinion Oracle which is not a part of the LimitList
structure. However
it's modification requires the same type of roles as for the Limits. It could be changed with a general
setOracleReportLimits()
function or specific setSecondOpinionOracleAndCLBalanceUpperMargin()
.
For the details about meaning of the parameters: initialSlashingAmountPWei
, inactivityPenaltiesAmountPWei
,
clBalanceOraclesErrorUpperBPLimit
and Second Opinion Oracle
please refer to LIP-23.
Sanity Checks
checkAccountingOracleReport()
Applies sanity checks to the accounting parameters of Lido's Oracle report.
Below is the list of restrictions checked by the method execution:
- Revert with
IncorrectWithdrawalsVaultBalance(uint256 actualWithdrawalVaultBalance)
error when the reported withdrawals vault balance is greater than the actual balance of the withdrawal vault. - Revert with
IncorrectELRewardsVaultBalance(uint256 actualELRewardsVaultBalance)
error when reported EL rewards vault balance is greater than the actual balance of EL rewards vault. - Revert with
IncorrectSharesRequestedToBurn(uint256 actualSharesToBurn)
error when the amount of stETH shares requested to burn exceeds the number of shares marked to be burned in the Burner contract. - Revert with
IncorrectCLBalanceDecrease(uint256 negativeCLRebaseSum, uint256 maxNegativeCLRebaseSum)
error when Consensus Layer balance decrease exceeds the allowed. See LIP-23 for this and other similar errors. - Revert with
IncorrectCLBalanceDecrease(uint256 negativeCLRebaseSum, uint256 maxNegativeCLRebaseSum)
error when Consensus Layer balance reported by oracles and second opinion oracle is too different. - Revert with
NegativeRebaseFailedWithdrawalVaultBalanceMismatch(uint256 reportedValue, uint256 provedValue)
error when Withdrawal vault balance reported by oracles and second opinion oracle is different. - Revert with
NegativeRebaseFailedSecondOpinionReportIsNotReady()
error when second opinion oracle report is not available. - Revert with
IncorrectCLBalanceIncrease(uint256 annualBalanceDiff)
error when Consensus Layer annual balance increase expressed in basis points exceeds allowedLimitsList.annualBalanceIncreaseBPLimit
. - Revert with
IncorrectAppearedValidators(uint256 appearedValidatorsLimit)
error when the number of appeared validators exceeds the limit set byLimitsList.appearedValidatorsPerDayLimit
.
function checkAccountingOracleReport(
uint256 _timeElapsed,
uint256 _preCLBalance,
uint256 _postCLBalance,
uint256 _withdrawalVaultBalance,
uint256 _elRewardsVaultBalance,
uint256 _sharesRequestedToBurn,
uint256 _preCLValidators,
uint256 _postCLValidators
)
Arguments
_timeElapsed
— time elapsed since the previous oracle report, measured in seconds_preCLBalance
— sum of all Lido validators' balances on the Consensus Layer before the current oracle report (NB: also include the initial balance of newly appeared validators)_postCLBalance
— sum of all Lido validators' balances on the Consensus Layer after the current oracle report_withdrawalVaultBalance
— withdrawal vault balance on Execution Layer for the report reference slot_elRewardsVaultBalance
— el rewards vault balance on Execution Layer for the report reference slot_sharesRequestedToBurn
— shares requested to burn for the report reference slot_preCLValidators
— Lido-participating validators on the CL side before the current oracle report_postCLValidators
— Lido-participating validators on the CL side after the current oracle report
checkExitBusOracleReport()
Validates that number of exit requests does not exceed the limit set by LimitsList.maxValidatorExitRequestsPerReport
.
Reverts with IncorrectNumberOfExitRequestsPerReport(uint256 maxRequestsCount)
error when check is failed.
function checkExitBusOracleReport(uint256 _exitRequestsCount)
Arguments
_exitRequestsCount
— number of validator exit requests supplied per oracle report
checkExitedValidatorsRatePerDay()
Validates that number of exited validators does not exceed the limit set by LimitsList.exitedValidatorsPerDayLimit
.
Reverts with ExitedValidatorsLimitExceeded(uint256 limitPerDay, uint256 exitedPerDay)
error when check is failed.
function checkExitedValidatorsRatePerDay(uint256 _exitedValidatorsCount)
Arguments
_exitedValidatorsCount
— number of validator exit requests supplied per oracle report
checkNodeOperatorsPerExtraDataItemCount()
Validates that number of node operators reported per extra data item does not exceed the limit
set by LimitsList.maxNodeOperatorsPerExtraDataItem
.
Reverts with TooManyNodeOpsPerExtraDataItem(uint256 itemIndex, uint256 nodeOpsCount)
error when check is failed.
function checkNodeOperatorsPerExtraDataItemCount(
uint256 _itemIndex,
uint256 _nodeOperatorsCount
)
Arguments
_itemIndex
— index of item in extra data_nodeOperatorsCount
— number of validator exit requests supplied per oracle report
checkExtraDataItemsCountPerTransaction()
Validates that number of extra data items per transaction in the report does not exceed the limit
set by LimitsList.maxItemsPerExtraDataTransaction
.
Reverts with TooManyItemsPerExtraDataTransaction(uint256 maxItemsCount, uint256 receivedItemsCount)
error when check is failed.
function checkExtraDataItemsCountPerTransaction(uint256 _extraDataListItemsCount)
Arguments
_extraDataListItemsCount
— number of items per single transaction in the accounting oracle report
checkWithdrawalQueueOracleReport()
Validates that withdrawal request with the passed _lastFinalizableRequestId
was created more
than LimitsList.requestTimestampMargin
seconds ago.
Reverts with IncorrectRequestFinalization(uint256 requestCreationBlock)
error when check is failed.
function checkWithdrawalQueueOracleReport(
uint256 _lastFinalizableRequestId,
uint256 _reportTimestamp
)
Arguments
_lastFinalizableRequestId
— last finalizable withdrawal request id_reportTimestamp
— timestamp when the originated oracle report was submitted
checkSimulatedShareRate()
Applies sanity checks to the simulated share rate for withdrawal requests finalization.
Reverts with IncorrectSimulatedShareRate(uint256 simulatedShareRate, uint256 actualShareRate)
error
when simulated share rate deviation exceeds the limit set by LimitsList.simulatedShareRateDeviationBPLimit
function checkSimulatedShareRate(
uint256 _postTotalPooledEther,
uint256 _postTotalShares,
uint256 _etherLockedOnWithdrawalQueue,
uint256 _sharesBurntDueToWithdrawals,
uint256 _simulatedShareRate
)
Arguments
_postTotalPooledEther
— total pooled ether after report applied_postTotalShares
— total shares after report applied_etherLockedOnWithdrawalQueue
— ether locked on withdrawal queue for the current oracle report_sharesBurntDueToWithdrawals
— shares burnt due to withdrawals finalization_simulatedShareRate
— share rate provided with the oracle report (simulated via off-chain "eth_call")
View Methods
getLidoLocator()
Returns the address of the protocol-wide LidoLocator instance.
function getLidoLocator() returns (address)
getOracleReportLimits()
Returns the limits list used for the sanity checks as the LimitsList
type.
function getOracleReportLimits() returns (LimitsList memory)
getMaxPositiveTokenRebase()
Returns max positive token rebase value with 1e9 precision (e.g.: 1e6
— 0.1%; 1e9
— 100%):
Special values:
0
(zero value) means uninitializedtype(uint64).max
means unlimited, e.g. not enforced
Get max positive rebase allowed per single oracle report. Token rebase happens on total supply and/or total shares adjustment, while huge positive rebase can incur oracle report sandwiching stealing part of the stETH holders' rewards.
The relative positive rebase value derived as follows:
stETH balance for the account
defined as:
balanceOf(account) =
shares[account] * totalPooledEther / totalShares = shares[account] * shareRate
Suppose shareRate changes when oracle reports (see handleOracleReport
)
which means that token rebase happens:
preShareRate = preTotalPooledEther() / preTotalShares()
postShareRate = postTotalPooledEther() / postTotalShares()
R = (postShareRate - preShareRate) / preShareRate
here R > 0
corresponds to the relative positive rebase value (i.e., instant APR).
function getMaxPositiveTokenRebase() returns (uint256)
smoothenTokenRebase()
Evaluates the following amounts during Lido's oracle report processing:
- the allowed ETH amount that might be taken from the withdrawal vault and EL rewards vault
- the allowed amount of stETH shares to be burnt
function smoothenTokenRebase(
uint256 _preTotalPooledEther,
uint256 _preTotalShares,
uint256 _preCLBalance,
uint256 _postCLBalance,
uint256 _withdrawalVaultBalance,
uint256 _elRewardsVaultBalance,
uint256 _sharesRequestedToBurn,
uint256 _etherToLockForWithdrawals,
uint256 _newSharesToBurnForWithdrawals
) returns (
uint256 withdrawals,
uint256 elRewards,
uint256 simulatedSharesToBurn,
uint256 sharesToBurn
)
Arguments
_preTotalPooledEther
— total amount of ETH controlled by the protocol_preTotalShares
— total amount of minted stETH shares_preCLBalance
— sum of all Lido validators' balances on the Consensus Layer before the current oracle report_postCLBalance
— sum of all Lido validators' balances on the Consensus Layer after the current oracle report_withdrawalVaultBalance
— withdrawal vault balance on Execution Layer for the report calculation moment_elRewardsVaultBalance
— elRewards vault balance on Execution Layer for the report calculation moment_sharesRequestedToBurn
— shares requested to burn through Burner for the report calculation moment_etherToLockForWithdrawals
— ether to lock on withdrawals queue contract_newSharesToBurnForWithdrawals
— new shares to burn due to withdrawal requests finalization
Returns
withdrawals
— ETH amount allowed to be taken from the withdrawals vaultelRewards
— ETH amount allowed to be taken from the EL rewards vaultsimulatedSharesToBurn
— simulated amount of shares to be burnt (if no ether locked on withdrawals)sharesToBurn
— amount of shares to be burnt (accounting for withdrawals finalization)
Lever Methods
setOracleReportLimits()
Sets the new values for the limits list.
- Requires
ALL_LIMITS_MANAGER_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue(uint256 value, uint256 minAllowedValue, uint256 maxAllowedValue)
error when some value in the passed data out of the allowed range. See details of allowed value boundaries in the Limits List section. - Emits
SecondOpinionOracleChanged(ISecondOpinionOracle indexed secondOpinionOracle)
in case of change for the second opinion oracle.
function setOracleReportLimits(LimitsList calldata _limitsList, ISecondOpinionOracle _secondOpinionOracle)
Arguments
_limitsList
— new limits list values_secondOpinionOracle
— new second opinion oracle value
setExitedValidatorsPerDayLimit()
Sets the new value for the LimitsList.exitedValidatorsPerDayLimit
.
The limit is applicable for exited validators.
- Requires
EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setExitedValidatorsPerDayLimit(uint256 _exitedValidatorsPerDayLimit)
Arguments
_exitedValidatorsPerDayLimit
— newLimitsList.exitedValidatorsPerDayLimit
value
setAppearedValidatorsPerDayLimit()
Sets the new value for the LimitsList.appearedValidatorsPerDayLimit
.
The limit is applicable for appeared validators.
- Requires
APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setAppearedValidatorsPerDayLimit(uint256 _appearedValidatorsPerDayLimit)
Arguments
_appearedValidatorsPerDayLimit
— newLimitsList.appearedValidatorsPerDayLimit
value
setAnnualBalanceIncreaseBPLimit()
Sets the new value for the LimitsList.annualBalanceIncreaseBPLimit
variable.
- Requires
ANNUAL_BALANCE_INCREASE_LIMIT_MANAGER_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setAnnualBalanceIncreaseBPLimit(uint256 _annualBalanceIncreaseBPLimit)
Arguments
_annualBalanceIncreaseBPLimit
— new value forLimitsList.annualBalanceIncreaseBPLimit
setSimulatedShareRateDeviationBPLimit()
Sets the new value for the LimitsList.simulatedShareRateDeviationBPLimit
variable.
- Requires
SHARE_RATE_DEVIATION_LIMIT_MANAGER_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setSimulatedShareRateDeviationBPLimit(uint256 _simulatedShareRateDeviationBPLimit)
Arguments
_simulatedShareRateDeviationBPLimit
— new value forLimitsList.simulatedShareRateDeviationBPLimit
setMaxExitRequestsPerOracleReport()
Sets the new value for the LimitsList.maxValidatorExitRequestsPerReport
.
- Requires
MAX_VALIDATOR_EXIT_REQUESTS_PER_REPORT_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setMaxExitRequestsPerOracleReport(uint256 _maxValidatorExitRequestsPerReport)
Arguments
_maxValidatorExitRequestsPerReport
— new value forLimitsList.maxValidatorExitRequestsPerReport
setRequestTimestampMargin()
Sets the new value for the LimitsList.requestTimestampMargin
variable.
- Requires
REQUEST_TIMESTAMP_MARGIN_MANAGER_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setRequestTimestampMargin(uint256 _requestTimestampMargin)
Arguments
_requestTimestampMargin
— new new value forLimitsList.requestTimestampMargin
setMaxPositiveTokenRebase()
Sets the new value for the LimitsList.maxPositiveTokenRebase
variable.
- Requires
MAX_POSITIVE_TOKEN_REBASE_MANAGER_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setMaxPositiveTokenRebase(uint256 _maxPositiveTokenRebase)
Arguments
_maxPositiveTokenRebase
— new value forLimitsList.maxPositiveTokenRebase
setMaxItemsPerExtraDataTransaction()
Sets the new value for the LimitsList.maxItemsPerExtraDataTransaction
variable.
- Requires
MAX_ITEMS_PER_EXTRA_DATA_TRANSACTION_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setMaxItemsPerExtraDataTransaction(uint256 _maxItemsPerExtraDataTransaction)
Arguments
_maxItemsPerExtraDataTransaction
— new value forLimitsList.maxItemsPerExtraDataTransaction
setMaxNodeOperatorsPerExtraDataItem()
Sets the new value for the LimitsList.maxNodeOperatorsPerExtraDataItem
variable.
- Requires
MAX_NODE_OPERATORS_PER_EXTRA_DATA_ITEM_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setMaxNodeOperatorsPerExtraDataItem(uint256 _maxNodeOperatorsPerExtraDataItem)
Arguments
_maxNodeOperatorsPerExtraDataItem
— new value forLimitsList.maxNodeOperatorsPerExtraDataItem
setSecondOpinionOracleAndCLBalanceUpperMargin()
Sets the new value for the Second Opinion Oracle and LimitsList.clBalanceOraclesErrorUpperBPLimit
variable.
- Requires
SECOND_OPINION_MANAGER_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details. - Emits
SecondOpinionOracleChanged(ISecondOpinionOracle indexed secondOpinionOracle)
in case of change for the second opinion oracle.
function setSecondOpinionOracleAndCLBalanceUpperMargin(ISecondOpinionOracle _secondOpinionOracle, uint256 _clBalanceOraclesErrorUpperBPLimit)
Arguments
_secondOpinionOracle
— new value for Second Opinion Oracle_clBalanceOraclesErrorUpperBPLimit
— new value forLimitsList.clBalanceOraclesErrorUpperBPLimit
setInitialSlashingAndPenaltiesAmount()
Sets the new value for the LimitsList.initialSlashingAmountPWei
and LimitsList.inactivityPenaltiesAmountPWei
variable.
- Requires
INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE
to be granted to the caller. - Reverts with
IncorrectLimitValue()
error when the passed value is out of the allowed range. See Limits List section for details.
function setInitialSlashingAndPenaltiesAmount(uint256 _initialSlashingAmountPWei, uint256 _inactivityPenaltiesAmountPWei)
Arguments
_initialSlashingAmountPWei
— new value forLimitsList.initialSlashingAmountPWei
_inactivityPenaltiesAmountPWei
— new value forLimitsList.inactivityPenaltiesAmountPWei
Permissions
ALL_LIMITS_MANAGER_ROLE()
bytes32 public constant ALL_LIMITS_MANAGER_ROLE = keccak256("ALL_LIMITS_MANAGER_ROLE")
Granting this role allows updating ANY value of the Limits List.
See setOracleReportLimits()
method.
Grant this role with caution and give preference to the granular roles described below.
EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE()
Granting this role allows updating the exitedValidatorsPerDayLimit
value of the Limits List.
See the setExitedValidatorsPerDayLimit()
method.
bytes32 public constant EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE =
keccak256("EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE");
APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE()
Granting this role allows updating the appearedValidatorsPerDayLimit
value of the Limits List.
See the setAppearedValidatorsPerDayLimit()
method.
bytes32 public constant APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE =
keccak256("APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE");
ANNUAL_BALANCE_INCREASE_LIMIT_MANAGER_ROLE()
Granting this role allows updating the annualBalanceIncreaseBPLimit
value of the Limits List.
See the setAnnualBalanceIncreaseBPLimit()
method.
bytes32 public constant ANNUAL_BALANCE_INCREASE_LIMIT_MANAGER_ROLE =
keccak256("ANNUAL_BALANCE_INCREASE_LIMIT_MANAGER_ROLE")
SHARE_RATE_DEVIATION_LIMIT_MANAGER_ROLE()
Granting this role allows updating the simulatedShareRateDeviationBPLimit
value of the Limits List.
See the setSimulatedShareRateDeviationBPLimit()
method.
bytes32 public constant SHARE_RATE_DEVIATION_LIMIT_MANAGER_ROLE =
keccak256("SHARE_RATE_DEVIATION_LIMIT_MANAGER_ROLE")
MAX_VALIDATOR_EXIT_REQUESTS_PER_REPORT_ROLE()
Granting this role allows updating the maxValidatorExitRequestsPerReport
value of the Limits List.
See the setMaxExitRequestsPerOracleReport()
method.
bytes32 public constant MAX_VALIDATOR_EXIT_REQUESTS_PER_REPORT_ROLE =
keccak256("MAX_VALIDATOR_EXIT_REQUESTS_PER_REPORT_ROLE")
MAX_ITEMS_PER_EXTRA_DATA_TRANSACTION_ROLE()
Granting this role allows updating the maxItemsPerExtraDataTransaction
value of the Limits List.
See the setMaxItemsPerExtraDataTransaction()
method.
bytes32 public constant MAX_ITEMS_PER_EXTRA_DATA_TRANSACTION_ROLE =
keccak256("MAX_ITEMS_PER_EXTRA_DATA_TRANSACTION_ROLE");
MAX_NODE_OPERATORS_PER_EXTRA_DATA_ITEM_ROLE()
Granting this role allows updating the maxNodeOperatorsPerExtraDataItem
value of the Limits List.
See the setMaxNodeOperatorsPerExtraDataItem()
method.
bytes32 public constant MAX_NODE_OPERATORS_PER_EXTRA_DATA_ITEM_ROLE =
keccak256("MAX_NODE_OPERATORS_PER_EXTRA_DATA_ITEM_ROLE");
REQUEST_TIMESTAMP_MARGIN_MANAGER_ROLE()
Granting this role allows updating the requestTimestampMargin
value of the Limits List.
See the setRequestTimestampMargin()
method.
bytes32 public constant REQUEST_TIMESTAMP_MARGIN_MANAGER_ROLE
= keccak256("REQUEST_TIMESTAMP_MARGIN_MANAGER_ROLE")
MAX_POSITIVE_TOKEN_REBASE_MANAGER_ROLE()
Granting this role allows updating the maxPositiveTokenRebase
value of the Limits List.
See the setMaxPositiveTokenRebase()
method.
bytes32 public constant MAX_POSITIVE_TOKEN_REBASE_MANAGER_ROLE =
keccak256("MAX_POSITIVE_TOKEN_REBASE_MANAGER_ROLE")
SECOND_OPINION_MANAGER_ROLE()
Granting this role allows updating the Second Opinion Oracle and clBalanceOraclesErrorUpperBPLimit
value of the Limits List.
See the setSecondOpinionOracleAndCLBalanceUpperMargin()
method.
bytes32 public constant SECOND_OPINION_MANAGER_ROLE =
keccak256("SECOND_OPINION_MANAGER_ROLE")
INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE
Granting this role allows updating the initialSlashingAmountPWei
and inactivityPenaltiesAmountPWei
values of the Limits List.
See the setInitialSlashingAndPenaltiesAmount()
method.
bytes32 public constant INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE =
keccak256("INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE")
Events
ExitedValidatorsPerDayLimitSet()
Emits whenever the value of the LimitsList.exitedValidatorsPerDayLimit
value is changed.
event ExitedValidatorsPerDayLimitSet(uint256 exitedValidatorsPerDayLimit);
Arguments
exitedValidatorsPerDayLimit
— new value of theLimitsList.exitedValidatorsPerDayLimit
AppearedValidatorsPerDayLimitSet()
Emits whenever the value of the LimitsList.appearedValidatorsPerDayLimit
value is changed.
event AppearedValidatorsPerDayLimitSet(uint256 appearedValidatorsPerDayLimit);
Arguments
appearedValidatorsPerDayLimit
— new value of theLimitsList.appearedValidatorsPerDayLimit
AnnualBalanceIncreaseBPLimitSet()
Emits whenever the value of the LimitsList.annualBalanceIncreaseBPLimit
value is changed.
event AnnualBalanceIncreaseBPLimitSet(uint256 annualBalanceIncreaseBPLimit);
Arguments
annualBalanceIncreaseBPLimit
— new value of theLimitsList.annualBalanceIncreaseBPLimit
SimulatedShareRateDeviationBPLimitSet()
Emits whenever the value of the LimitsList.simulatedShareRateDeviationBPLimit
value is changed.
event SimulatedShareRateDeviationBPLimitSet(uint256 simulatedShareRateDeviationBPLimit);
Arguments
annualBalanceIncreaseBPLimit
— new value of theLimitsList.simulatedShareRateDeviationBPLimit
MaxPositiveTokenRebaseSet()
Emits whenever the value of the LimitsList.maxPositiveTokenRebase
value is changed.
event MaxPositiveTokenRebaseSet(uint256 maxPositiveTokenRebase);
Arguments
annualBalanceIncreaseBPLimit
— new value of theLimitsList.maxPositiveTokenRebase
MaxValidatorExitRequestsPerReportSet()
Emits whenever the value of the LimitsList.maxValidatorExitRequestsPerReport
value is changed.
event MaxValidatorExitRequestsPerReportSet(uint256 maxValidatorExitRequestsPerReport);
Arguments
maxValidatorExitRequestsPerReport
— new value of theLimitsList.maxValidatorExitRequestsPerReport
MaxItemsPerExtraDataTransactionSet()
Emits whenever the value of the LimitsList.maxItemsPerExtraDataTransaction
value is changed.
event MaxItemsPerExtraDataTransactionSet(uint256 maxItemsPerExtraDataTransaction);
Arguments
maxItemsPerExtraDataTransaction
— new value of theLimitsList.maxItemsPerExtraDataTransaction
MaxNodeOperatorsPerExtraDataItemSet()
Emits whenever the value of the LimitsList.maxNodeOperatorsPerExtraDataItem
value is changed.
event MaxNodeOperatorsPerExtraDataItemSet(uint256 maxNodeOperatorsPerExtraDataItem);
Arguments
maxNodeOperatorsPerExtraDataItem
— new value of theLimitsList.maxNodeOperatorsPerExtraDataItem
RequestTimestampMarginSet()
Emits whenever the value of the LimitsList.requestTimestampMargin
value is changed.
event RequestTimestampMarginSet(uint256 requestTimestampMargin);
Arguments
requestTimestampMargin
— new value of theLimitsList.requestTimestampMargin
InitialSlashingAmountSet()
Emits whenever the value of the LimitsList.initialSlashingAmountPWei
value is changed.
event InitialSlashingAmountSet(uint256 initialSlashingAmountPWei);
Arguments
initialSlashingAmountPWei
— new value of theLimitsList.initialSlashingAmountPWei
InactivityPenaltiesAmountSet()
Emits whenever the value of the LimitsList.InactivityPenaltiesAmountSet
value is changed.
event InactivityPenaltiesAmountSet(uint256 inactivityPenaltiesAmountPWei);
Arguments
inactivityPenaltiesAmountPWei
— new value of theLimitsList.inactivityPenaltiesAmountPWei
CLBalanceOraclesErrorUpperBPLimitSet()
Emits whenever the value of the LimitsList.clBalanceOraclesErrorUpperBPLimit
value is changed.
event CLBalanceOraclesErrorUpperBPLimitSet(uint256 clBalanceOraclesErrorUpperBPLimit);
Arguments
clBalanceOraclesErrorUpperBPLimit
— new value of theLimitsList.clBalanceOraclesErrorUpperBPLimit
NegativeCLRebaseConfirmed()
Emits whenever the checkAccountingOracleReport() finished with negative CL rebase check successfully with checking the Second Opinion Oracle.
event NegativeCLRebaseConfirmed(uint256 refSlot, uint256 clBalanceWei, uint256 withdrawalVaultBalance);
Arguments
refSlot
— the reference slot for the report checked.clBalanceWei
— the total Consensus Layer balance.withdrawalVaultBalance
— balance of the withdrawal vault.
NegativeCLRebaseAccepted()
Emits whenever the checkAccountingOracleReport() finished with negative CL rebase check successfully without checking the Second Opinion Oracle.
event NegativeCLRebaseAccepted(uint256 refSlot, uint256 clTotalBalance, uint256 clBalanceDecrease, uint256 maxAllowedCLRebaseNegativeSum);
Arguments
refSlot
— the reference slot for the report checked.clTotalBalance
— the total Consensus Layer balance.clBalanceDecrease
— the decrease of Consensus Layer balance during report.maxAllowedCLRebaseNegativeSum
— the maximul accepted negative rebase balance change without second opinion.