diff --git a/assets/Accounting.json b/assets/Accounting.json new file mode 100644 index 000000000..77bc3b220 --- /dev/null +++ b/assets/Accounting.json @@ -0,0 +1,338 @@ +[ + { + "inputs": [ + { + "internalType": "contract ILidoLocator", + "name": "_lidoLocator", + "type": "address" + }, + { + "internalType": "contract ILido", + "name": "_lido", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reportTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperBoundTimestamp", + "type": "uint256" + } + ], + "name": "IncorrectReportTimestamp", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reportValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxValidators", + "type": "uint256" + } + ], + "name": "IncorrectReportValidators", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "operation", + "type": "string" + }, + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "NotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "firstArrayLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondArrayLength", + "type": "uint256" + } + ], + "name": "UnequalArrayLengths", + "type": "error" + }, + { + "inputs": [], + "name": "LIDO", + "outputs": [ + { + "internalType": "contract ILido", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIDO_LOCATOR", + "outputs": [ + { + "internalType": "contract ILidoLocator", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeElapsed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "clValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "clBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "withdrawalVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "elRewardsVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesRequestedToBurn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "withdrawalFinalizationBatches", + "type": "uint256[]" + } + ], + "internalType": "struct ReportValues", + "name": "_report", + "type": "tuple" + } + ], + "name": "handleOracleReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeElapsed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "clValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "clBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "withdrawalVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "elRewardsVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesRequestedToBurn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "withdrawalFinalizationBatches", + "type": "uint256[]" + } + ], + "internalType": "struct ReportValues", + "name": "_report", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_withdrawalShareRate", + "type": "uint256" + } + ], + "name": "simulateOracleReport", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "withdrawals", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "elRewards", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "etherToFinalizeWQ", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesToFinalizeWQ", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesToBurnForWithdrawals", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalSharesToBurn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesToMintAsFees", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address[]", + "name": "recipients", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "moduleIds", + "type": "uint256[]" + }, + { + "internalType": "uint96[]", + "name": "modulesFees", + "type": "uint96[]" + }, + { + "internalType": "uint96", + "name": "totalFee", + "type": "uint96" + }, + { + "internalType": "uint256", + "name": "precisionPoints", + "type": "uint256" + } + ], + "internalType": "struct Accounting.StakingRewardsDistribution", + "name": "rewardDistribution", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "principalClBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preTotalShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preTotalPooledEther", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "postInternalShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "postInternalEther", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "postTotalShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "postTotalPooledEther", + "type": "uint256" + } + ], + "internalType": "struct Accounting.CalculatedValues", + "name": "update", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/assets/AccountingOracle.json b/assets/AccountingOracle.json index 25d9cb1f2..80282cf7c 100644 --- a/assets/AccountingOracle.json +++ b/assets/AccountingOracle.json @@ -1 +1,1303 @@ -[{"inputs":[{"internalType":"address","name":"lidoLocator","type":"address"},{"internalType":"address","name":"lido","type":"address"},{"internalType":"address","name":"legacyOracle","type":"address"},{"internalType":"uint256","name":"secondsPerSlot","type":"uint256"},{"internalType":"uint256","name":"genesisTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressCannotBeSame","type":"error"},{"inputs":[],"name":"AddressCannotBeZero","type":"error"},{"inputs":[],"name":"AdminCannotBeZero","type":"error"},{"inputs":[],"name":"CannotSubmitExtraDataBeforeMainData","type":"error"},{"inputs":[{"internalType":"uint256","name":"itemIndex","type":"uint256"},{"internalType":"uint256","name":"dataType","type":"uint256"}],"name":"DeprecatedExtraDataType","type":"error"},{"inputs":[],"name":"ExtraDataAlreadyProcessed","type":"error"},{"inputs":[],"name":"ExtraDataHashCannotBeZeroForNonEmptyData","type":"error"},{"inputs":[],"name":"ExtraDataItemsCountCannotBeZeroForNonEmptyData","type":"error"},{"inputs":[],"name":"HashCannotBeZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"code","type":"uint256"}],"name":"IncorrectOracleMigration","type":"error"},{"inputs":[{"internalType":"uint256","name":"initialRefSlot","type":"uint256"},{"internalType":"uint256","name":"processingRefSlot","type":"uint256"}],"name":"InitialRefSlotCannotBeLessThanProcessingOne","type":"error"},{"inputs":[],"name":"InvalidContractVersionIncrement","type":"error"},{"inputs":[],"name":"InvalidExitedValidatorsData","type":"error"},{"inputs":[{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"name":"InvalidExtraDataItem","type":"error"},{"inputs":[{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"name":"InvalidExtraDataSortOrder","type":"error"},{"inputs":[],"name":"LegacyOracleCannotBeZero","type":"error"},{"inputs":[],"name":"LidoCannotBeZero","type":"error"},{"inputs":[],"name":"LidoLocatorCannotBeZero","type":"error"},{"inputs":[],"name":"NoConsensusReportToProcess","type":"error"},{"inputs":[],"name":"NonZeroContractVersionOnInit","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ProcessingDeadlineMissed","type":"error"},{"inputs":[],"name":"RefSlotAlreadyProcessing","type":"error"},{"inputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"prevRefSlot","type":"uint256"}],"name":"RefSlotCannotDecrease","type":"error"},{"inputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"processingRefSlot","type":"uint256"}],"name":"RefSlotMustBeGreaterThanProcessingOne","type":"error"},{"inputs":[],"name":"SecondsPerSlotCannotBeZero","type":"error"},{"inputs":[],"name":"SenderIsNotTheConsensusContract","type":"error"},{"inputs":[],"name":"SenderNotAllowed","type":"error"},{"inputs":[],"name":"UnexpectedChainConfig","type":"error"},{"inputs":[{"internalType":"uint256","name":"expectedVersion","type":"uint256"},{"internalType":"uint256","name":"receivedVersion","type":"uint256"}],"name":"UnexpectedConsensusVersion","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedContractVersion","type":"error"},{"inputs":[{"internalType":"bytes32","name":"consensusHash","type":"bytes32"},{"internalType":"bytes32","name":"receivedHash","type":"bytes32"}],"name":"UnexpectedDataHash","type":"error"},{"inputs":[{"internalType":"uint256","name":"expectedFormat","type":"uint256"},{"internalType":"uint256","name":"receivedFormat","type":"uint256"}],"name":"UnexpectedExtraDataFormat","type":"error"},{"inputs":[{"internalType":"bytes32","name":"consensusHash","type":"bytes32"},{"internalType":"bytes32","name":"receivedHash","type":"bytes32"}],"name":"UnexpectedExtraDataHash","type":"error"},{"inputs":[{"internalType":"uint256","name":"expectedIndex","type":"uint256"},{"internalType":"uint256","name":"receivedIndex","type":"uint256"}],"name":"UnexpectedExtraDataIndex","type":"error"},{"inputs":[{"internalType":"uint256","name":"expectedCount","type":"uint256"},{"internalType":"uint256","name":"receivedCount","type":"uint256"}],"name":"UnexpectedExtraDataItemsCount","type":"error"},{"inputs":[{"internalType":"uint256","name":"consensusRefSlot","type":"uint256"},{"internalType":"uint256","name":"dataRefSlot","type":"uint256"}],"name":"UnexpectedRefSlot","type":"error"},{"inputs":[{"internalType":"uint256","name":"format","type":"uint256"}],"name":"UnsupportedExtraDataFormat","type":"error"},{"inputs":[{"internalType":"uint256","name":"itemIndex","type":"uint256"},{"internalType":"uint256","name":"dataType","type":"uint256"}],"name":"UnsupportedExtraDataType","type":"error"},{"inputs":[],"name":"VersionCannotBeSame","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"address","name":"prevAddr","type":"address"}],"name":"ConsensusHashContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"prevVersion","type":"uint256"}],"name":"ConsensusVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"itemsProcessed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"itemsCount","type":"uint256"}],"name":"ExtraDataSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"ProcessingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"ReportDiscarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"processingDeadlineTime","type":"uint256"}],"name":"ReportSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"processedItemsCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"itemsCount","type":"uint256"}],"name":"WarnExtraDataIncompleteProcessing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"}],"name":"WarnProcessingMissed","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXTRA_DATA_FORMAT_EMPTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXTRA_DATA_FORMAT_LIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXTRA_DATA_TYPE_EXITED_VALIDATORS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXTRA_DATA_TYPE_STUCK_VALIDATORS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENESIS_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGACY_ORACLE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIDO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCATOR","outputs":[{"internalType":"contract ILidoLocator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_CONSENSUS_CONTRACT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_CONSENSUS_VERSION_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_PER_SLOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUBMIT_DATA_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"}],"name":"discardConsensusReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"consensusVersion","type":"uint256"}],"name":"finalizeUpgrade_v2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getConsensusContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConsensusReport","outputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"processingDeadlineTime","type":"uint256"},{"internalType":"bool","name":"processingStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConsensusVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessingRefSlot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProcessingState","outputs":[{"components":[{"internalType":"uint256","name":"currentFrameRefSlot","type":"uint256"},{"internalType":"uint256","name":"processingDeadlineTime","type":"uint256"},{"internalType":"bytes32","name":"mainDataHash","type":"bytes32"},{"internalType":"bool","name":"mainDataSubmitted","type":"bool"},{"internalType":"bytes32","name":"extraDataHash","type":"bytes32"},{"internalType":"uint256","name":"extraDataFormat","type":"uint256"},{"internalType":"bool","name":"extraDataSubmitted","type":"bool"},{"internalType":"uint256","name":"extraDataItemsCount","type":"uint256"},{"internalType":"uint256","name":"extraDataItemsSubmitted","type":"uint256"}],"internalType":"struct AccountingOracle.ProcessingState","name":"result","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"consensusContract","type":"address"},{"internalType":"uint256","name":"consensusVersion","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"consensusContract","type":"address"},{"internalType":"uint256","name":"consensusVersion","type":"uint256"},{"internalType":"uint256","name":"lastProcessingRefSlot","type":"uint256"}],"name":"initializeWithoutMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setConsensusContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"name":"setConsensusVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reportHash","type":"bytes32"},{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"submitConsensusReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"consensusVersion","type":"uint256"},{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"numValidators","type":"uint256"},{"internalType":"uint256","name":"clBalanceGwei","type":"uint256"},{"internalType":"uint256[]","name":"stakingModuleIdsWithNewlyExitedValidators","type":"uint256[]"},{"internalType":"uint256[]","name":"numExitedValidatorsByStakingModule","type":"uint256[]"},{"internalType":"uint256","name":"withdrawalVaultBalance","type":"uint256"},{"internalType":"uint256","name":"elRewardsVaultBalance","type":"uint256"},{"internalType":"uint256","name":"sharesRequestedToBurn","type":"uint256"},{"internalType":"uint256[]","name":"withdrawalFinalizationBatches","type":"uint256[]"},{"internalType":"uint256","name":"simulatedShareRate","type":"uint256"},{"internalType":"bool","name":"isBunkerMode","type":"bool"},{"internalType":"uint256","name":"extraDataFormat","type":"uint256"},{"internalType":"bytes32","name":"extraDataHash","type":"bytes32"},{"internalType":"uint256","name":"extraDataItemsCount","type":"uint256"}],"internalType":"struct AccountingOracle.ReportData","name":"data","type":"tuple"},{"internalType":"uint256","name":"contractVersion","type":"uint256"}],"name":"submitReportData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"submitReportExtraDataEmpty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submitReportExtraDataList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}] +[ + { + "inputs": [ + { + "internalType": "address", + "name": "lidoLocator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "secondsPerSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "genesisTime", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AddressCannotBeSame", + "type": "error" + }, + { + "inputs": [], + "name": "AddressCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "AdminCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "CannotSubmitExtraDataBeforeMainData", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "itemIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dataType", + "type": "uint256" + } + ], + "name": "DeprecatedExtraDataType", + "type": "error" + }, + { + "inputs": [], + "name": "ExtraDataAlreadyProcessed", + "type": "error" + }, + { + "inputs": [], + "name": "ExtraDataHashCannotBeZeroForNonEmptyData", + "type": "error" + }, + { + "inputs": [], + "name": "ExtraDataItemsCountCannotBeZeroForNonEmptyData", + "type": "error" + }, + { + "inputs": [], + "name": "HashCannotBeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + } + ], + "name": "IncorrectOracleMigration", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingRefSlot", + "type": "uint256" + } + ], + "name": "InitialRefSlotCannotBeLessThanProcessingOne", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractVersionIncrement", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidExitedValidatorsData", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "itemIndex", + "type": "uint256" + } + ], + "name": "InvalidExtraDataItem", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "itemIndex", + "type": "uint256" + } + ], + "name": "InvalidExtraDataSortOrder", + "type": "error" + }, + { + "inputs": [], + "name": "LidoCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "LidoLocatorCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "NoConsensusReportToProcess", + "type": "error" + }, + { + "inputs": [], + "name": "NonZeroContractVersionOnInit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "ProcessingDeadlineMissed", + "type": "error" + }, + { + "inputs": [], + "name": "RefSlotAlreadyProcessing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevRefSlot", + "type": "uint256" + } + ], + "name": "RefSlotCannotDecrease", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingRefSlot", + "type": "uint256" + } + ], + "name": "RefSlotMustBeGreaterThanProcessingOne", + "type": "error" + }, + { + "inputs": [], + "name": "SecondsPerSlotCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotTheConsensusContract", + "type": "error" + }, + { + "inputs": [], + "name": "SenderNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "UnexpectedChainConfig", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expectedVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedVersion", + "type": "uint256" + } + ], + "name": "UnexpectedConsensusVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedContractVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "consensusHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "receivedHash", + "type": "bytes32" + } + ], + "name": "UnexpectedDataHash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expectedFormat", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedFormat", + "type": "uint256" + } + ], + "name": "UnexpectedExtraDataFormat", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "consensusHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "receivedHash", + "type": "bytes32" + } + ], + "name": "UnexpectedExtraDataHash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expectedIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedIndex", + "type": "uint256" + } + ], + "name": "UnexpectedExtraDataIndex", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expectedCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedCount", + "type": "uint256" + } + ], + "name": "UnexpectedExtraDataItemsCount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "consensusRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dataRefSlot", + "type": "uint256" + } + ], + "name": "UnexpectedRefSlot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "format", + "type": "uint256" + } + ], + "name": "UnsupportedExtraDataFormat", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "itemIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dataType", + "type": "uint256" + } + ], + "name": "UnsupportedExtraDataType", + "type": "error" + }, + { + "inputs": [], + "name": "VersionCannotBeSame", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "prevAddr", + "type": "address" + } + ], + "name": "ConsensusHashContractSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "version", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "prevVersion", + "type": "uint256" + } + ], + "name": "ConsensusVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "itemsProcessed", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "itemsCount", + "type": "uint256" + } + ], + "name": "ExtraDataSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "ProcessingStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "ReportDiscarded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + } + ], + "name": "ReportSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "processedItemsCount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "itemsCount", + "type": "uint256" + } + ], + "name": "WarnExtraDataIncompleteProcessing", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + } + ], + "name": "WarnProcessingMissed", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXTRA_DATA_FORMAT_EMPTY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXTRA_DATA_FORMAT_LIST", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXTRA_DATA_TYPE_EXITED_VALIDATORS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXTRA_DATA_TYPE_STUCK_VALIDATORS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENESIS_TIME", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LOCATOR", + "outputs": [ + { + "internalType": "contract ILidoLocator", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_CONSENSUS_CONTRACT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_CONSENSUS_VERSION_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SECONDS_PER_SLOT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SUBMIT_DATA_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + } + ], + "name": "discardConsensusReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + } + ], + "name": "finalizeUpgrade_v3", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusReport", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "processingStarted", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastProcessingRefSlot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProcessingState", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "currentFrameRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mainDataHash", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "mainDataSubmitted", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "extraDataHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "extraDataFormat", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "extraDataSubmitted", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "extraDataItemsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "extraDataItemsSubmitted", + "type": "uint256" + } + ], + "internalType": "struct AccountingOracle.ProcessingState", + "name": "result", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "consensusContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastProcessingRefSlot", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "setConsensusContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "setConsensusVersion", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "reportHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "submitConsensusReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "clBalanceGwei", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "stakingModuleIdsWithNewlyExitedValidators", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "numExitedValidatorsByStakingModule", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "withdrawalVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "elRewardsVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesRequestedToBurn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "withdrawalFinalizationBatches", + "type": "uint256[]" + }, + { + "internalType": "bool", + "name": "isBunkerMode", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "vaultsDataTreeRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "vaultsDataTreeCid", + "type": "string" + }, + { + "internalType": "uint256", + "name": "extraDataFormat", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "extraDataHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "extraDataItemsCount", + "type": "uint256" + } + ], + "internalType": "struct AccountingOracle.ReportData", + "name": "data", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "contractVersion", + "type": "uint256" + } + ], + "name": "submitReportData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "submitReportExtraDataEmpty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "submitReportExtraDataList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/assets/Burner.json b/assets/Burner.json index b1071880d..9da4b1237 100644 --- a/assets/Burner.json +++ b/assets/Burner.json @@ -1 +1,803 @@ -[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_stETH","type":"address"},{"internalType":"uint256","name":"_totalCoverSharesBurnt","type":"uint256"},{"internalType":"uint256","name":"_totalNonCoverSharesBurnt","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AppAuthLidoFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"requestedAmount","type":"uint256"},{"internalType":"uint256","name":"actualAmount","type":"uint256"}],"name":"BurnAmountExceedsActual","type":"error"},{"inputs":[],"name":"DirectETHTransfer","type":"error"},{"inputs":[],"name":"StETHRecoveryWrongFunc","type":"error"},{"inputs":[{"internalType":"string","name":"field","type":"string"}],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroBurnAmount","type":"error"},{"inputs":[],"name":"ZeroRecoveryAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfStETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfShares","type":"uint256"}],"name":"ExcessStETHRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"isCover","type":"bool"},{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfStETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfShares","type":"uint256"}],"name":"StETHBurnRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"isCover","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amountOfStETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfShares","type":"uint256"}],"name":"StETHBurnt","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RECOVER_ASSETS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUEST_BURN_MY_STETH_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUEST_BURN_SHARES_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sharesToBurn","type":"uint256"}],"name":"commitSharesToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCoverSharesBurnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExcessStETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonCoverSharesBurnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSharesRequestedToBurn","outputs":[{"internalType":"uint256","name":"coverShares","type":"uint256"},{"internalType":"uint256","name":"nonCoverShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverExcessStETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stETHAmountToBurn","type":"uint256"}],"name":"requestBurnMyStETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stETHAmountToBurn","type":"uint256"}],"name":"requestBurnMyStETHForCover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_sharesAmountToBurn","type":"uint256"}],"name":"requestBurnShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_sharesAmountToBurn","type":"uint256"}],"name":"requestBurnSharesForCover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}] +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_locator", + "type": "address" + }, + { + "internalType": "address", + "name": "_stETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AppAuthFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actualAmount", + "type": "uint256" + } + ], + "name": "BurnAmountExceedsActual", + "type": "error" + }, + { + "inputs": [], + "name": "DirectETHTransfer", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractVersionIncrement", + "type": "error" + }, + { + "inputs": [], + "name": "MigrationNotAllowedOrAlreadyMigrated", + "type": "error" + }, + { + "inputs": [], + "name": "NonZeroContractVersionOnInit", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitialized", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyLidoCanMigrate", + "type": "error" + }, + { + "inputs": [], + "name": "StETHRecoveryWrongFunc", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedContractVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "field", + "type": "string" + } + ], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroBurnAmount", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroRecoveryAmount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "requestedBy", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC20Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "requestedBy", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ERC721Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "requestedBy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfStETH", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfShares", + "type": "uint256" + } + ], + "name": "ExcessStETHRecovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bool", + "name": "isCover", + "type": "bool" + }, + { + "indexed": true, + "internalType": "address", + "name": "requestedBy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfStETH", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfShares", + "type": "uint256" + } + ], + "name": "StETHBurnRequested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bool", + "name": "isCover", + "type": "bool" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfStETH", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfShares", + "type": "uint256" + } + ], + "name": "StETHBurnt", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIDO", + "outputs": [ + { + "internalType": "contract ILido", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LOCATOR", + "outputs": [ + { + "internalType": "contract ILidoLocator", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REQUEST_BURN_MY_STETH_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REQUEST_BURN_SHARES_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_sharesToBurn", + "type": "uint256" + } + ], + "name": "commitSharesToBurn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCoverSharesBurnt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExcessStETH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNonCoverSharesBurnt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSharesRequestedToBurn", + "outputs": [ + { + "internalType": "uint256", + "name": "coverShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonCoverShares", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "bool", + "name": "_isMigrationAllowed", + "type": "bool" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isMigrationAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_oldBurner", + "type": "address" + } + ], + "name": "migrate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "recoverERC721", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "recoverExcessStETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_sharesAmountToBurn", + "type": "uint256" + } + ], + "name": "requestBurnMyShares", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stETHAmountToBurn", + "type": "uint256" + } + ], + "name": "requestBurnMyStETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stETHAmountToBurn", + "type": "uint256" + } + ], + "name": "requestBurnMyStETHForCover", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_sharesAmountToBurn", + "type": "uint256" + } + ], + "name": "requestBurnShares", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_sharesAmountToBurn", + "type": "uint256" + } + ], + "name": "requestBurnSharesForCover", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/assets/HashConsensus.json b/assets/HashConsensus.json index bb18bbdca..3539b06f6 100644 --- a/assets/HashConsensus.json +++ b/assets/HashConsensus.json @@ -1 +1,1081 @@ -[{"type":"constructor","inputs":[{"name":"slotsPerEpoch","type":"uint256","internalType":"uint256"},{"name":"secondsPerSlot","type":"uint256","internalType":"uint256"},{"name":"genesisTime","type":"uint256","internalType":"uint256"},{"name":"epochsPerFrame","type":"uint256","internalType":"uint256"},{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"},{"name":"admin","type":"address","internalType":"address"},{"name":"reportProcessor","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DISABLE_CONSENSUS_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_FAST_LANE_CONFIG_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_FRAME_CONFIG_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_MEMBERS_AND_QUORUM_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_REPORT_PROCESSOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addMember","inputs":[{"name":"addr","type":"address","internalType":"address"},{"name":"quorum","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"disableConsensus","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getChainConfig","inputs":[],"outputs":[{"name":"slotsPerEpoch","type":"uint256","internalType":"uint256"},{"name":"secondsPerSlot","type":"uint256","internalType":"uint256"},{"name":"genesisTime","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[],"outputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"consensusReport","type":"bytes32","internalType":"bytes32"},{"name":"isReportProcessing","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getConsensusStateForMember","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"tuple","internalType":"struct HashConsensus.MemberConsensusState","components":[{"name":"currentFrameRefSlot","type":"uint256","internalType":"uint256"},{"name":"currentFrameConsensusReport","type":"bytes32","internalType":"bytes32"},{"name":"isMember","type":"bool","internalType":"bool"},{"name":"isFastLane","type":"bool","internalType":"bool"},{"name":"canReport","type":"bool","internalType":"bool"},{"name":"lastMemberReportRefSlot","type":"uint256","internalType":"uint256"},{"name":"currentFrameMemberReport","type":"bytes32","internalType":"bytes32"}]}],"stateMutability":"view"},{"type":"function","name":"getCurrentFrame","inputs":[],"outputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"reportProcessingDeadlineSlot","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getFastLaneMembers","inputs":[],"outputs":[{"name":"addresses","type":"address[]","internalType":"address[]"},{"name":"lastReportedRefSlots","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getFrameConfig","inputs":[],"outputs":[{"name":"initialEpoch","type":"uint256","internalType":"uint256"},{"name":"epochsPerFrame","type":"uint256","internalType":"uint256"},{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getInitialRefSlot","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getIsFastLaneMember","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getIsMember","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getMembers","inputs":[],"outputs":[{"name":"addresses","type":"address[]","internalType":"address[]"},{"name":"lastReportedRefSlots","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getQuorum","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getReportProcessor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getReportVariants","inputs":[],"outputs":[{"name":"variants","type":"bytes32[]","internalType":"bytes32[]"},{"name":"support","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"removeMember","inputs":[{"name":"addr","type":"address","internalType":"address"},{"name":"quorum","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFastLaneLengthSlots","inputs":[{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFrameConfig","inputs":[{"name":"epochsPerFrame","type":"uint256","internalType":"uint256"},{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setQuorum","inputs":[{"name":"quorum","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setReportProcessor","inputs":[{"name":"newProcessor","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitReport","inputs":[{"name":"slot","type":"uint256","internalType":"uint256"},{"name":"report","type":"bytes32","internalType":"bytes32"},{"name":"consensusVersion","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateInitialEpoch","inputs":[{"name":"initialEpoch","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"ConsensusLost","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConsensusReached","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"report","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"support","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"FastLaneConfigSet","inputs":[{"name":"fastLaneLengthSlots","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"FrameConfigSet","inputs":[{"name":"newInitialEpoch","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newEpochsPerFrame","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"MemberAdded","inputs":[{"name":"addr","type":"address","indexed":true,"internalType":"address"},{"name":"newTotalMembers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newQuorum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MemberRemoved","inputs":[{"name":"addr","type":"address","indexed":true,"internalType":"address"},{"name":"newTotalMembers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newQuorum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"QuorumSet","inputs":[{"name":"newQuorum","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"totalMembers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"prevQuorum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ReportProcessorSet","inputs":[{"name":"processor","type":"address","indexed":true,"internalType":"address"},{"name":"prevProcessor","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ReportReceived","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"member","type":"address","indexed":true,"internalType":"address"},{"name":"report","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressCannotBeZero","inputs":[]},{"type":"error","name":"AdminCannotBeZero","inputs":[]},{"type":"error","name":"ConsensusReportAlreadyProcessing","inputs":[]},{"type":"error","name":"DuplicateMember","inputs":[]},{"type":"error","name":"DuplicateReport","inputs":[]},{"type":"error","name":"EmptyReport","inputs":[]},{"type":"error","name":"EpochsPerFrameCannotBeZero","inputs":[]},{"type":"error","name":"FastLanePeriodCannotBeLongerThanFrame","inputs":[]},{"type":"error","name":"InitialEpochAlreadyArrived","inputs":[]},{"type":"error","name":"InitialEpochIsYetToArrive","inputs":[]},{"type":"error","name":"InitialEpochRefSlotCannotBeEarlierThanProcessingSlot","inputs":[]},{"type":"error","name":"InvalidChainConfig","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidSlot","inputs":[]},{"type":"error","name":"NewProcessorCannotBeTheSame","inputs":[]},{"type":"error","name":"NonFastLaneMemberCannotReportWithinFastLaneInterval","inputs":[]},{"type":"error","name":"NonMember","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"NumericOverflow","inputs":[]},{"type":"error","name":"QuorumTooSmall","inputs":[{"name":"minQuorum","type":"uint256","internalType":"uint256"},{"name":"receivedQuorum","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ReportProcessorCannotBeZero","inputs":[]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"StaleReport","inputs":[]},{"type":"error","name":"UnexpectedConsensusVersion","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"received","type":"uint256","internalType":"uint256"}]}] +[ + { + "inputs": [ + { + "internalType": "uint256", + "name": "slotsPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondsPerSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "genesisTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fastLaneLengthSlots", + "type": "uint256" + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "reportProcessor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AddressCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "AdminCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "ConsensusReportAlreadyProcessing", + "type": "error" + }, + { + "inputs": [], + "name": "DuplicateMember", + "type": "error" + }, + { + "inputs": [], + "name": "DuplicateReport", + "type": "error" + }, + { + "inputs": [], + "name": "EmptyReport", + "type": "error" + }, + { + "inputs": [], + "name": "EpochsPerFrameCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "FastLanePeriodCannotBeLongerThanFrame", + "type": "error" + }, + { + "inputs": [], + "name": "InitialEpochAlreadyArrived", + "type": "error" + }, + { + "inputs": [], + "name": "InitialEpochIsYetToArrive", + "type": "error" + }, + { + "inputs": [], + "name": "InitialEpochRefSlotCannotBeEarlierThanProcessingSlot", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidChainConfig", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSlot", + "type": "error" + }, + { + "inputs": [], + "name": "NewProcessorCannotBeTheSame", + "type": "error" + }, + { + "inputs": [], + "name": "NonFastLaneMemberCannotReportWithinFastLaneInterval", + "type": "error" + }, + { + "inputs": [], + "name": "NonMember", + "type": "error" + }, + { + "inputs": [], + "name": "NumericOverflow", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minQuorum", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedQuorum", + "type": "uint256" + } + ], + "name": "QuorumTooSmall", + "type": "error" + }, + { + "inputs": [], + "name": "ReportProcessorCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "StaleReport", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedConsensusVersion", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + } + ], + "name": "ConsensusLost", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "report", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "support", + "type": "uint256" + } + ], + "name": "ConsensusReached", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fastLaneLengthSlots", + "type": "uint256" + } + ], + "name": "FastLaneConfigSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newInitialEpoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochsPerFrame", + "type": "uint256" + } + ], + "name": "FrameConfigSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newTotalMembers", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newQuorum", + "type": "uint256" + } + ], + "name": "MemberAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newTotalMembers", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newQuorum", + "type": "uint256" + } + ], + "name": "MemberRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newQuorum", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalMembers", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "prevQuorum", + "type": "uint256" + } + ], + "name": "QuorumSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "processor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "prevProcessor", + "type": "address" + } + ], + "name": "ReportProcessorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "member", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "report", + "type": "bytes32" + } + ], + "name": "ReportReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DISABLE_CONSENSUS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_FAST_LANE_CONFIG_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_FRAME_CONFIG_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_MEMBERS_AND_QUORUM_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_REPORT_PROCESSOR_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "uint256", + "name": "quorum", + "type": "uint256" + } + ], + "name": "addMember", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableConsensus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getChainConfig", + "outputs": [ + { + "internalType": "uint256", + "name": "slotsPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondsPerSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "genesisTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusState", + "outputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "consensusReport", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "isReportProcessing", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "getConsensusStateForMember", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "currentFrameRefSlot", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "currentFrameConsensusReport", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "isMember", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isFastLane", + "type": "bool" + }, + { + "internalType": "bool", + "name": "canReport", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "lastMemberReportRefSlot", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "currentFrameMemberReport", + "type": "bytes32" + } + ], + "internalType": "struct HashConsensus.MemberConsensusState", + "name": "result", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCurrentFrame", + "outputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reportProcessingDeadlineSlot", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFastLaneMembers", + "outputs": [ + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "lastReportedRefSlots", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFrameConfig", + "outputs": [ + { + "internalType": "uint256", + "name": "initialEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fastLaneLengthSlots", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInitialRefSlot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "getIsFastLaneMember", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "getIsMember", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMembers", + "outputs": [ + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "lastReportedRefSlots", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getQuorum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReportProcessor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReportVariants", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "variants", + "type": "bytes32[]" + }, + { + "internalType": "uint256[]", + "name": "support", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "uint256", + "name": "quorum", + "type": "uint256" + } + ], + "name": "removeMember", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fastLaneLengthSlots", + "type": "uint256" + } + ], + "name": "setFastLaneLengthSlots", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epochsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fastLaneLengthSlots", + "type": "uint256" + } + ], + "name": "setFrameConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "quorum", + "type": "uint256" + } + ], + "name": "setQuorum", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newProcessor", + "type": "address" + } + ], + "name": "setReportProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "slot", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "report", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + } + ], + "name": "submitReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialEpoch", + "type": "uint256" + } + ], + "name": "updateInitialEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/assets/LazyOracle.json b/assets/LazyOracle.json new file mode 100644 index 000000000..88e362297 --- /dev/null +++ b/assets/LazyOracle.json @@ -0,0 +1,799 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_lidoLocator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [], + "name": "AdminCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "NotAuthorized", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "TotalValueTooLarge", + "type": "error" + }, + { + "inputs": [], + "name": "UnderflowInTotalValueCalculation", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "delta", + "type": "uint128" + } + ], + "name": "QuarantineExpired", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "delta", + "type": "uint128" + } + ], + "name": "QuarantinedDeposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "quarantinePeriod", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "maxRewardRatioBP", + "type": "uint16" + } + ], + "name": "SanityParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "cid", + "type": "string" + } + ], + "name": "VaultsReportDataUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIDO_LOCATOR", + "outputs": [ + { + "internalType": "contract ILidoLocator", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPDATE_SANITY_PARAMS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_totalValue", + "type": "uint256" + } + ], + "name": "_handleSanityChecks", + "outputs": [ + { + "internalType": "uint256", + "name": "totalValueWithoutQuarantine", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "inOutDeltaOnRefSlot", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_limit", + "type": "uint256" + } + ], + "name": "batchVaultsInfo", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint96", + "name": "vaultIndex", + "type": "uint96" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "inOutDelta", + "type": "int256" + }, + { + "internalType": "bytes32", + "name": "withdrawalCredentials", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "liabilityShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mintableStETH", + "type": "uint256" + }, + { + "internalType": "uint96", + "name": "shareLimit", + "type": "uint96" + }, + { + "internalType": "uint16", + "name": "reserveRatioBP", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "forcedRebalanceThresholdBP", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "infraFeeBP", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "liquidityFeeBP", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "reservationFeeBP", + "type": "uint16" + }, + { + "internalType": "bool", + "name": "pendingDisconnect", + "type": "bool" + } + ], + "internalType": "struct LazyOracle.VaultInfo[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMembers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "uint64", + "name": "_quarantinePeriod", + "type": "uint64" + }, + { + "internalType": "uint16", + "name": "_maxRewardRatioBP", + "type": "uint16" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "latestReportData", + "outputs": [ + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "treeRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "reportCid", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "latestReportTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxRewardRatioBP", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quarantinePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_vaultsDataTimestamp", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_vaultsDataTreeRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_vaultsDataReportCid", + "type": "string" + } + ], + "name": "updateReportData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "_quarantinePeriod", + "type": "uint64" + }, + { + "internalType": "uint16", + "name": "_maxRewardRatioBP", + "type": "uint16" + } + ], + "name": "updateSanityParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_totalValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_cumulativeLidoFees", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liabilityShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_slashingReserve", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "_proof", + "type": "bytes32[]" + } + ], + "name": "updateVaultData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "vaultQuarantine", + "outputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pendingTotalValueIncrease", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTimestamp", + "type": "uint256" + } + ], + "internalType": "struct LazyOracle.QuarantineInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vaultsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/assets/Lido.json b/assets/Lido.json index 412474526..c7dbcc97d 100644 --- a/assets/Lido.json +++ b/assets/Lido.json @@ -1 +1,1932 @@ -[{"constant":false,"inputs":[],"name":"resume","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hasInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STAKING_CONTROL_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ethAmount","type":"uint256"}],"name":"getSharesByPooledEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isStakingPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sender","type":"address"},{"name":"_recipient","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_script","type":"bytes"}],"name":"getEVMScriptExecutor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxStakeLimit","type":"uint256"},{"name":"_stakeLimitIncreasePerBlock","type":"uint256"}],"name":"setStakingLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RESUME_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lidoLocator","type":"address"},{"name":"_eip712StETH","type":"address"}],"name":"finalizeUpgrade_v2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getRecoveryVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalPooledEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDepositedValidators","type":"uint256"}],"name":"unsafeChangeDepositedValidators","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PAUSE_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTreasury","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isStopped","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBufferedEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lidoLocator","type":"address"},{"name":"_eip712StETH","type":"address"}],"name":"initialize","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"receiveELRewards","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getWithdrawalCredentials","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentStakeLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakeLimitFullInfo","outputs":[{"name":"isStakingPaused","type":"bool"},{"name":"isStakingLimitSet","type":"bool"},{"name":"currentStakeLimit","type":"uint256"},{"name":"maxStakeLimit","type":"uint256"},{"name":"maxStakeLimitGrowthBlocks","type":"uint256"},{"name":"prevStakeLimit","type":"uint256"},{"name":"prevStakeBlockNumber","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sender","type":"address"},{"name":"_recipient","type":"address"},{"name":"_sharesAmount","type":"uint256"}],"name":"transferSharesFrom","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"resumeStaking","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFeeDistribution","outputs":[{"name":"treasuryFeeBasisPoints","type":"uint16"},{"name":"insuranceFeeBasisPoints","type":"uint16"},{"name":"operatorsFeeBasisPoints","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"receiveWithdrawals","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_sharesAmount","type":"uint256"}],"name":"getPooledEthByShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"allowRecoverability","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"nonces","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"appId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"eip712Domain","outputs":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getContractVersion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitializationBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"},{"name":"_sharesAmount","type":"uint256"}],"name":"transferShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getEIP712StETH","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"}],"name":"transferToVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_sender","type":"address"},{"name":"_role","type":"bytes32"},{"name":"_params","type":"uint256[]"}],"name":"canPerform","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_referral","type":"address"}],"name":"submit","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getEVMScriptRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxDepositsCount","type":"uint256"},{"name":"_stakingModuleId","type":"uint256"},{"name":"_depositCalldata","type":"bytes"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"UNSAFE_CHANGE_DEPOSITED_VALIDATORS_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBeaconStat","outputs":[{"name":"depositedValidators","type":"uint256"},{"name":"beaconValidators","type":"uint256"},{"name":"beaconBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"removeStakingLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_reportTimestamp","type":"uint256"},{"name":"_timeElapsed","type":"uint256"},{"name":"_clValidators","type":"uint256"},{"name":"_clBalance","type":"uint256"},{"name":"_withdrawalVaultBalance","type":"uint256"},{"name":"_elRewardsVaultBalance","type":"uint256"},{"name":"_sharesRequestedToBurn","type":"uint256"},{"name":"_withdrawalFinalizationBatches","type":"uint256[]"},{"name":"_simulatedShareRate","type":"uint256"}],"name":"handleOracleReport","outputs":[{"name":"postRebaseAmounts","type":"uint256[4]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFee","outputs":[{"name":"totalFee","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kernel","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_deadline","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPetrified","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLidoLocator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canDeposit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STAKING_PAUSE_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDepositableEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"sharesOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pauseStaking","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTotalELRewardsCollected","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[],"name":"StakingPaused","type":"event"},{"anonymous":false,"inputs":[],"name":"StakingResumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"maxStakeLimit","type":"uint256"},{"indexed":false,"name":"stakeLimitIncreasePerBlock","type":"uint256"}],"name":"StakingLimitSet","type":"event"},{"anonymous":false,"inputs":[],"name":"StakingLimitRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reportTimestamp","type":"uint256"},{"indexed":false,"name":"preCLValidators","type":"uint256"},{"indexed":false,"name":"postCLValidators","type":"uint256"}],"name":"CLValidatorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"depositedValidators","type":"uint256"}],"name":"DepositedValidatorsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reportTimestamp","type":"uint256"},{"indexed":false,"name":"preCLBalance","type":"uint256"},{"indexed":false,"name":"postCLBalance","type":"uint256"},{"indexed":false,"name":"withdrawalsWithdrawn","type":"uint256"},{"indexed":false,"name":"executionLayerRewardsWithdrawn","type":"uint256"},{"indexed":false,"name":"postBufferedEther","type":"uint256"}],"name":"ETHDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"reportTimestamp","type":"uint256"},{"indexed":false,"name":"timeElapsed","type":"uint256"},{"indexed":false,"name":"preTotalShares","type":"uint256"},{"indexed":false,"name":"preTotalEther","type":"uint256"},{"indexed":false,"name":"postTotalShares","type":"uint256"},{"indexed":false,"name":"postTotalEther","type":"uint256"},{"indexed":false,"name":"sharesMintedAsFees","type":"uint256"}],"name":"TokenRebased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"lidoLocator","type":"address"}],"name":"LidoLocatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"ELRewardsReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"WithdrawalsReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"referral","type":"address"}],"name":"Submitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Unbuffered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"executor","type":"address"},{"indexed":false,"name":"script","type":"bytes"},{"indexed":false,"name":"input","type":"bytes"},{"indexed":false,"name":"returnData","type":"bytes"}],"name":"ScriptResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"vault","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"RecoverToVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"eip712StETH","type":"address"}],"name":"EIP712StETHInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"sharesValue","type":"uint256"}],"name":"TransferShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"preRebaseTokenAmount","type":"uint256"},{"indexed":false,"name":"postRebaseTokenAmount","type":"uint256"},{"indexed":false,"name":"sharesAmount","type":"uint256"}],"name":"SharesBurnt","type":"event"},{"anonymous":false,"inputs":[],"name":"Stopped","type":"event"},{"anonymous":false,"inputs":[],"name":"Resumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"}] +[ + { + "constant": true, + "inputs": [ + { + "name": "_sharesAmount", + "type": "uint256" + } + ], + "name": "getPooledEthBySharesRoundUp", + "outputs": [ + { + "name": "etherAmount", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "resume", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_recipient", + "type": "address" + }, + { + "name": "_amountOfShares", + "type": "uint256" + } + ], + "name": "mintExternalShares", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "stop", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "hasInitialized", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "STAKING_CONTROL_ROLE", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_ethAmount", + "type": "uint256" + } + ], + "name": "getSharesByPooledEth", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_reportTimestamp", + "type": "uint256" + }, + { + "name": "_timeElapsed", + "type": "uint256" + }, + { + "name": "_preTotalShares", + "type": "uint256" + }, + { + "name": "_preTotalEther", + "type": "uint256" + }, + { + "name": "_postTotalShares", + "type": "uint256" + }, + { + "name": "_postTotalEther", + "type": "uint256" + }, + { + "name": "_postInternalShares", + "type": "uint256" + }, + { + "name": "_postInternalEther", + "type": "uint256" + }, + { + "name": "_sharesMintedAsFees", + "type": "uint256" + } + ], + "name": "emitTokenRebase", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isStakingPaused", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_sender", + "type": "address" + }, + { + "name": "_recipient", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_script", + "type": "bytes" + } + ], + "name": "getEVMScriptExecutor", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_maxStakeLimit", + "type": "uint256" + }, + { + "name": "_stakeLimitIncreasePerBlock", + "type": "uint256" + } + ], + "name": "setStakingLimit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getRecoveryVault", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getTotalPooledEther", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_newDepositedValidators", + "type": "uint256" + } + ], + "name": "unsafeChangeDepositedValidators", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getTreasury", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isStopped", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getBufferedEther", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_lidoLocator", + "type": "address" + }, + { + "name": "_eip712StETH", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "receiveELRewards", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_recipient", + "type": "address" + }, + { + "name": "_amountOfShares", + "type": "uint256" + } + ], + "name": "mintShares", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getWithdrawalCredentials", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_reportTimestamp", + "type": "uint256" + }, + { + "name": "_preClValidators", + "type": "uint256" + }, + { + "name": "_reportClValidators", + "type": "uint256" + }, + { + "name": "_reportClBalance", + "type": "uint256" + } + ], + "name": "processClStateUpdate", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCurrentStakeLimit", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getExternalShares", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_amountOfShares", + "type": "uint256" + } + ], + "name": "internalizeExternalBadDebt", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getStakeLimitFullInfo", + "outputs": [ + { + "name": "isStakingPaused_", + "type": "bool" + }, + { + "name": "isStakingLimitSet", + "type": "bool" + }, + { + "name": "currentStakeLimit", + "type": "uint256" + }, + { + "name": "maxStakeLimit", + "type": "uint256" + }, + { + "name": "maxStakeLimitGrowthBlocks", + "type": "uint256" + }, + { + "name": "prevStakeLimit", + "type": "uint256" + }, + { + "name": "prevStakeBlockNumber", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_sender", + "type": "address" + }, + { + "name": "_recipient", + "type": "address" + }, + { + "name": "_sharesAmount", + "type": "uint256" + } + ], + "name": "transferSharesFrom", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_amountOfShares", + "type": "uint256" + } + ], + "name": "burnExternalShares", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "resumeStaking", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getFeeDistribution", + "outputs": [ + { + "name": "treasuryFeeBasisPoints", + "type": "uint16" + }, + { + "name": "insuranceFeeBasisPoints", + "type": "uint16" + }, + { + "name": "operatorsFeeBasisPoints", + "type": "uint16" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "receiveWithdrawals", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_sharesAmount", + "type": "uint256" + } + ], + "name": "getPooledEthByShares", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "token", + "type": "address" + } + ], + "name": "allowRecoverability", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "rebalanceExternalEtherToInternal", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "appId", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_amountOfShares", + "type": "uint256" + } + ], + "name": "burnShares", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getMaxMintableExternalShares", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getInitializationBlock", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_recipient", + "type": "address" + }, + { + "name": "_sharesAmount", + "type": "uint256" + } + ], + "name": "transferShares", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_reportTimestamp", + "type": "uint256" + }, + { + "name": "_reportClBalance", + "type": "uint256" + }, + { + "name": "_principalCLBalance", + "type": "uint256" + }, + { + "name": "_withdrawalsToWithdraw", + "type": "uint256" + }, + { + "name": "_elRewardsToWithdraw", + "type": "uint256" + }, + { + "name": "_lastWithdrawalRequestToFinalize", + "type": "uint256" + }, + { + "name": "_withdrawalsShareRate", + "type": "uint256" + }, + { + "name": "_etherToLockOnWithdrawalQueue", + "type": "uint256" + } + ], + "name": "collectRewardsAndProcessWithdrawals", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getEIP712StETH", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_oldBurner", + "type": "address" + }, + { + "name": "_contractsWithBurnerAllowances", + "type": "address[]" + } + ], + "name": "finalizeUpgrade_v3", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getMaxExternalRatioBP", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "transferToVault", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_sender", + "type": "address" + }, + { + "name": "_role", + "type": "bytes32" + }, + { + "name": "_params", + "type": "uint256[]" + } + ], + "name": "canPerform", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_referral", + "type": "address" + } + ], + "name": "submit", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getEVMScriptRegistry", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_recipient", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_maxDepositsCount", + "type": "uint256" + }, + { + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "name": "_depositCalldata", + "type": "bytes" + } + ], + "name": "deposit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "UNSAFE_CHANGE_DEPOSITED_VALIDATORS_ROLE", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getBeaconStat", + "outputs": [ + { + "name": "depositedValidators", + "type": "uint256" + }, + { + "name": "beaconValidators", + "type": "uint256" + }, + { + "name": "beaconBalance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "removeStakingLimit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getFee", + "outputs": [ + { + "name": "totalFee", + "type": "uint16" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "kernel", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getTotalShares", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_deadline", + "type": "uint256" + }, + { + "name": "_v", + "type": "uint8" + }, + { + "name": "_r", + "type": "bytes32" + }, + { + "name": "_s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isPetrified", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getExternalEther", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getLidoLocator", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "canDeposit", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "STAKING_PAUSE_ROLE", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getDepositableEther", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_maxExternalRatioBP", + "type": "uint256" + } + ], + "name": "setMaxExternalRatioBP", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_account", + "type": "address" + } + ], + "name": "sharesOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "pauseStaking", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getTotalELRewardsCollected", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [], + "name": "StakingPaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "StakingResumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "maxStakeLimit", + "type": "uint256" + }, + { + "indexed": false, + "name": "stakeLimitIncreasePerBlock", + "type": "uint256" + } + ], + "name": "StakingLimitSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "StakingLimitRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "reportTimestamp", + "type": "uint256" + }, + { + "indexed": false, + "name": "preCLValidators", + "type": "uint256" + }, + { + "indexed": false, + "name": "postCLValidators", + "type": "uint256" + } + ], + "name": "CLValidatorsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "depositedValidators", + "type": "uint256" + } + ], + "name": "DepositedValidatorsChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "reportTimestamp", + "type": "uint256" + }, + { + "indexed": false, + "name": "preCLBalance", + "type": "uint256" + }, + { + "indexed": false, + "name": "postCLBalance", + "type": "uint256" + }, + { + "indexed": false, + "name": "withdrawalsWithdrawn", + "type": "uint256" + }, + { + "indexed": false, + "name": "executionLayerRewardsWithdrawn", + "type": "uint256" + }, + { + "indexed": false, + "name": "postBufferedEther", + "type": "uint256" + } + ], + "name": "ETHDistributed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "reportTimestamp", + "type": "uint256" + }, + { + "indexed": false, + "name": "timeElapsed", + "type": "uint256" + }, + { + "indexed": false, + "name": "preTotalShares", + "type": "uint256" + }, + { + "indexed": false, + "name": "preTotalEther", + "type": "uint256" + }, + { + "indexed": false, + "name": "postTotalShares", + "type": "uint256" + }, + { + "indexed": false, + "name": "postTotalEther", + "type": "uint256" + }, + { + "indexed": false, + "name": "sharesMintedAsFees", + "type": "uint256" + } + ], + "name": "TokenRebased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "lidoLocator", + "type": "address" + } + ], + "name": "LidoLocatorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "ELRewardsReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "WithdrawalsReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "name": "referral", + "type": "address" + } + ], + "name": "Submitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "Unbuffered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "reportTimestamp", + "type": "uint256" + }, + { + "indexed": false, + "name": "postInternalShares", + "type": "uint256" + }, + { + "indexed": false, + "name": "postInternalEther", + "type": "uint256" + }, + { + "indexed": false, + "name": "sharesMintedAsFees", + "type": "uint256" + } + ], + "name": "InternalShareRateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "name": "amountOfShares", + "type": "uint256" + }, + { + "indexed": false, + "name": "amountOfStETH", + "type": "uint256" + } + ], + "name": "ExternalSharesMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "account", + "type": "address" + }, + { + "indexed": false, + "name": "amountOfShares", + "type": "uint256" + }, + { + "indexed": false, + "name": "stethAmount", + "type": "uint256" + } + ], + "name": "ExternalSharesBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "maxExternalRatioBP", + "type": "uint256" + } + ], + "name": "MaxExternalRatioBPSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "ExternalEtherTransferredToBuffer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amountOfShares", + "type": "uint256" + } + ], + "name": "ExternalBadDebtInternalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "executor", + "type": "address" + }, + { + "indexed": false, + "name": "script", + "type": "bytes" + }, + { + "indexed": false, + "name": "input", + "type": "bytes" + }, + { + "indexed": false, + "name": "returnData", + "type": "bytes" + } + ], + "name": "ScriptResult", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "vault", + "type": "address" + }, + { + "indexed": true, + "name": "token", + "type": "address" + }, + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "RecoverToVault", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "eip712StETH", + "type": "address" + } + ], + "name": "EIP712StETHInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "sharesValue", + "type": "uint256" + } + ], + "name": "TransferShares", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "account", + "type": "address" + }, + { + "indexed": false, + "name": "preRebaseTokenAmount", + "type": "uint256" + }, + { + "indexed": false, + "name": "postRebaseTokenAmount", + "type": "uint256" + }, + { + "indexed": false, + "name": "sharesAmount", + "type": "uint256" + } + ], + "name": "SharesBurnt", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Stopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + } +] \ No newline at end of file diff --git a/assets/LidoLocator.json b/assets/LidoLocator.json index 5d52d539d..9d0085da1 100644 --- a/assets/LidoLocator.json +++ b/assets/LidoLocator.json @@ -1 +1,497 @@ -[{"inputs":[{"components":[{"internalType":"address","name":"accountingOracle","type":"address"},{"internalType":"address","name":"depositSecurityModule","type":"address"},{"internalType":"address","name":"elRewardsVault","type":"address"},{"internalType":"address","name":"legacyOracle","type":"address"},{"internalType":"address","name":"lido","type":"address"},{"internalType":"address","name":"oracleReportSanityChecker","type":"address"},{"internalType":"address","name":"postTokenRebaseReceiver","type":"address"},{"internalType":"address","name":"burner","type":"address"},{"internalType":"address","name":"stakingRouter","type":"address"},{"internalType":"address","name":"treasury","type":"address"},{"internalType":"address","name":"validatorsExitBusOracle","type":"address"},{"internalType":"address","name":"withdrawalQueue","type":"address"},{"internalType":"address","name":"withdrawalVault","type":"address"},{"internalType":"address","name":"oracleDaemonConfig","type":"address"},{"internalType":"address","name":"validatorExitDelayVerifier","type":"address"},{"internalType":"address","name":"triggerableWithdrawalsGateway","type":"address"}],"internalType":"struct LidoLocator.Config","name":"_config","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"accountingOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coreComponents","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositSecurityModule","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"elRewardsVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lido","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleDaemonConfig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleReportComponentsForLido","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleReportSanityChecker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postTokenRebaseReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerableWithdrawalsGateway","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validatorExitDelayVerifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validatorsExitBusOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalQueue","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}] +[ + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "accountingOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "depositSecurityModule", + "type": "address" + }, + { + "internalType": "address", + "name": "elRewardsVault", + "type": "address" + }, + { + "internalType": "address", + "name": "lido", + "type": "address" + }, + { + "internalType": "address", + "name": "oracleReportSanityChecker", + "type": "address" + }, + { + "internalType": "address", + "name": "postTokenRebaseReceiver", + "type": "address" + }, + { + "internalType": "address", + "name": "burner", + "type": "address" + }, + { + "internalType": "address", + "name": "stakingRouter", + "type": "address" + }, + { + "internalType": "address", + "name": "treasury", + "type": "address" + }, + { + "internalType": "address", + "name": "validatorsExitBusOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "withdrawalQueue", + "type": "address" + }, + { + "internalType": "address", + "name": "withdrawalVault", + "type": "address" + }, + { + "internalType": "address", + "name": "oracleDaemonConfig", + "type": "address" + }, + { + "internalType": "address", + "name": "validatorExitDelayVerifier", + "type": "address" + }, + { + "internalType": "address", + "name": "triggerableWithdrawalsGateway", + "type": "address" + }, + { + "internalType": "address", + "name": "accounting", + "type": "address" + }, + { + "internalType": "address", + "name": "predepositGuarantee", + "type": "address" + }, + { + "internalType": "address", + "name": "wstETH", + "type": "address" + }, + { + "internalType": "address", + "name": "vaultHub", + "type": "address" + }, + { + "internalType": "address", + "name": "vaultFactory", + "type": "address" + }, + { + "internalType": "address", + "name": "lazyOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "operatorGrid", + "type": "address" + } + ], + "internalType": "struct LidoLocator.Config", + "name": "_config", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "accounting", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accountingOracle", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "burner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "coreComponents", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "depositSecurityModule", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "elRewardsVault", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lazyOracle", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lido", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "operatorGrid", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oracleDaemonConfig", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oracleReportComponents", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oracleReportSanityChecker", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "postTokenRebaseReceiver", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "predepositGuarantee", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakingRouter", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "treasury", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "triggerableWithdrawalsGateway", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "validatorExitDelayVerifier", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "validatorsExitBusOracle", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vaultFactory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vaultHub", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawalQueue", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawalVault", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "wstETH", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/assets/OracleDaemonConfig.json b/assets/OracleDaemonConfig.json index 717b53151..db2bb1131 100644 --- a/assets/OracleDaemonConfig.json +++ b/assets/OracleDaemonConfig.json @@ -1 +1,470 @@ -[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address[]","name":"_configManagers","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"string","name":"key","type":"string"}],"name":"EmptyValue","type":"error"},{"inputs":[{"internalType":"string","name":"key","type":"string"}],"name":"ValueDoesntExist","type":"error"},{"inputs":[{"internalType":"string","name":"key","type":"string"}],"name":"ValueExists","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"bytes","name":"value","type":"bytes"}],"name":"ConfigValueSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"ConfigValueUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"bytes","name":"value","type":"bytes"}],"name":"ConfigValueUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"CONFIG_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_key","type":"string"}],"name":"get","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_keys","type":"string[]"}],"name":"getList","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_key","type":"string"},{"internalType":"bytes","name":"_value","type":"bytes"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_key","type":"string"}],"name":"unset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_key","type":"string"},{"internalType":"bytes","name":"_value","type":"bytes"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"}] +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address[]", + "name": "_configManagers", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "key", + "type": "string" + } + ], + "name": "EmptyValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "key", + "type": "string" + } + ], + "name": "ValueDoesntExist", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "key", + "type": "string" + } + ], + "name": "ValueExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "ValueIsSame", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "ConfigValueSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + } + ], + "name": "ConfigValueUnset", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "ConfigValueUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "CONFIG_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_key", + "type": "string" + } + ], + "name": "get", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string[]", + "name": "_keys", + "type": "string[]" + } + ], + "name": "getList", + "outputs": [ + { + "internalType": "bytes[]", + "name": "", + "type": "bytes[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_key", + "type": "string" + }, + { + "internalType": "bytes", + "name": "_value", + "type": "bytes" + } + ], + "name": "set", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_key", + "type": "string" + } + ], + "name": "unset", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_key", + "type": "string" + }, + { + "internalType": "bytes", + "name": "_value", + "type": "bytes" + } + ], + "name": "update", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/assets/OracleReportSanityChecker.json b/assets/OracleReportSanityChecker.json index c584f0ab8..aa1db046f 100644 --- a/assets/OracleReportSanityChecker.json +++ b/assets/OracleReportSanityChecker.json @@ -1 +1,1529 @@ -[{"inputs":[{"internalType":"address","name":"_lidoLocator","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"components":[{"internalType":"uint256","name":"churnValidatorsPerDayLimit","type":"uint256"},{"internalType":"uint256","name":"oneOffCLBalanceDecreaseBPLimit","type":"uint256"},{"internalType":"uint256","name":"annualBalanceIncreaseBPLimit","type":"uint256"},{"internalType":"uint256","name":"simulatedShareRateDeviationBPLimit","type":"uint256"},{"internalType":"uint256","name":"maxValidatorExitRequestsPerReport","type":"uint256"},{"internalType":"uint256","name":"maxAccountingExtraDataListItemsCount","type":"uint256"},{"internalType":"uint256","name":"maxNodeOperatorsPerExtraDataItemCount","type":"uint256"},{"internalType":"uint256","name":"requestTimestampMargin","type":"uint256"},{"internalType":"uint256","name":"maxPositiveTokenRebase","type":"uint256"}],"internalType":"struct LimitsList","name":"_limitsList","type":"tuple"},{"components":[{"internalType":"address[]","name":"allLimitsManagers","type":"address[]"},{"internalType":"address[]","name":"churnValidatorsPerDayLimitManagers","type":"address[]"},{"internalType":"address[]","name":"oneOffCLBalanceDecreaseLimitManagers","type":"address[]"},{"internalType":"address[]","name":"annualBalanceIncreaseLimitManagers","type":"address[]"},{"internalType":"address[]","name":"shareRateDeviationLimitManagers","type":"address[]"},{"internalType":"address[]","name":"maxValidatorExitRequestsPerReportManagers","type":"address[]"},{"internalType":"address[]","name":"maxAccountingExtraDataListItemsCountManagers","type":"address[]"},{"internalType":"address[]","name":"maxNodeOperatorsPerExtraDataItemCountManagers","type":"address[]"},{"internalType":"address[]","name":"requestTimestampMarginManagers","type":"address[]"},{"internalType":"address[]","name":"maxPositiveTokenRebaseManagers","type":"address[]"}],"internalType":"struct OracleReportSanityChecker.ManagersRoster","name":"_managersRoster","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ActualShareRateIsZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"limitPerDay","type":"uint256"},{"internalType":"uint256","name":"exitedPerDay","type":"uint256"}],"name":"ExitedValidatorsLimitExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"churnLimit","type":"uint256"}],"name":"IncorrectAppearedValidators","type":"error"},{"inputs":[{"internalType":"uint256","name":"oneOffCLBalanceDecreaseBP","type":"uint256"}],"name":"IncorrectCLBalanceDecrease","type":"error"},{"inputs":[{"internalType":"uint256","name":"annualBalanceDiff","type":"uint256"}],"name":"IncorrectCLBalanceIncrease","type":"error"},{"inputs":[{"internalType":"uint256","name":"actualELRewardsVaultBalance","type":"uint256"}],"name":"IncorrectELRewardsVaultBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"churnLimit","type":"uint256"}],"name":"IncorrectExitedValidators","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"maxAllowedValue","type":"uint256"}],"name":"IncorrectLimitValue","type":"error"},{"inputs":[{"internalType":"uint256","name":"maxRequestsCount","type":"uint256"}],"name":"IncorrectNumberOfExitRequestsPerReport","type":"error"},{"inputs":[{"internalType":"uint256","name":"requestCreationBlock","type":"uint256"}],"name":"IncorrectRequestFinalization","type":"error"},{"inputs":[{"internalType":"uint256","name":"actualSharesToBurn","type":"uint256"}],"name":"IncorrectSharesRequestedToBurn","type":"error"},{"inputs":[{"internalType":"uint256","name":"actualWithdrawalVaultBalance","type":"uint256"}],"name":"IncorrectWithdrawalsVaultBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"maxItemsCount","type":"uint256"},{"internalType":"uint256","name":"receivedItemsCount","type":"uint256"}],"name":"MaxAccountingExtraDataItemsCountExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"simulatedShareRate","type":"uint256"},{"internalType":"uint256","name":"actualShareRate","type":"uint256"}],"name":"TooHighSimulatedShareRate","type":"error"},{"inputs":[],"name":"TooHighTokenRebaseLimit","type":"error"},{"inputs":[{"internalType":"uint256","name":"simulatedShareRate","type":"uint256"},{"internalType":"uint256","name":"actualShareRate","type":"uint256"}],"name":"TooLowSimulatedShareRate","type":"error"},{"inputs":[],"name":"TooLowTokenRebaseLimit","type":"error"},{"inputs":[{"internalType":"uint256","name":"itemIndex","type":"uint256"},{"internalType":"uint256","name":"nodeOpsCount","type":"uint256"}],"name":"TooManyNodeOpsPerExtraDataItem","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"annualBalanceIncreaseBPLimit","type":"uint256"}],"name":"AnnualBalanceIncreaseBPLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"churnValidatorsPerDayLimit","type":"uint256"}],"name":"ChurnValidatorsPerDayLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxAccountingExtraDataListItemsCount","type":"uint256"}],"name":"MaxAccountingExtraDataListItemsCountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxNodeOperatorsPerExtraDataItemCount","type":"uint256"}],"name":"MaxNodeOperatorsPerExtraDataItemCountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxPositiveTokenRebase","type":"uint256"}],"name":"MaxPositiveTokenRebaseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxValidatorExitRequestsPerReport","type":"uint256"}],"name":"MaxValidatorExitRequestsPerReportSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oneOffCLBalanceDecreaseBPLimit","type":"uint256"}],"name":"OneOffCLBalanceDecreaseBPLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestTimestampMargin","type":"uint256"}],"name":"RequestTimestampMarginSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"simulatedShareRateDeviationBPLimit","type":"uint256"}],"name":"SimulatedShareRateDeviationBPLimitSet","type":"event"},{"inputs":[],"name":"ALL_LIMITS_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ANNUAL_BALANCE_INCREASE_LIMIT_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHURN_VALIDATORS_PER_DAY_LIMIT_MANGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ACCOUNTING_EXTRA_DATA_LIST_ITEMS_COUNT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NODE_OPERATORS_PER_EXTRA_DATA_ITEM_COUNT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_POSITIVE_TOKEN_REBASE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VALIDATOR_EXIT_REQUESTS_PER_REPORT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_OFF_CL_BALANCE_DECREASE_LIMIT_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUEST_TIMESTAMP_MARGIN_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_RATE_DEVIATION_LIMIT_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_extraDataListItemsCount","type":"uint256"}],"name":"checkAccountingExtraDataListItemsCount","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeElapsed","type":"uint256"},{"internalType":"uint256","name":"_preCLBalance","type":"uint256"},{"internalType":"uint256","name":"_postCLBalance","type":"uint256"},{"internalType":"uint256","name":"_withdrawalVaultBalance","type":"uint256"},{"internalType":"uint256","name":"_elRewardsVaultBalance","type":"uint256"},{"internalType":"uint256","name":"_sharesRequestedToBurn","type":"uint256"},{"internalType":"uint256","name":"_preCLValidators","type":"uint256"},{"internalType":"uint256","name":"_postCLValidators","type":"uint256"}],"name":"checkAccountingOracleReport","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_exitRequestsCount","type":"uint256"}],"name":"checkExitBusOracleReport","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_exitedValidatorsCount","type":"uint256"}],"name":"checkExitedValidatorsRatePerDay","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_itemIndex","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorsCount","type":"uint256"}],"name":"checkNodeOperatorsPerExtraDataItemCount","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_postTotalPooledEther","type":"uint256"},{"internalType":"uint256","name":"_postTotalShares","type":"uint256"},{"internalType":"uint256","name":"_etherLockedOnWithdrawalQueue","type":"uint256"},{"internalType":"uint256","name":"_sharesBurntDueToWithdrawals","type":"uint256"},{"internalType":"uint256","name":"_simulatedShareRate","type":"uint256"}],"name":"checkSimulatedShareRate","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastFinalizableRequestId","type":"uint256"},{"internalType":"uint256","name":"_reportTimestamp","type":"uint256"}],"name":"checkWithdrawalQueueOracleReport","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLidoLocator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPositiveTokenRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOracleReportLimits","outputs":[{"components":[{"internalType":"uint256","name":"churnValidatorsPerDayLimit","type":"uint256"},{"internalType":"uint256","name":"oneOffCLBalanceDecreaseBPLimit","type":"uint256"},{"internalType":"uint256","name":"annualBalanceIncreaseBPLimit","type":"uint256"},{"internalType":"uint256","name":"simulatedShareRateDeviationBPLimit","type":"uint256"},{"internalType":"uint256","name":"maxValidatorExitRequestsPerReport","type":"uint256"},{"internalType":"uint256","name":"maxAccountingExtraDataListItemsCount","type":"uint256"},{"internalType":"uint256","name":"maxNodeOperatorsPerExtraDataItemCount","type":"uint256"},{"internalType":"uint256","name":"requestTimestampMargin","type":"uint256"},{"internalType":"uint256","name":"maxPositiveTokenRebase","type":"uint256"}],"internalType":"struct LimitsList","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_annualBalanceIncreaseBPLimit","type":"uint256"}],"name":"setAnnualBalanceIncreaseBPLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_churnValidatorsPerDayLimit","type":"uint256"}],"name":"setChurnValidatorsPerDayLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAccountingExtraDataListItemsCount","type":"uint256"}],"name":"setMaxAccountingExtraDataListItemsCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxValidatorExitRequestsPerReport","type":"uint256"}],"name":"setMaxExitRequestsPerOracleReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxNodeOperatorsPerExtraDataItemCount","type":"uint256"}],"name":"setMaxNodeOperatorsPerExtraDataItemCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPositiveTokenRebase","type":"uint256"}],"name":"setMaxPositiveTokenRebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneOffCLBalanceDecreaseBPLimit","type":"uint256"}],"name":"setOneOffCLBalanceDecreaseBPLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"churnValidatorsPerDayLimit","type":"uint256"},{"internalType":"uint256","name":"oneOffCLBalanceDecreaseBPLimit","type":"uint256"},{"internalType":"uint256","name":"annualBalanceIncreaseBPLimit","type":"uint256"},{"internalType":"uint256","name":"simulatedShareRateDeviationBPLimit","type":"uint256"},{"internalType":"uint256","name":"maxValidatorExitRequestsPerReport","type":"uint256"},{"internalType":"uint256","name":"maxAccountingExtraDataListItemsCount","type":"uint256"},{"internalType":"uint256","name":"maxNodeOperatorsPerExtraDataItemCount","type":"uint256"},{"internalType":"uint256","name":"requestTimestampMargin","type":"uint256"},{"internalType":"uint256","name":"maxPositiveTokenRebase","type":"uint256"}],"internalType":"struct LimitsList","name":"_limitsList","type":"tuple"}],"name":"setOracleReportLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestTimestampMargin","type":"uint256"}],"name":"setRequestTimestampMargin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_simulatedShareRateDeviationBPLimit","type":"uint256"}],"name":"setSimulatedShareRateDeviationBPLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preTotalPooledEther","type":"uint256"},{"internalType":"uint256","name":"_preTotalShares","type":"uint256"},{"internalType":"uint256","name":"_preCLBalance","type":"uint256"},{"internalType":"uint256","name":"_postCLBalance","type":"uint256"},{"internalType":"uint256","name":"_withdrawalVaultBalance","type":"uint256"},{"internalType":"uint256","name":"_elRewardsVaultBalance","type":"uint256"},{"internalType":"uint256","name":"_sharesRequestedToBurn","type":"uint256"},{"internalType":"uint256","name":"_etherToLockForWithdrawals","type":"uint256"},{"internalType":"uint256","name":"_newSharesToBurnForWithdrawals","type":"uint256"}],"name":"smoothenTokenRebase","outputs":[{"internalType":"uint256","name":"withdrawals","type":"uint256"},{"internalType":"uint256","name":"elRewards","type":"uint256"},{"internalType":"uint256","name":"simulatedSharesToBurn","type":"uint256"},{"internalType":"uint256","name":"sharesToBurn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}] +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_lidoLocator", + "type": "address" + }, + { + "internalType": "address", + "name": "_accountingOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "_accounting", + "type": "address" + }, + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "exitedValidatorsPerDayLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "appearedValidatorsPerDayLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "annualBalanceIncreaseBPLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxValidatorExitRequestsPerReport", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxItemsPerExtraDataTransaction", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxNodeOperatorsPerExtraDataItem", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestTimestampMargin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPositiveTokenRebase", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "initialSlashingAmountPWei", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "inactivityPenaltiesAmountPWei", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "clBalanceOraclesErrorUpperBPLimit", + "type": "uint256" + } + ], + "internalType": "struct LimitsList", + "name": "_limitsList", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ActualShareRateIsZero", + "type": "error" + }, + { + "inputs": [], + "name": "AdminCannotBeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxValue", + "type": "uint256" + } + ], + "name": "BasisPointsOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "CalledNotFromAccounting", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "limitPerDay", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedPerDay", + "type": "uint256" + } + ], + "name": "ExitedValidatorsLimitExceeded", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "appearedValidatorsLimit", + "type": "uint256" + } + ], + "name": "IncorrectAppearedValidators", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "negativeCLRebaseSum", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxNegativeCLRebaseSum", + "type": "uint256" + } + ], + "name": "IncorrectCLBalanceDecrease", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "annualBalanceDiff", + "type": "uint256" + } + ], + "name": "IncorrectCLBalanceIncrease", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actualELRewardsVaultBalance", + "type": "uint256" + } + ], + "name": "IncorrectELRewardsVaultBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "exitedValidatorsLimit", + "type": "uint256" + } + ], + "name": "IncorrectExitedValidators", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minAllowedValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxAllowedValue", + "type": "uint256" + } + ], + "name": "IncorrectLimitValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxRequestsCount", + "type": "uint256" + } + ], + "name": "IncorrectNumberOfExitRequestsPerReport", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestCreationBlock", + "type": "uint256" + } + ], + "name": "IncorrectRequestFinalization", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actualSharesToBurn", + "type": "uint256" + } + ], + "name": "IncorrectSharesRequestedToBurn", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actualWithdrawalVaultBalance", + "type": "uint256" + } + ], + "name": "IncorrectWithdrawalsVaultBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reportedValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "provedValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "limitBP", + "type": "uint256" + } + ], + "name": "NegativeRebaseFailedCLBalanceMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "NegativeRebaseFailedSecondOpinionReportIsNotReady", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reportedValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "provedValue", + "type": "uint256" + } + ], + "name": "NegativeRebaseFailedWithdrawalVaultBalanceMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "NegativeTotalPooledEther", + "type": "error" + }, + { + "inputs": [], + "name": "TooHighTokenRebaseLimit", + "type": "error" + }, + { + "inputs": [], + "name": "TooLowTokenRebaseLimit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxItemsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedItemsCount", + "type": "uint256" + } + ], + "name": "TooManyItemsPerExtraDataTransaction", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "itemIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nodeOpsCount", + "type": "uint256" + } + ], + "name": "TooManyNodeOpsPerExtraDataItem", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "annualBalanceIncreaseBPLimit", + "type": "uint256" + } + ], + "name": "AnnualBalanceIncreaseBPLimitSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "appearedValidatorsPerDayLimit", + "type": "uint256" + } + ], + "name": "AppearedValidatorsPerDayLimitSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "clBalanceOraclesErrorUpperBPLimit", + "type": "uint256" + } + ], + "name": "CLBalanceOraclesErrorUpperBPLimitSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "exitedValidatorsPerDayLimit", + "type": "uint256" + } + ], + "name": "ExitedValidatorsPerDayLimitSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "inactivityPenaltiesAmountPWei", + "type": "uint256" + } + ], + "name": "InactivityPenaltiesAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "initialSlashingAmountPWei", + "type": "uint256" + } + ], + "name": "InitialSlashingAmountSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxItemsPerExtraDataTransaction", + "type": "uint256" + } + ], + "name": "MaxItemsPerExtraDataTransactionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxNodeOperatorsPerExtraDataItem", + "type": "uint256" + } + ], + "name": "MaxNodeOperatorsPerExtraDataItemSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxPositiveTokenRebase", + "type": "uint256" + } + ], + "name": "MaxPositiveTokenRebaseSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxValidatorExitRequestsPerReport", + "type": "uint256" + } + ], + "name": "MaxValidatorExitRequestsPerReportSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "clTotalBalance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "clBalanceDecrease", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maxAllowedCLRebaseNegativeSum", + "type": "uint256" + } + ], + "name": "NegativeCLRebaseAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "clBalanceWei", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "withdrawalVaultBalance", + "type": "uint256" + } + ], + "name": "NegativeCLRebaseConfirmed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestTimestampMargin", + "type": "uint256" + } + ], + "name": "RequestTimestampMarginSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract ISecondOpinionOracle", + "name": "secondOpinionOracle", + "type": "address" + } + ], + "name": "SecondOpinionOracleChanged", + "type": "event" + }, + { + "inputs": [], + "name": "ALL_LIMITS_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ANNUAL_BALANCE_INCREASE_LIMIT_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_ITEMS_PER_EXTRA_DATA_TRANSACTION_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_NODE_OPERATORS_PER_EXTRA_DATA_ITEM_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_POSITIVE_TOKEN_REBASE_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_VALIDATOR_EXIT_REQUESTS_PER_REPORT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REQUEST_TIMESTAMP_MARGIN_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SECOND_OPINION_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SHARE_RATE_DEVIATION_LIMIT_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_timeElapsed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_preCLBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_postCLBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_withdrawalVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_elRewardsVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_sharesRequestedToBurn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_preCLValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_postCLValidators", + "type": "uint256" + } + ], + "name": "checkAccountingOracleReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_exitRequestsCount", + "type": "uint256" + } + ], + "name": "checkExitBusOracleReport", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_exitedValidatorsCount", + "type": "uint256" + } + ], + "name": "checkExitedValidatorsRatePerDay", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_extraDataListItemsCount", + "type": "uint256" + } + ], + "name": "checkExtraDataItemsCountPerTransaction", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_itemIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorsCount", + "type": "uint256" + } + ], + "name": "checkNodeOperatorsPerExtraDataItemCount", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_lastFinalizableRequestId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_reportTimestamp", + "type": "uint256" + } + ], + "name": "checkWithdrawalQueueOracleReport", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLidoLocator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMaxPositiveTokenRebase", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOracleReportLimits", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "exitedValidatorsPerDayLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "appearedValidatorsPerDayLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "annualBalanceIncreaseBPLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxValidatorExitRequestsPerReport", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxItemsPerExtraDataTransaction", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxNodeOperatorsPerExtraDataItem", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestTimestampMargin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPositiveTokenRebase", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "initialSlashingAmountPWei", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "inactivityPenaltiesAmountPWei", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "clBalanceOraclesErrorUpperBPLimit", + "type": "uint256" + } + ], + "internalType": "struct LimitsList", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReportDataCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "reportData", + "outputs": [ + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "totalExitedValidators", + "type": "uint64" + }, + { + "internalType": "uint128", + "name": "negativeCLRebaseWei", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "secondOpinionOracle", + "outputs": [ + { + "internalType": "contract ISecondOpinionOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_annualBalanceIncreaseBPLimit", + "type": "uint256" + } + ], + "name": "setAnnualBalanceIncreaseBPLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_appearedValidatorsPerDayLimit", + "type": "uint256" + } + ], + "name": "setAppearedValidatorsPerDayLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_exitedValidatorsPerDayLimit", + "type": "uint256" + } + ], + "name": "setExitedValidatorsPerDayLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_initialSlashingAmountPWei", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_inactivityPenaltiesAmountPWei", + "type": "uint256" + } + ], + "name": "setInitialSlashingAndPenaltiesAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxValidatorExitRequestsPerReport", + "type": "uint256" + } + ], + "name": "setMaxExitRequestsPerOracleReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxItemsPerExtraDataTransaction", + "type": "uint256" + } + ], + "name": "setMaxItemsPerExtraDataTransaction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxNodeOperatorsPerExtraDataItem", + "type": "uint256" + } + ], + "name": "setMaxNodeOperatorsPerExtraDataItem", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxPositiveTokenRebase", + "type": "uint256" + } + ], + "name": "setMaxPositiveTokenRebase", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "exitedValidatorsPerDayLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "appearedValidatorsPerDayLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "annualBalanceIncreaseBPLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxValidatorExitRequestsPerReport", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxItemsPerExtraDataTransaction", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxNodeOperatorsPerExtraDataItem", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestTimestampMargin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPositiveTokenRebase", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "initialSlashingAmountPWei", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "inactivityPenaltiesAmountPWei", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "clBalanceOraclesErrorUpperBPLimit", + "type": "uint256" + } + ], + "internalType": "struct LimitsList", + "name": "_limitsList", + "type": "tuple" + }, + { + "internalType": "contract ISecondOpinionOracle", + "name": "_secondOpinionOracle", + "type": "address" + } + ], + "name": "setOracleReportLimits", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_requestTimestampMargin", + "type": "uint256" + } + ], + "name": "setRequestTimestampMargin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ISecondOpinionOracle", + "name": "_secondOpinionOracle", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_clBalanceOraclesErrorUpperBPLimit", + "type": "uint256" + } + ], + "name": "setSecondOpinionOracleAndCLBalanceUpperMargin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_preTotalPooledEther", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_preTotalShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_preCLBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_postCLBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_withdrawalVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_elRewardsVaultBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_sharesRequestedToBurn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_etherToLockForWithdrawals", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_newSharesToBurnForWithdrawals", + "type": "uint256" + } + ], + "name": "smoothenTokenRebase", + "outputs": [ + { + "internalType": "uint256", + "name": "withdrawals", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "elRewards", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesFromWQToBurn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesToBurn", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/assets/StakingRouter.json b/assets/StakingRouter.json index 829a8d231..6c8a21a18 100644 --- a/assets/StakingRouter.json +++ b/assets/StakingRouter.json @@ -1 +1,2597 @@ -[{"inputs":[{"internalType":"address","name":"_depositContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AppAuthLidoFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"firstArrayLength","type":"uint256"},{"internalType":"uint256","name":"secondArrayLength","type":"uint256"}],"name":"ArraysLengthMismatch","type":"error"},{"inputs":[],"name":"DepositContractZeroAddress","type":"error"},{"inputs":[],"name":"DirectETHTransfer","type":"error"},{"inputs":[],"name":"EmptyWithdrawalsCredentials","type":"error"},{"inputs":[],"name":"ExitedValidatorsCountCannotDecrease","type":"error"},{"inputs":[],"name":"InvalidContractVersionIncrement","type":"error"},{"inputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"},{"internalType":"uint256","name":"depositsCount","type":"uint256"}],"name":"InvalidDepositsValue","type":"error"},{"inputs":[],"name":"InvalidFeeSum","type":"error"},{"inputs":[],"name":"InvalidMaxDepositPerBlockValue","type":"error"},{"inputs":[],"name":"InvalidMinDepositBlockDistance","type":"error"},{"inputs":[],"name":"InvalidPriorityExitShareThreshold","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InvalidPublicKeysBatchLength","type":"error"},{"inputs":[{"internalType":"uint256","name":"code","type":"uint256"}],"name":"InvalidReportData","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InvalidSignaturesBatchLength","type":"error"},{"inputs":[],"name":"InvalidStakeShareLimit","type":"error"},{"inputs":[],"name":"NonZeroContractVersionOnInit","type":"error"},{"inputs":[{"internalType":"uint256","name":"reportedExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"depositedValidatorsCount","type":"uint256"}],"name":"ReportedExitedValidatorsExceedDeposited","type":"error"},{"inputs":[],"name":"StakingModuleAddressExists","type":"error"},{"inputs":[],"name":"StakingModuleNotActive","type":"error"},{"inputs":[],"name":"StakingModuleStatusTheSame","type":"error"},{"inputs":[],"name":"StakingModuleUnregistered","type":"error"},{"inputs":[],"name":"StakingModuleWrongName","type":"error"},{"inputs":[],"name":"StakingModulesLimitExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedContractVersion","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentModuleExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"currentNodeOpExitedValidatorsCount","type":"uint256"}],"name":"UnexpectedCurrentValidatorsCount","type":"error"},{"inputs":[{"internalType":"uint256","name":"newModuleTotalExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"newModuleTotalExitedValidatorsCountInStakingRouter","type":"uint256"}],"name":"UnexpectedFinalExitedValidatorsCount","type":"error"},{"inputs":[],"name":"UnrecoverableModuleError","type":"error"},{"inputs":[],"name":"ZeroAddressAdmin","type":"error"},{"inputs":[],"name":"ZeroAddressLido","type":"error"},{"inputs":[],"name":"ZeroAddressStakingModule","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"lowLevelRevertData","type":"bytes"}],"name":"ExitedAndStuckValidatorsCountsUpdateFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"lowLevelRevertData","type":"bytes"}],"name":"RewardsMintedReportFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"address","name":"stakingModule","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"createdBy","type":"address"}],"name":"StakingModuleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unreportedExitedValidatorsCount","type":"uint256"}],"name":"StakingModuleExitedValidatorsIncompleteReporting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakingModuleFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"StakingModuleFeesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxDepositsPerBlock","type":"uint256"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"StakingModuleMaxDepositsPerBlockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minDepositBlockDistance","type":"uint256"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"StakingModuleMinDepositBlockDistanceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeShareLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priorityExitShareThreshold","type":"uint256"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"StakingModuleShareLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"enum StakingRouter.StakingModuleStatus","name":"status","type":"uint8"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"StakingModuleStatusSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakingRouterETHDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"withdrawalCredentials","type":"bytes32"},{"indexed":false,"internalType":"address","name":"setBy","type":"address"}],"name":"WithdrawalCredentialsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"lowLevelRevertData","type":"bytes"}],"name":"WithdrawalsCredentialsChangeFailed","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_CONTRACT","outputs":[{"internalType":"contract IDepositContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_PRECISION_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_WITHDRAWAL_CREDENTIALS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STAKING_MODULES_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STAKING_MODULE_NAME_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPORT_EXITED_VALIDATORS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPORT_REWARDS_MINTED_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPORT_VALIDATOR_EXITING_STATUS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_MODULE_MANAGE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_MODULE_UNVETTING_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNSAFE_SET_EXITED_VALIDATORS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_stakingModuleAddress","type":"address"},{"internalType":"uint256","name":"_stakeShareLimit","type":"uint256"},{"internalType":"uint256","name":"_priorityExitShareThreshold","type":"uint256"},{"internalType":"uint256","name":"_stakingModuleFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_maxDepositsPerBlock","type":"uint256"},{"internalType":"uint256","name":"_minDepositBlockDistance","type":"uint256"}],"name":"addStakingModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"bytes","name":"_nodeOperatorIds","type":"bytes"},{"internalType":"bytes","name":"_vettedSigningKeysCounts","type":"bytes"}],"name":"decreaseStakingModuleVettedKeysCountByNodeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositsCount","type":"uint256"},{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"bytes","name":"_depositCalldata","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_priorityExitShareThresholds","type":"uint256[]"},{"internalType":"uint256[]","name":"_maxDepositsPerBlock","type":"uint256[]"},{"internalType":"uint256[]","name":"_minDepositBlockDistances","type":"uint256[]"}],"name":"finalizeUpgrade_v2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getAllNodeOperatorDigests","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"components":[{"internalType":"uint256","name":"targetLimitMode","type":"uint256"},{"internalType":"uint256","name":"targetValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"refundedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckPenaltyEndTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.NodeOperatorSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.NodeOperatorDigest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllStakingModuleDigests","outputs":[{"components":[{"internalType":"uint256","name":"nodeOperatorsCount","type":"uint256"},{"internalType":"uint256","name":"activeNodeOperatorsCount","type":"uint256"},{"components":[{"internalType":"uint24","name":"id","type":"uint24"},{"internalType":"address","name":"stakingModuleAddress","type":"address"},{"internalType":"uint16","name":"stakingModuleFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"stakeShareLimit","type":"uint16"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"lastDepositAt","type":"uint64"},{"internalType":"uint256","name":"lastDepositBlock","type":"uint256"},{"internalType":"uint256","name":"exitedValidatorsCount","type":"uint256"},{"internalType":"uint16","name":"priorityExitShareThreshold","type":"uint16"},{"internalType":"uint64","name":"maxDepositsPerBlock","type":"uint64"},{"internalType":"uint64","name":"minDepositBlockDistance","type":"uint64"}],"internalType":"struct StakingRouter.StakingModule","name":"state","type":"tuple"},{"components":[{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModuleSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.StakingModuleDigest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositsCount","type":"uint256"}],"name":"getDepositsAllocation","outputs":[{"internalType":"uint256","name":"allocated","type":"uint256"},{"internalType":"uint256[]","name":"allocations","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLido","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256[]","name":"_nodeOperatorIds","type":"uint256[]"}],"name":"getNodeOperatorDigests","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"components":[{"internalType":"uint256","name":"targetLimitMode","type":"uint256"},{"internalType":"uint256","name":"targetValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"refundedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckPenaltyEndTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.NodeOperatorSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.NodeOperatorDigest[]","name":"digests","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"getNodeOperatorDigests","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"components":[{"internalType":"uint256","name":"targetLimitMode","type":"uint256"},{"internalType":"uint256","name":"targetValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"refundedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckPenaltyEndTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.NodeOperatorSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.NodeOperatorDigest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"}],"name":"getNodeOperatorSummary","outputs":[{"components":[{"internalType":"uint256","name":"targetLimitMode","type":"uint256"},{"internalType":"uint256","name":"targetValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"refundedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"stuckPenaltyEndTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.NodeOperatorSummary","name":"summary","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingFeeAggregateDistribution","outputs":[{"internalType":"uint96","name":"modulesFee","type":"uint96"},{"internalType":"uint96","name":"treasuryFee","type":"uint96"},{"internalType":"uint256","name":"basePrecision","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingFeeAggregateDistributionE4Precision","outputs":[{"internalType":"uint16","name":"modulesFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModule","outputs":[{"components":[{"internalType":"uint24","name":"id","type":"uint24"},{"internalType":"address","name":"stakingModuleAddress","type":"address"},{"internalType":"uint16","name":"stakingModuleFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"stakeShareLimit","type":"uint16"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"lastDepositAt","type":"uint64"},{"internalType":"uint256","name":"lastDepositBlock","type":"uint256"},{"internalType":"uint256","name":"exitedValidatorsCount","type":"uint256"},{"internalType":"uint16","name":"priorityExitShareThreshold","type":"uint16"},{"internalType":"uint64","name":"maxDepositsPerBlock","type":"uint64"},{"internalType":"uint64","name":"minDepositBlockDistance","type":"uint64"}],"internalType":"struct StakingRouter.StakingModule","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleActiveValidatorsCount","outputs":[{"internalType":"uint256","name":"activeValidatorsCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakingModuleIds","type":"uint256[]"}],"name":"getStakingModuleDigests","outputs":[{"components":[{"internalType":"uint256","name":"nodeOperatorsCount","type":"uint256"},{"internalType":"uint256","name":"activeNodeOperatorsCount","type":"uint256"},{"components":[{"internalType":"uint24","name":"id","type":"uint24"},{"internalType":"address","name":"stakingModuleAddress","type":"address"},{"internalType":"uint16","name":"stakingModuleFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"stakeShareLimit","type":"uint16"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"lastDepositAt","type":"uint64"},{"internalType":"uint256","name":"lastDepositBlock","type":"uint256"},{"internalType":"uint256","name":"exitedValidatorsCount","type":"uint256"},{"internalType":"uint16","name":"priorityExitShareThreshold","type":"uint16"},{"internalType":"uint64","name":"maxDepositsPerBlock","type":"uint64"},{"internalType":"uint64","name":"minDepositBlockDistance","type":"uint64"}],"internalType":"struct StakingRouter.StakingModule","name":"state","type":"tuple"},{"components":[{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModuleSummary","name":"summary","type":"tuple"}],"internalType":"struct StakingRouter.StakingModuleDigest[]","name":"digests","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingModuleIds","outputs":[{"internalType":"uint256[]","name":"stakingModuleIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleIsDepositsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleIsStopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleLastDepositBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_maxDepositsValue","type":"uint256"}],"name":"getStakingModuleMaxDepositsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleMaxDepositsPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleMinDepositBlockDistance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleStatus","outputs":[{"internalType":"enum StakingRouter.StakingModuleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"getStakingModuleSummary","outputs":[{"components":[{"internalType":"uint256","name":"totalExitedValidators","type":"uint256"},{"internalType":"uint256","name":"totalDepositedValidators","type":"uint256"},{"internalType":"uint256","name":"depositableValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.StakingModuleSummary","name":"summary","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingModules","outputs":[{"components":[{"internalType":"uint24","name":"id","type":"uint24"},{"internalType":"address","name":"stakingModuleAddress","type":"address"},{"internalType":"uint16","name":"stakingModuleFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"stakeShareLimit","type":"uint16"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"lastDepositAt","type":"uint64"},{"internalType":"uint256","name":"lastDepositBlock","type":"uint256"},{"internalType":"uint256","name":"exitedValidatorsCount","type":"uint256"},{"internalType":"uint16","name":"priorityExitShareThreshold","type":"uint16"},{"internalType":"uint64","name":"maxDepositsPerBlock","type":"uint64"},{"internalType":"uint64","name":"minDepositBlockDistance","type":"uint64"}],"internalType":"struct StakingRouter.StakingModule[]","name":"res","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingModulesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingRewardsDistribution","outputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"stakingModuleIds","type":"uint256[]"},{"internalType":"uint96[]","name":"stakingModuleFees","type":"uint96[]"},{"internalType":"uint96","name":"totalFee","type":"uint96"},{"internalType":"uint256","name":"precisionPoints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalFeeE4Precision","outputs":[{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawalCredentials","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"}],"name":"hasStakingModule","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_lido","type":"address"},{"internalType":"bytes32","name":"_withdrawalCredentials","type":"bytes32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"},{"internalType":"bytes","name":"_publicKey","type":"bytes"},{"internalType":"uint256","name":"_withdrawalRequestPaidFee","type":"uint256"},{"internalType":"uint256","name":"_exitType","type":"uint256"}],"name":"onValidatorExitTriggered","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"onValidatorsCountsByNodeOperatorReportingFinished","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakingModuleIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_totalShares","type":"uint256[]"}],"name":"reportRewardsMinted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"bytes","name":"_nodeOperatorIds","type":"bytes"},{"internalType":"bytes","name":"_exitedValidatorsCounts","type":"bytes"}],"name":"reportStakingModuleExitedValidatorsCountByNodeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"_proofSlotTimestamp","type":"uint256"},{"internalType":"bytes","name":"_publicKey","type":"bytes"},{"internalType":"uint256","name":"_eligibleToExitInSec","type":"uint256"}],"name":"reportValidatorExitDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"enum StakingRouter.StakingModuleStatus","name":"_status","type":"uint8"}],"name":"setStakingModuleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_withdrawalCredentials","type":"bytes32"}],"name":"setWithdrawalCredentials","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"},{"internalType":"bool","name":"_triggerUpdateFinish","type":"bool"},{"components":[{"internalType":"uint256","name":"currentModuleExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"currentNodeOperatorExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"newModuleExitedValidatorsCount","type":"uint256"},{"internalType":"uint256","name":"newNodeOperatorExitedValidatorsCount","type":"uint256"}],"internalType":"struct StakingRouter.ValidatorsCountsCorrection","name":"_correction","type":"tuple"}],"name":"unsafeSetExitedValidatorsCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakingModuleIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_exitedValidatorsCounts","type":"uint256[]"}],"name":"updateExitedValidatorsCountByStakingModule","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"_refundedValidatorsCount","type":"uint256"}],"name":"updateRefundedValidatorsCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_stakeShareLimit","type":"uint256"},{"internalType":"uint256","name":"_priorityExitShareThreshold","type":"uint256"},{"internalType":"uint256","name":"_stakingModuleFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_maxDepositsPerBlock","type":"uint256"},{"internalType":"uint256","name":"_minDepositBlockDistance","type":"uint256"}],"name":"updateStakingModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"_targetLimitMode","type":"uint256"},{"internalType":"uint256","name":"_targetLimit","type":"uint256"}],"name":"updateTargetValidatorsLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}] \ No newline at end of file +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_depositContract", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AppAuthLidoFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "firstArrayLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondArrayLength", + "type": "uint256" + } + ], + "name": "ArraysLengthMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "DepositContractZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "DirectETHTransfer", + "type": "error" + }, + { + "inputs": [], + "name": "EmptyWithdrawalsCredentials", + "type": "error" + }, + { + "inputs": [], + "name": "ExitedValidatorsCountCannotDecrease", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractVersionIncrement", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "etherValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositsCount", + "type": "uint256" + } + ], + "name": "InvalidDepositsValue", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidFeeSum", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidMaxDepositPerBlockValue", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidMinDepositBlockDistance", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPriorityExitShareThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPublicKeysBatchLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + } + ], + "name": "InvalidReportData", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidSignaturesBatchLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidStakeShareLimit", + "type": "error" + }, + { + "inputs": [], + "name": "NonZeroContractVersionOnInit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reportedExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositedValidatorsCount", + "type": "uint256" + } + ], + "name": "ReportedExitedValidatorsExceedDeposited", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleAddressExists", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleNotActive", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleStatusTheSame", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleUnregistered", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModuleWrongName", + "type": "error" + }, + { + "inputs": [], + "name": "StakingModulesLimitExceeded", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedContractVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentModuleExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentNodeOpExitedValidatorsCount", + "type": "uint256" + } + ], + "name": "UnexpectedCurrentValidatorsCount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newModuleTotalExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newModuleTotalExitedValidatorsCountInStakingRouter", + "type": "uint256" + } + ], + "name": "UnexpectedFinalExitedValidatorsCount", + "type": "error" + }, + { + "inputs": [], + "name": "UnrecoverableModuleError", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressLido", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressStakingModule", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "lowLevelRevertData", + "type": "bytes" + } + ], + "name": "ExitedAndStuckValidatorsCountsUpdateFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "lowLevelRevertData", + "type": "bytes" + } + ], + "name": "RewardsMintedReportFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "stakingModule", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "createdBy", + "type": "address" + } + ], + "name": "StakingModuleAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_publicKey", + "type": "bytes" + } + ], + "name": "StakingModuleExitNotificationFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unreportedExitedValidatorsCount", + "type": "uint256" + } + ], + "name": "StakingModuleExitedValidatorsIncompleteReporting", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakingModuleFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "treasuryFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "StakingModuleFeesSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maxDepositsPerBlock", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "StakingModuleMaxDepositsPerBlockSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minDepositBlockDistance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "StakingModuleMinDepositBlockDistanceSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeShareLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "priorityExitShareThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "StakingModuleShareLimitSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum StakingRouter.StakingModuleStatus", + "name": "status", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "StakingModuleStatusSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "StakingRouterETHDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "withdrawalCredentials", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "setBy", + "type": "address" + } + ], + "name": "WithdrawalCredentialsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "lowLevelRevertData", + "type": "bytes" + } + ], + "name": "WithdrawalsCredentialsChangeFailed", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEPOSIT_CONTRACT", + "outputs": [ + { + "internalType": "contract IDepositContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "FEE_PRECISION_POINTS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_WITHDRAWAL_CREDENTIALS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_STAKING_MODULES_COUNT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_STAKING_MODULE_NAME_LENGTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_EXITED_VALIDATORS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_REWARDS_MINTED_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_VALIDATOR_EXITING_STATUS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_MODULE_MANAGE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_MODULE_UNVETTING_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TOTAL_BASIS_POINTS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNSAFE_SET_EXITED_VALIDATORS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "address", + "name": "_stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_stakeShareLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_priorityExitShareThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_stakingModuleFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_treasuryFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxDepositsPerBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minDepositBlockDistance", + "type": "uint256" + } + ], + "name": "addStakingModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_nodeOperatorIds", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_vettedSigningKeysCounts", + "type": "bytes" + } + ], + "name": "decreaseStakingModuleVettedKeysCountByNodeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_depositCalldata", + "type": "bytes" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "finalizeUpgrade_v3", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getAllNodeOperatorDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "targetLimitMode", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.NodeOperatorSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.NodeOperatorDigest[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllStakingModuleDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "nodeOperatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "activeNodeOperatorsCount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint24", + "name": "id", + "type": "uint24" + }, + { + "internalType": "address", + "name": "stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint16", + "name": "stakingModuleFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "stakeShareLimit", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint64", + "name": "lastDepositAt", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastDepositBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint16", + "name": "priorityExitShareThreshold", + "type": "uint16" + }, + { + "internalType": "uint64", + "name": "maxDepositsPerBlock", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "minDepositBlockDistance", + "type": "uint64" + } + ], + "internalType": "struct StakingRouter.StakingModule", + "name": "state", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModuleSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.StakingModuleDigest[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_depositsCount", + "type": "uint256" + } + ], + "name": "getDepositsAllocation", + "outputs": [ + { + "internalType": "uint256", + "name": "allocated", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "allocations", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLido", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "_nodeOperatorIds", + "type": "uint256[]" + } + ], + "name": "getNodeOperatorDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "targetLimitMode", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.NodeOperatorSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.NodeOperatorDigest[]", + "name": "digests", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_limit", + "type": "uint256" + } + ], + "name": "getNodeOperatorDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "targetLimitMode", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.NodeOperatorSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.NodeOperatorDigest[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + } + ], + "name": "getNodeOperatorSummary", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "targetLimitMode", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.NodeOperatorSummary", + "name": "summary", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingFeeAggregateDistribution", + "outputs": [ + { + "internalType": "uint96", + "name": "modulesFee", + "type": "uint96" + }, + { + "internalType": "uint96", + "name": "treasuryFee", + "type": "uint96" + }, + { + "internalType": "uint256", + "name": "basePrecision", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingFeeAggregateDistributionE4Precision", + "outputs": [ + { + "internalType": "uint16", + "name": "modulesFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModule", + "outputs": [ + { + "components": [ + { + "internalType": "uint24", + "name": "id", + "type": "uint24" + }, + { + "internalType": "address", + "name": "stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint16", + "name": "stakingModuleFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "stakeShareLimit", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint64", + "name": "lastDepositAt", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastDepositBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint16", + "name": "priorityExitShareThreshold", + "type": "uint16" + }, + { + "internalType": "uint64", + "name": "maxDepositsPerBlock", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "minDepositBlockDistance", + "type": "uint64" + } + ], + "internalType": "struct StakingRouter.StakingModule", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleActiveValidatorsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "activeValidatorsCount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_stakingModuleIds", + "type": "uint256[]" + } + ], + "name": "getStakingModuleDigests", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "nodeOperatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "activeNodeOperatorsCount", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint24", + "name": "id", + "type": "uint24" + }, + { + "internalType": "address", + "name": "stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint16", + "name": "stakingModuleFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "stakeShareLimit", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint64", + "name": "lastDepositAt", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastDepositBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint16", + "name": "priorityExitShareThreshold", + "type": "uint16" + }, + { + "internalType": "uint64", + "name": "maxDepositsPerBlock", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "minDepositBlockDistance", + "type": "uint64" + } + ], + "internalType": "struct StakingRouter.StakingModule", + "name": "state", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModuleSummary", + "name": "summary", + "type": "tuple" + } + ], + "internalType": "struct StakingRouter.StakingModuleDigest[]", + "name": "digests", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingModuleIds", + "outputs": [ + { + "internalType": "uint256[]", + "name": "stakingModuleIds", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleIsActive", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleIsDepositsPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleIsStopped", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleLastDepositBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxDepositsValue", + "type": "uint256" + } + ], + "name": "getStakingModuleMaxDepositsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleMaxDepositsPerBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleMinDepositBlockDistance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleStatus", + "outputs": [ + { + "internalType": "enum StakingRouter.StakingModuleStatus", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "getStakingModuleSummary", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.StakingModuleSummary", + "name": "summary", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingModules", + "outputs": [ + { + "components": [ + { + "internalType": "uint24", + "name": "id", + "type": "uint24" + }, + { + "internalType": "address", + "name": "stakingModuleAddress", + "type": "address" + }, + { + "internalType": "uint16", + "name": "stakingModuleFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "treasuryFee", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "stakeShareLimit", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint64", + "name": "lastDepositAt", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastDepositBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint16", + "name": "priorityExitShareThreshold", + "type": "uint16" + }, + { + "internalType": "uint64", + "name": "maxDepositsPerBlock", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "minDepositBlockDistance", + "type": "uint64" + } + ], + "internalType": "struct StakingRouter.StakingModule[]", + "name": "res", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingModulesCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingRewardsDistribution", + "outputs": [ + { + "internalType": "address[]", + "name": "recipients", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "stakingModuleIds", + "type": "uint256[]" + }, + { + "internalType": "uint96[]", + "name": "stakingModuleFees", + "type": "uint96[]" + }, + { + "internalType": "uint96", + "name": "totalFee", + "type": "uint96" + }, + { + "internalType": "uint256", + "name": "precisionPoints", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalFeeE4Precision", + "outputs": [ + { + "internalType": "uint16", + "name": "totalFee", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWithdrawalCredentials", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + } + ], + "name": "hasStakingModule", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "_lido", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_withdrawalCredentials", + "type": "bytes32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "internalType": "struct StakingRouter.ValidatorExitData[]", + "name": "validatorExitData", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "_withdrawalRequestPaidFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_exitType", + "type": "uint256" + } + ], + "name": "onValidatorExitTriggered", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onValidatorsCountsByNodeOperatorReportingFinished", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_stakingModuleIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_totalShares", + "type": "uint256[]" + } + ], + "name": "reportRewardsMinted", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_nodeOperatorIds", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_exitedValidatorsCounts", + "type": "bytes" + } + ], + "name": "reportStakingModuleExitedValidatorsCountByNodeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_proofSlotTimestamp", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_publicKey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_eligibleToExitInSec", + "type": "uint256" + } + ], + "name": "reportValidatorExitDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "enum StakingRouter.StakingModuleStatus", + "name": "_status", + "type": "uint8" + } + ], + "name": "setStakingModuleStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_withdrawalCredentials", + "type": "bytes32" + } + ], + "name": "setWithdrawalCredentials", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_triggerUpdateFinish", + "type": "bool" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "currentModuleExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentNodeOperatorExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newModuleExitedValidatorsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newNodeOperatorExitedValidatorsCount", + "type": "uint256" + } + ], + "internalType": "struct StakingRouter.ValidatorsCountsCorrection", + "name": "_correction", + "type": "tuple" + } + ], + "name": "unsafeSetExitedValidatorsCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_stakingModuleIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_exitedValidatorsCounts", + "type": "uint256[]" + } + ], + "name": "updateExitedValidatorsCountByStakingModule", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_refundedValidatorsCount", + "type": "uint256" + } + ], + "name": "updateRefundedValidatorsCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_stakeShareLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_priorityExitShareThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_stakingModuleFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_treasuryFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxDepositsPerBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minDepositBlockDistance", + "type": "uint256" + } + ], + "name": "updateStakingModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_targetLimitMode", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_targetLimit", + "type": "uint256" + } + ], + "name": "updateTargetValidatorsLimits", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/assets/ValidatorsExitBusOracle.json b/assets/ValidatorsExitBusOracle.json index 1c57615eb..969f19fc0 100644 --- a/assets/ValidatorsExitBusOracle.json +++ b/assets/ValidatorsExitBusOracle.json @@ -1 +1,1641 @@ -[{"inputs":[{"internalType":"uint256","name":"secondsPerSlot","type":"uint256"},{"internalType":"uint256","name":"genesisTime","type":"uint256"},{"internalType":"address","name":"lidoLocator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressCannotBeSame","type":"error"},{"inputs":[],"name":"AddressCannotBeZero","type":"error"},{"inputs":[],"name":"AdminCannotBeZero","type":"error"},{"inputs":[],"name":"ArgumentOutOfBounds","type":"error"},{"inputs":[{"internalType":"uint256","name":"exitDataIndex","type":"uint256"},{"internalType":"uint256","name":"requestsCount","type":"uint256"}],"name":"ExitDataIndexOutOfRange","type":"error"},{"inputs":[],"name":"ExitHashAlreadySubmitted","type":"error"},{"inputs":[],"name":"ExitHashNotSubmitted","type":"error"},{"inputs":[{"internalType":"uint256","name":"requestsCount","type":"uint256"},{"internalType":"uint256","name":"remainingLimit","type":"uint256"}],"name":"ExitRequestsLimitExceeded","type":"error"},{"inputs":[],"name":"HashCannotBeZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"initialRefSlot","type":"uint256"},{"internalType":"uint256","name":"processingRefSlot","type":"uint256"}],"name":"InitialRefSlotCannotBeLessThanProcessingOne","type":"error"},{"inputs":[],"name":"InvalidContractVersionIncrement","type":"error"},{"inputs":[],"name":"InvalidExitDataIndexSortOrder","type":"error"},{"inputs":[],"name":"InvalidModuleId","type":"error"},{"inputs":[],"name":"InvalidRequestsDataLength","type":"error"},{"inputs":[],"name":"InvalidRequestsDataSortOrder","type":"error"},{"inputs":[],"name":"LimitExceeded","type":"error"},{"inputs":[],"name":"NoConsensusReportToProcess","type":"error"},{"inputs":[],"name":"NonZeroContractVersionOnInit","type":"error"},{"inputs":[],"name":"PauseUntilMustBeInFuture","type":"error"},{"inputs":[],"name":"PausedExpected","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ProcessingDeadlineMissed","type":"error"},{"inputs":[],"name":"RefSlotAlreadyProcessing","type":"error"},{"inputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"prevRefSlot","type":"uint256"}],"name":"RefSlotCannotDecrease","type":"error"},{"inputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"processingRefSlot","type":"uint256"}],"name":"RefSlotMustBeGreaterThanProcessingOne","type":"error"},{"inputs":[],"name":"RequestsAlreadyDelivered","type":"error"},{"inputs":[],"name":"RequestsNotDelivered","type":"error"},{"inputs":[],"name":"ResumedExpected","type":"error"},{"inputs":[],"name":"SecondsPerSlotCannotBeZero","type":"error"},{"inputs":[],"name":"SenderIsNotTheConsensusContract","type":"error"},{"inputs":[],"name":"SenderNotAllowed","type":"error"},{"inputs":[],"name":"TooLargeExitsPerFrame","type":"error"},{"inputs":[],"name":"TooLargeFrameDuration","type":"error"},{"inputs":[],"name":"TooLargeMaxExitRequestsLimit","type":"error"},{"inputs":[{"internalType":"uint256","name":"requestsCount","type":"uint256"},{"internalType":"uint256","name":"maxRequestsPerReport","type":"uint256"}],"name":"TooManyExitRequestsInReport","type":"error"},{"inputs":[],"name":"UnexpectedChainConfig","type":"error"},{"inputs":[{"internalType":"uint256","name":"expectedVersion","type":"uint256"},{"internalType":"uint256","name":"receivedVersion","type":"uint256"}],"name":"UnexpectedConsensusVersion","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedContractVersion","type":"error"},{"inputs":[{"internalType":"bytes32","name":"consensusHash","type":"bytes32"},{"internalType":"bytes32","name":"receivedHash","type":"bytes32"}],"name":"UnexpectedDataHash","type":"error"},{"inputs":[{"internalType":"uint256","name":"consensusRefSlot","type":"uint256"},{"internalType":"uint256","name":"dataRefSlot","type":"uint256"}],"name":"UnexpectedRefSlot","type":"error"},{"inputs":[],"name":"UnexpectedRequestsDataLength","type":"error"},{"inputs":[{"internalType":"uint256","name":"format","type":"uint256"}],"name":"UnsupportedRequestsDataFormat","type":"error"},{"inputs":[],"name":"VersionCannotBeSame","type":"error"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"ZeroArgument","type":"error"},{"inputs":[],"name":"ZeroFrameDuration","type":"error"},{"inputs":[],"name":"ZeroPauseDuration","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"address","name":"prevAddr","type":"address"}],"name":"ConsensusHashContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"prevVersion","type":"uint256"}],"name":"ConsensusVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"exitRequestsHash","type":"bytes32"}],"name":"ExitDataProcessing","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxExitRequestsLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"exitsPerFrame","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"frameDurationInSec","type":"uint256"}],"name":"ExitRequestsLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"ProcessingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"ReportDiscarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"processingDeadlineTime","type":"uint256"}],"name":"ReportSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"exitRequestsHash","type":"bytes32"}],"name":"RequestsHashSubmitted","type":"event"},{"anonymous":false,"inputs":[],"name":"Resumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"validatorIndex","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"validatorPubkey","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ValidatorExitRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestsProcessed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestsCount","type":"uint256"}],"name":"WarnDataIncompleteProcessing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"}],"name":"WarnProcessingMissed","type":"event"},{"inputs":[],"name":"DATA_FORMAT_LIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXIT_REQUEST_LIMIT_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXIT_TYPE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENESIS_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_CONSENSUS_CONTRACT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_CONSENSUS_VERSION_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_INFINITELY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESUME_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_PER_SLOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUBMIT_DATA_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUBMIT_REPORT_HASH_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"}],"name":"discardConsensusReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxValidatorsPerReport","type":"uint256"},{"internalType":"uint256","name":"maxExitRequestsLimit","type":"uint256"},{"internalType":"uint256","name":"exitsPerFrame","type":"uint256"},{"internalType":"uint256","name":"frameDurationInSec","type":"uint256"}],"name":"finalizeUpgrade_v2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getConsensusContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConsensusReport","outputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"processingDeadlineTime","type":"uint256"},{"internalType":"bool","name":"processingStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConsensusVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"exitRequestsHash","type":"bytes32"}],"name":"getDeliveryTimestamp","outputs":[{"internalType":"uint256","name":"deliveryDateTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExitRequestLimitFullInfo","outputs":[{"internalType":"uint256","name":"maxExitRequestsLimit","type":"uint256"},{"internalType":"uint256","name":"exitsPerFrame","type":"uint256"},{"internalType":"uint256","name":"frameDurationInSec","type":"uint256"},{"internalType":"uint256","name":"prevExitRequestsLimit","type":"uint256"},{"internalType":"uint256","name":"currentExitRequestsLimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessingRefSlot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxValidatorsPerReport","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProcessingState","outputs":[{"components":[{"internalType":"uint256","name":"currentFrameRefSlot","type":"uint256"},{"internalType":"uint256","name":"processingDeadlineTime","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"bool","name":"dataSubmitted","type":"bool"},{"internalType":"uint256","name":"dataFormat","type":"uint256"},{"internalType":"uint256","name":"requestsCount","type":"uint256"},{"internalType":"uint256","name":"requestsSubmitted","type":"uint256"}],"internalType":"struct ValidatorsExitBusOracle.ProcessingState","name":"result","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getResumeSinceTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRequestsProcessed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"consensusContract","type":"address"},{"internalType":"uint256","name":"consensusVersion","type":"uint256"},{"internalType":"uint256","name":"lastProcessingRefSlot","type":"uint256"},{"internalType":"uint256","name":"maxValidatorsPerRequest","type":"uint256"},{"internalType":"uint256","name":"maxExitRequestsLimit","type":"uint256"},{"internalType":"uint256","name":"exitsPerFrame","type":"uint256"},{"internalType":"uint256","name":"frameDurationInSec","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"pauseFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pauseUntilInclusive","type":"uint256"}],"name":"pauseUntil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setConsensusContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"name":"setConsensusVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxExitRequestsLimit","type":"uint256"},{"internalType":"uint256","name":"exitsPerFrame","type":"uint256"},{"internalType":"uint256","name":"frameDurationInSec","type":"uint256"}],"name":"setExitRequestLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxRequests","type":"uint256"}],"name":"setMaxValidatorsPerReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reportHash","type":"bytes32"},{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"submitConsensusReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"dataFormat","type":"uint256"}],"internalType":"struct ValidatorsExitBus.ExitRequestsData","name":"request","type":"tuple"}],"name":"submitExitRequestsData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"exitRequestsHash","type":"bytes32"}],"name":"submitExitRequestsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"consensusVersion","type":"uint256"},{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"requestsCount","type":"uint256"},{"internalType":"uint256","name":"dataFormat","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ValidatorsExitBusOracle.ReportData","name":"data","type":"tuple"},{"internalType":"uint256","name":"contractVersion","type":"uint256"}],"name":"submitReportData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"dataFormat","type":"uint256"}],"internalType":"struct ValidatorsExitBus.ExitRequestsData","name":"exitsData","type":"tuple"},{"internalType":"uint256[]","name":"exitDataIndexes","type":"uint256[]"},{"internalType":"address","name":"refundRecipient","type":"address"}],"name":"triggerExits","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"exitRequests","type":"bytes"},{"internalType":"uint256","name":"dataFormat","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"unpackExitRequest","outputs":[{"internalType":"bytes","name":"pubkey","type":"bytes"},{"internalType":"uint256","name":"nodeOpId","type":"uint256"},{"internalType":"uint256","name":"moduleId","type":"uint256"},{"internalType":"uint256","name":"valIndex","type":"uint256"}],"stateMutability":"pure","type":"function"}] +[ + { + "inputs": [ + { + "internalType": "uint256", + "name": "secondsPerSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "genesisTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "lidoLocator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AddressCannotBeSame", + "type": "error" + }, + { + "inputs": [], + "name": "AddressCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "AdminCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "ArgumentOutOfBounds", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "exitDataIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + } + ], + "name": "ExitDataIndexOutOfRange", + "type": "error" + }, + { + "inputs": [], + "name": "ExitHashAlreadySubmitted", + "type": "error" + }, + { + "inputs": [], + "name": "ExitHashNotSubmitted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingLimit", + "type": "uint256" + } + ], + "name": "ExitRequestsLimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "HashCannotBeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingRefSlot", + "type": "uint256" + } + ], + "name": "InitialRefSlotCannotBeLessThanProcessingOne", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractVersionIncrement", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidExitDataIndexSortOrder", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidModuleId", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRequestsDataLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRequestsDataSortOrder", + "type": "error" + }, + { + "inputs": [], + "name": "LimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "NoConsensusReportToProcess", + "type": "error" + }, + { + "inputs": [], + "name": "NonZeroContractVersionOnInit", + "type": "error" + }, + { + "inputs": [], + "name": "PauseUntilMustBeInFuture", + "type": "error" + }, + { + "inputs": [], + "name": "PausedExpected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "ProcessingDeadlineMissed", + "type": "error" + }, + { + "inputs": [], + "name": "RefSlotAlreadyProcessing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevRefSlot", + "type": "uint256" + } + ], + "name": "RefSlotCannotDecrease", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingRefSlot", + "type": "uint256" + } + ], + "name": "RefSlotMustBeGreaterThanProcessingOne", + "type": "error" + }, + { + "inputs": [], + "name": "RequestsAlreadyDelivered", + "type": "error" + }, + { + "inputs": [], + "name": "RequestsNotDelivered", + "type": "error" + }, + { + "inputs": [], + "name": "ResumedExpected", + "type": "error" + }, + { + "inputs": [], + "name": "SecondsPerSlotCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotTheConsensusContract", + "type": "error" + }, + { + "inputs": [], + "name": "SenderNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "TooLargeExitsPerFrame", + "type": "error" + }, + { + "inputs": [], + "name": "TooLargeFrameDuration", + "type": "error" + }, + { + "inputs": [], + "name": "TooLargeMaxExitRequestsLimit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxRequestsPerReport", + "type": "uint256" + } + ], + "name": "TooManyExitRequestsInReport", + "type": "error" + }, + { + "inputs": [], + "name": "UnexpectedChainConfig", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expectedVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedVersion", + "type": "uint256" + } + ], + "name": "UnexpectedConsensusVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedContractVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "consensusHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "receivedHash", + "type": "bytes32" + } + ], + "name": "UnexpectedDataHash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "consensusRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dataRefSlot", + "type": "uint256" + } + ], + "name": "UnexpectedRefSlot", + "type": "error" + }, + { + "inputs": [], + "name": "UnexpectedRequestsDataLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "format", + "type": "uint256" + } + ], + "name": "UnsupportedRequestsDataFormat", + "type": "error" + }, + { + "inputs": [], + "name": "VersionCannotBeSame", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "ZeroArgument", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroFrameDuration", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPauseDuration", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "prevAddr", + "type": "address" + } + ], + "name": "ConsensusHashContractSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "version", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "prevVersion", + "type": "uint256" + } + ], + "name": "ConsensusVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "exitRequestsHash", + "type": "bytes32" + } + ], + "name": "ExitDataProcessing", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "ExitRequestsLimitSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "ProcessingStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "ReportDiscarded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + } + ], + "name": "ReportSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "exitRequestsHash", + "type": "bytes32" + } + ], + "name": "RequestsHashSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "validatorIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "validatorPubkey", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "ValidatorExitRequest", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "requestsProcessed", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + } + ], + "name": "WarnDataIncompleteProcessing", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + } + ], + "name": "WarnProcessingMissed", + "type": "event" + }, + { + "inputs": [], + "name": "DATA_FORMAT_LIST", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXIT_REQUEST_LIMIT_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXIT_TYPE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENESIS_TIME", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_CONSENSUS_CONTRACT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_CONSENSUS_VERSION_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_INFINITELY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SECONDS_PER_SLOT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SUBMIT_DATA_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SUBMIT_REPORT_HASH_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + } + ], + "name": "discardConsensusReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxValidatorsPerReport", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "finalizeUpgrade_v2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusReport", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "processingStarted", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "exitRequestsHash", + "type": "bytes32" + } + ], + "name": "getDeliveryTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "deliveryDateTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExitRequestLimitFullInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentExitRequestsLimit", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastProcessingRefSlot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMaxValidatorsPerReport", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProcessingState", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "currentFrameRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "dataSubmitted", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsSubmitted", + "type": "uint256" + } + ], + "internalType": "struct ValidatorsExitBusOracle.ProcessingState", + "name": "result", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getResumeSinceTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalRequestsProcessed", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "consensusContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastProcessingRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxValidatorsPerRequest", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_duration", + "type": "uint256" + } + ], + "name": "pauseFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pauseUntilInclusive", + "type": "uint256" + } + ], + "name": "pauseUntil", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resume", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "setConsensusContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "setConsensusVersion", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "setExitRequestLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxRequests", + "type": "uint256" + } + ], + "name": "setMaxValidatorsPerReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "reportHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "submitConsensusReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + } + ], + "internalType": "struct ValidatorsExitBus.ExitRequestsData", + "name": "request", + "type": "tuple" + } + ], + "name": "submitExitRequestsData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "exitRequestsHash", + "type": "bytes32" + } + ], + "name": "submitExitRequestsHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct ValidatorsExitBusOracle.ReportData", + "name": "data", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "contractVersion", + "type": "uint256" + } + ], + "name": "submitReportData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + } + ], + "internalType": "struct ValidatorsExitBus.ExitRequestsData", + "name": "exitsData", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "exitDataIndexes", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "refundRecipient", + "type": "address" + } + ], + "name": "triggerExits", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "exitRequests", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "unpackExitRequest", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "nodeOpId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "moduleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "valIndex", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } +] \ No newline at end of file diff --git a/assets/VaultHub.json b/assets/VaultHub.json new file mode 100644 index 000000000..8643c45e0 --- /dev/null +++ b/assets/VaultHub.json @@ -0,0 +1,2655 @@ +[ + { + "inputs": [ + { + "internalType": "contract ILidoLocator", + "name": "_locator", + "type": "address" + }, + { + "internalType": "contract ILido", + "name": "_lido", + "type": "address" + }, + { + "internalType": "contract IHashConsensus", + "name": "_consensusContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_maxRelativeShareLimitBP", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "AlreadyConnected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "AlreadyHealthy", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "withdrawable", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requested", + "type": "uint256" + } + ], + "name": "AmountExceedsWithdrawableValue", + "type": "error" + }, + { + "inputs": [], + "name": "BadDebtSocializationNotAllowed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "codehash", + "type": "bytes32" + } + ], + "name": "CodehashNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ForcedValidatorExitNotAllowed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "InsufficientSharesToBurn", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maxLockableValue", + "type": "uint256" + } + ], + "name": "InsufficientValueToMint", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "valueBP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxValueBP", + "type": "uint256" + } + ], + "name": "InvalidBasisPoints", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newFees", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "oldFees", + "type": "uint256" + } + ], + "name": "InvalidFees", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "totalValueShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liabilityShares", + "type": "uint256" + } + ], + "name": "NoBadDebtToWriteOff", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "liabilityShares", + "type": "uint256" + } + ], + "name": "NoLiabilitySharesShouldBeLeft", + "type": "error" + }, + { + "inputs": [], + "name": "NotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "NotConnectedToHub", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "PDGNotDepositor", + "type": "error" + }, + { + "inputs": [], + "name": "PartialValidatorWithdrawalNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "PauseUntilMustBeInFuture", + "type": "error" + }, + { + "inputs": [], + "name": "PausedExpected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "totalValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rebalanceAmount", + "type": "uint256" + } + ], + "name": "RebalanceAmountExceedsTotalValue", + "type": "error" + }, + { + "inputs": [], + "name": "ResumedExpected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "expectedSharesAfterMint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "shareLimit", + "type": "uint256" + } + ], + "name": "ShareLimitExceeded", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shareLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxShareLimit", + "type": "uint256" + } + ], + "name": "ShareLimitTooHigh", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "UnhealthyVaultCannotDeposit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "unsettledObligations", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "allowedUnsettled", + "type": "uint256" + } + ], + "name": "VaultHasUnsettledObligations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "VaultHubNotPendingOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expectedBalance", + "type": "uint256" + } + ], + "name": "VaultInsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "VaultIsDisconnecting", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "totalValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liabilityShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newRebalanceThresholdBP", + "type": "uint256" + } + ], + "name": "VaultMintingCapacityExceeded", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "VaultOssified", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "VaultReportStale", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroArgument", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroBalance", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroCodehash", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPauseDuration", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "codehash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "AllowedCodehashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vaultDonor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "vaultAcceptor", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "badDebtShares", + "type": "uint256" + } + ], + "name": "BadDebtSocialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "badDebtShares", + "type": "uint256" + } + ], + "name": "BadDebtWrittenOffToBeInternalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfShares", + "type": "uint256" + } + ], + "name": "BurnedSharesOnVault", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkeys", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "address", + "name": "refundRecipient", + "type": "address" + } + ], + "name": "ForcedValidatorExitTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unsettledLidoFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "settledLidoFees", + "type": "uint256" + } + ], + "name": "LidoFeesUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lockedAmount", + "type": "uint256" + } + ], + "name": "MintedSharesOnVault", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "redemptionsValue", + "type": "uint256" + } + ], + "name": "RedemptionsNotSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unsettledRedemptions", + "type": "uint256" + } + ], + "name": "RedemptionsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shareLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reserveRatioBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "forcedRebalanceThresholdBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "infraFeeBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "liquidityFeeBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reservationFeeBP", + "type": "uint256" + } + ], + "name": "VaultConnected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shareLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reserveRatioBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "forcedRebalanceThresholdBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "infraFeeBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "liquidityFeeBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reservationFeeBP", + "type": "uint256" + } + ], + "name": "VaultConnectionUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "slashingReserve", + "type": "uint256" + } + ], + "name": "VaultDisconnectAborted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "VaultDisconnectCompleted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "VaultDisconnectInitiated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "preInfraFeeBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "preLiquidityFeeBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "preReservationFeeBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "infraFeeBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "liquidityFeeBP", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reservationFeeBP", + "type": "uint256" + } + ], + "name": "VaultFeesUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "int112", + "name": "inOutDelta", + "type": "int112" + } + ], + "name": "VaultInOutDeltaUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rebalanced", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "transferredToLido", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unsettledRedemptions", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unsettledLidoFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "settledLidoFees", + "type": "uint256" + } + ], + "name": "VaultObligationsSettled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "oldOwner", + "type": "address" + } + ], + "name": "VaultOwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "sharesBurned", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "etherWithdrawn", + "type": "uint256" + } + ], + "name": "VaultRebalanced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reportTimestamp", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reportTotalValue", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "reportInOutDelta", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reportCumulativeLidoFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reportLiabilityShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reportSlashingReserve", + "type": "uint256" + } + ], + "name": "VaultReportApplied", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newShareLimit", + "type": "uint256" + } + ], + "name": "VaultShareLimitUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "BAD_DEBT_MASTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CONNECT_DEPOSIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CONSENSUS_CONTRACT", + "outputs": [ + { + "internalType": "contract IHashConsensus", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIDO", + "outputs": [ + { + "internalType": "contract ILido", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIDO_LOCATOR", + "outputs": [ + { + "internalType": "contract ILidoLocator", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_RELATIVE_SHARE_LIMIT_BP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_INFINITELY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REDEMPTION_MASTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_FRESHNESS_DELTA", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VALIDATOR_EXIT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VAULT_CODEHASH_SET_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VAULT_MASTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_reportTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_reportTotalValue", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "_reportInOutDelta", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "_reportCumulativeLidoFees", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_reportLiabilityShares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_reportSlashingReserve", + "type": "uint256" + } + ], + "name": "applyVaultReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "badDebtToInternalizeAsOfLastRefSlot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amountOfShares", + "type": "uint256" + } + ], + "name": "burnShares", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "_recipient", + "type": "address" + } + ], + "name": "compensateDisprovenPredepositFromPDG", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "connectVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amountOfShares", + "type": "uint256" + } + ], + "name": "decreaseInternalizedBadDebt", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "disconnect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "forceRebalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_pubkeys", + "type": "bytes" + }, + { + "internalType": "address", + "name": "_refundRecipient", + "type": "address" + } + ], + "name": "forceValidatorExit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "fund", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getResumeSinceTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMembers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "inOutDeltaAsOfLastRefSlot", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_badDebtVault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_maxSharesToInternalize", + "type": "uint256" + } + ], + "name": "internalizeBadDebt", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "isReportFresh", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "isVaultConnected", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "isVaultHealthy", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "latestReport", + "outputs": [ + { + "components": [ + { + "internalType": "uint112", + "name": "totalValue", + "type": "uint112" + }, + { + "internalType": "int112", + "name": "inOutDelta", + "type": "int112" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "internalType": "struct VaultHub.Report", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "liabilityShares", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "locked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "maxLockableValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amountOfShares", + "type": "uint256" + } + ], + "name": "mintShares", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "pauseBeaconChainDeposits", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_duration", + "type": "uint256" + } + ], + "name": "pauseFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pauseUntilInclusive", + "type": "uint256" + } + ], + "name": "pauseUntil", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "validatorIndex", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "childBlockTimestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "slot", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "proposerIndex", + "type": "uint64" + } + ], + "internalType": "struct IPredepositGuarantee.ValidatorWitness", + "name": "_witness", + "type": "tuple" + } + ], + "name": "proveUnknownValidatorToPDG", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_shares", + "type": "uint256" + } + ], + "name": "rebalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "rebalanceShortfall", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_pubkeys", + "type": "bytes" + } + ], + "name": "requestValidatorExit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resume", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "resumeBeaconChainDeposits", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_codehash", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "_allowed", + "type": "bool" + } + ], + "name": "setAllowedCodehash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_redemptionsValue", + "type": "uint256" + } + ], + "name": "setVaultRedemptions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "settleVaultObligations", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_badDebtVault", + "type": "address" + }, + { + "internalType": "address", + "name": "_vaultAcceptor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_maxSharesToSocialize", + "type": "uint256" + } + ], + "name": "socializeBadDebt", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "totalValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amountOfShares", + "type": "uint256" + } + ], + "name": "transferAndBurnShares", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "transferVaultOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_pubkeys", + "type": "bytes" + }, + { + "internalType": "uint64[]", + "name": "_amounts", + "type": "uint64[]" + }, + { + "internalType": "address", + "name": "_refundRecipient", + "type": "address" + } + ], + "name": "triggerValidatorWithdrawals", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_shareLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_reserveRatioBP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_forcedRebalanceThresholdBP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_infraFeeBP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidityFeeBP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_reservationFeeBP", + "type": "uint256" + } + ], + "name": "updateConnection", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_shareLimit", + "type": "uint256" + } + ], + "name": "updateShareLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_infraFeeBP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_liquidityFeeBP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_reservationFeeBP", + "type": "uint256" + } + ], + "name": "updateVaultFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "vaultByIndex", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "vaultConnection", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint96", + "name": "shareLimit", + "type": "uint96" + }, + { + "internalType": "uint96", + "name": "vaultIndex", + "type": "uint96" + }, + { + "internalType": "bool", + "name": "pendingDisconnect", + "type": "bool" + }, + { + "internalType": "uint16", + "name": "reserveRatioBP", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "forcedRebalanceThresholdBP", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "infraFeeBP", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "liquidityFeeBP", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "reservationFeeBP", + "type": "uint16" + }, + { + "internalType": "bool", + "name": "isBeaconDepositsManuallyPaused", + "type": "bool" + } + ], + "internalType": "struct VaultHub.VaultConnection", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "vaultObligations", + "outputs": [ + { + "components": [ + { + "internalType": "uint128", + "name": "settledLidoFees", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "unsettledLidoFees", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "redemptions", + "type": "uint128" + } + ], + "internalType": "struct VaultHub.VaultObligations", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "vaultRecord", + "outputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "uint112", + "name": "totalValue", + "type": "uint112" + }, + { + "internalType": "int112", + "name": "inOutDelta", + "type": "int112" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "internalType": "struct VaultHub.Report", + "name": "report", + "type": "tuple" + }, + { + "internalType": "uint128", + "name": "locked", + "type": "uint128" + }, + { + "internalType": "uint96", + "name": "liabilityShares", + "type": "uint96" + }, + { + "components": [ + { + "internalType": "int112", + "name": "value", + "type": "int112" + }, + { + "internalType": "int112", + "name": "valueOnRefSlot", + "type": "int112" + }, + { + "internalType": "uint32", + "name": "refSlot", + "type": "uint32" + } + ], + "internalType": "struct RefSlotCache.Int112WithRefSlotCache", + "name": "inOutDelta", + "type": "tuple" + } + ], + "internalType": "struct VaultHub.VaultRecord", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vaultsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "voluntaryDisconnect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "address", + "name": "_recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_ether", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vault", + "type": "address" + } + ], + "name": "withdrawableValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/assets/WithdrawalQueueERC721.json b/assets/WithdrawalQueueERC721.json index 49ad1bac8..ccf7a0231 100644 --- a/assets/WithdrawalQueueERC721.json +++ b/assets/WithdrawalQueueERC721.json @@ -1 +1,2027 @@ -[{"inputs":[{"internalType":"address","name":"_wstETH","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AdminZeroAddress","type":"error"},{"inputs":[],"name":"ApprovalToOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BatchesAreNotSorted","type":"error"},{"inputs":[],"name":"CantSendValueRecipientMayHaveReverted","type":"error"},{"inputs":[],"name":"EmptyBatches","type":"error"},{"inputs":[],"name":"InvalidContractVersionIncrement","type":"error"},{"inputs":[{"internalType":"uint256","name":"_hint","type":"uint256"}],"name":"InvalidHint","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"InvalidOwnerAddress","type":"error"},{"inputs":[],"name":"InvalidReportTimestamp","type":"error"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"InvalidRequestId","type":"error"},{"inputs":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"}],"name":"InvalidRequestIdRange","type":"error"},{"inputs":[],"name":"InvalidState","type":"error"},{"inputs":[],"name":"NonZeroContractVersionOnInit","type":"error"},{"inputs":[],"name":"NotEnoughEther","type":"error"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"NotOwner","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"NotOwnerOrApproved","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"NotOwnerOrApprovedForAll","type":"error"},{"inputs":[],"name":"PauseUntilMustBeInFuture","type":"error"},{"inputs":[],"name":"PausedExpected","type":"error"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"RequestAlreadyClaimed","type":"error"},{"inputs":[{"internalType":"uint256","name":"_amountOfStETH","type":"uint256"}],"name":"RequestAmountTooLarge","type":"error"},{"inputs":[{"internalType":"uint256","name":"_amountOfStETH","type":"uint256"}],"name":"RequestAmountTooSmall","type":"error"},{"inputs":[],"name":"RequestIdsNotSorted","type":"error"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"RequestNotFoundOrNotFinalized","type":"error"},{"inputs":[],"name":"ResumedExpected","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"inputs":[{"internalType":"uint256","name":"sent","type":"uint256"},{"internalType":"uint256","name":"maxExpected","type":"uint256"}],"name":"TooMuchEtherToFinalize","type":"error"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"realOwner","type":"address"}],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferFromZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"TransferToNonIERC721Receiver","type":"error"},{"inputs":[],"name":"TransferToThemselves","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedContractVersion","type":"error"},{"inputs":[],"name":"ZeroAmountOfETH","type":"error"},{"inputs":[],"name":"ZeroMetadata","type":"error"},{"inputs":[],"name":"ZeroPauseDuration","type":"error"},{"inputs":[],"name":"ZeroRecipient","type":"error"},{"inputs":[],"name":"ZeroShareRate","type":"error"},{"inputs":[],"name":"ZeroTimestamp","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURISet","type":"event"},{"anonymous":false,"inputs":[],"name":"BunkerModeDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sinceTimestamp","type":"uint256"}],"name":"BunkerModeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_admin","type":"address"}],"name":"InitializedV1","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nftDescriptorAddress","type":"address"}],"name":"NftDescriptorAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Resumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"to","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfETHLocked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharesToBurn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"WithdrawalBatchFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfETH","type":"uint256"}],"name":"WithdrawalClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"address","name":"requestor","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfStETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfShares","type":"uint256"}],"name":"WithdrawalRequested","type":"event"},{"inputs":[],"name":"BUNKER_MODE_DISABLED_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FINALIZE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_TOKEN_URI_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BATCHES_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STETH_WITHDRAWAL_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_STETH_WITHDRAWAL_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_INFINITELY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESUME_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STETH","outputs":[{"internalType":"contract IStETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WSTETH","outputs":[{"internalType":"contract IWstETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bunkerModeSinceTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxShareRate","type":"uint256"},{"internalType":"uint256","name":"_maxTimestamp","type":"uint256"},{"internalType":"uint256","name":"_maxRequestsPerCall","type":"uint256"},{"components":[{"internalType":"uint256","name":"remainingEthBudget","type":"uint256"},{"internalType":"bool","name":"finished","type":"bool"},{"internalType":"uint256[36]","name":"batches","type":"uint256[36]"},{"internalType":"uint256","name":"batchesLength","type":"uint256"}],"internalType":"struct WithdrawalQueueBase.BatchesCalculationState","name":"_state","type":"tuple"}],"name":"calculateFinalizationBatches","outputs":[{"components":[{"internalType":"uint256","name":"remainingEthBudget","type":"uint256"},{"internalType":"bool","name":"finished","type":"bool"},{"internalType":"uint256[36]","name":"batches","type":"uint256[36]"},{"internalType":"uint256","name":"batchesLength","type":"uint256"}],"internalType":"struct WithdrawalQueueBase.BatchesCalculationState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"claimWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_requestIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_hints","type":"uint256[]"}],"name":"claimWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_requestIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_hints","type":"uint256[]"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"claimWithdrawalsTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_batches","type":"uint256[]"},{"internalType":"uint256","name":"_maxShareRate","type":"uint256"}],"name":"finalize","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_requestIds","type":"uint256[]"},{"internalType":"uint256","name":"_firstIndex","type":"uint256"},{"internalType":"uint256","name":"_lastIndex","type":"uint256"}],"name":"findCheckpointHints","outputs":[{"internalType":"uint256[]","name":"hintIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_requestIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_hints","type":"uint256[]"}],"name":"getClaimableEther","outputs":[{"internalType":"uint256[]","name":"claimableEthValues","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastCheckpointIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastFinalizedRequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastRequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLockedEtherAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTDescriptorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getResumeSinceTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getWithdrawalRequests","outputs":[{"internalType":"uint256[]","name":"requestsIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_requestIds","type":"uint256[]"}],"name":"getWithdrawalStatus","outputs":[{"components":[{"internalType":"uint256","name":"amountOfStETH","type":"uint256"},{"internalType":"uint256","name":"amountOfShares","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"isFinalized","type":"bool"},{"internalType":"bool","name":"isClaimed","type":"bool"}],"internalType":"struct WithdrawalQueueBase.WithdrawalRequestStatus[]","name":"statuses","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBunkerModeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBunkerModeNow","type":"bool"},{"internalType":"uint256","name":"_bunkerStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"_currentReportTimestamp","type":"uint256"}],"name":"onOracleReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"pauseFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pauseUntilInclusive","type":"uint256"}],"name":"pauseUntil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_batches","type":"uint256[]"},{"internalType":"uint256","name":"_maxShareRate","type":"uint256"}],"name":"prefinalize","outputs":[{"internalType":"uint256","name":"ethToLock","type":"uint256"},{"internalType":"uint256","name":"sharesToBurn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"requestWithdrawals","outputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct WithdrawalQueue.PermitInput","name":"_permit","type":"tuple"}],"name":"requestWithdrawalsWithPermit","outputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"requestWithdrawalsWstETH","outputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct WithdrawalQueue.PermitInput","name":"_permit","type":"tuple"}],"name":"requestWithdrawalsWstETHWithPermit","outputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_requestId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftDescriptorAddress","type":"address"}],"name":"setNFTDescriptorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unfinalizedRequestNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unfinalizedStETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}] +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_wstETH", + "type": "address" + }, + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AdminZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ApprovalToOwner", + "type": "error" + }, + { + "inputs": [], + "name": "ApproveToCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_firstArrayLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_secondArrayLength", + "type": "uint256" + } + ], + "name": "ArraysLengthMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "BatchesAreNotSorted", + "type": "error" + }, + { + "inputs": [], + "name": "CantSendValueRecipientMayHaveReverted", + "type": "error" + }, + { + "inputs": [], + "name": "EmptyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractVersionIncrement", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_hint", + "type": "uint256" + } + ], + "name": "InvalidHint", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "InvalidOwnerAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidReportTimestamp", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "InvalidRequestId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "startId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endId", + "type": "uint256" + } + ], + "name": "InvalidRequestIdRange", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidState", + "type": "error" + }, + { + "inputs": [], + "name": "NonZeroContractVersionOnInit", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughEther", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "NotOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "NotOwnerOrApproved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "NotOwnerOrApprovedForAll", + "type": "error" + }, + { + "inputs": [], + "name": "PauseUntilMustBeInFuture", + "type": "error" + }, + { + "inputs": [], + "name": "PausedExpected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "RequestAlreadyClaimed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amountOfStETH", + "type": "uint256" + } + ], + "name": "RequestAmountTooLarge", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amountOfStETH", + "type": "uint256" + } + ], + "name": "RequestAmountTooSmall", + "type": "error" + }, + { + "inputs": [], + "name": "RequestIdsNotSorted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "RequestNotFoundOrNotFinalized", + "type": "error" + }, + { + "inputs": [], + "name": "ResumedExpected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "StringTooLong", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "sent", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxExpected", + "type": "uint256" + } + ], + "name": "TooMuchEtherToFinalize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "realOwner", + "type": "address" + } + ], + "name": "TransferFromIncorrectOwner", + "type": "error" + }, + { + "inputs": [], + "name": "TransferFromZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "TransferToNonIERC721Receiver", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToThemselves", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedContractVersion", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAmountOfETH", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroMetadata", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPauseDuration", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroRecipient", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroShareRate", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroTimestamp", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "baseURI", + "type": "string" + } + ], + "name": "BaseURISet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_fromTokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_toTokenId", + "type": "uint256" + } + ], + "name": "BatchMetadataUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "BunkerModeDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_sinceTimestamp", + "type": "uint256" + } + ], + "name": "BunkerModeEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "name": "InitializedV1", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "MetadataUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "nftDescriptorAddress", + "type": "address" + } + ], + "name": "NftDescriptorAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfETH", + "type": "uint256" + } + ], + "name": "WithdrawalClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "requestor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfStETH", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfShares", + "type": "uint256" + } + ], + "name": "WithdrawalRequested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "from", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "to", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOfETHLocked", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "sharesToBurn", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "WithdrawalsFinalized", + "type": "event" + }, + { + "inputs": [], + "name": "BUNKER_MODE_DISABLED_TIMESTAMP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "FINALIZE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_TOKEN_URI_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_BATCHES_LENGTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_STETH_WITHDRAWAL_AMOUNT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_STETH_WITHDRAWAL_AMOUNT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ORACLE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_INFINITELY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STETH", + "outputs": [ + { + "internalType": "contract IStETH", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WSTETH", + "outputs": [ + { + "internalType": "contract IWstETH", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bunkerModeSinceTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxShareRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxRequestsPerCall", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "remainingEthBudget", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "finished", + "type": "bool" + }, + { + "internalType": "uint256[36]", + "name": "batches", + "type": "uint256[36]" + }, + { + "internalType": "uint256", + "name": "batchesLength", + "type": "uint256" + } + ], + "internalType": "struct WithdrawalQueueBase.BatchesCalculationState", + "name": "_state", + "type": "tuple" + } + ], + "name": "calculateFinalizationBatches", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "remainingEthBudget", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "finished", + "type": "bool" + }, + { + "internalType": "uint256[36]", + "name": "batches", + "type": "uint256[36]" + }, + { + "internalType": "uint256", + "name": "batchesLength", + "type": "uint256" + } + ], + "internalType": "struct WithdrawalQueueBase.BatchesCalculationState", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "claimWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_requestIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_hints", + "type": "uint256[]" + } + ], + "name": "claimWithdrawals", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_requestIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_hints", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "_recipient", + "type": "address" + } + ], + "name": "claimWithdrawalsTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_lastRequestIdToBeFinalized", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxShareRate", + "type": "uint256" + } + ], + "name": "finalize", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_requestIds", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_firstIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_lastIndex", + "type": "uint256" + } + ], + "name": "findCheckpointHints", + "outputs": [ + { + "internalType": "uint256[]", + "name": "hintIds", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBaseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_requestIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "_hints", + "type": "uint256[]" + } + ], + "name": "getClaimableEther", + "outputs": [ + { + "internalType": "uint256[]", + "name": "claimableEthValues", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCheckpointIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastFinalizedRequestId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastRequestId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLockedEtherAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNFTDescriptorAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getResumeSinceTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "getWithdrawalRequests", + "outputs": [ + { + "internalType": "uint256[]", + "name": "requestsIds", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_requestIds", + "type": "uint256[]" + } + ], + "name": "getWithdrawalStatus", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "amountOfStETH", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOfShares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isFinalized", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isClaimed", + "type": "bool" + } + ], + "internalType": "struct WithdrawalQueueBase.WithdrawalRequestStatus[]", + "name": "statuses", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isBunkerModeActive", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_isBunkerModeNow", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "_bunkerStartTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_currentReportTimestamp", + "type": "uint256" + } + ], + "name": "onOracleReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_duration", + "type": "uint256" + } + ], + "name": "pauseFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pauseUntilInclusive", + "type": "uint256" + } + ], + "name": "pauseUntil", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_batches", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "_maxShareRate", + "type": "uint256" + } + ], + "name": "prefinalize", + "outputs": [ + { + "internalType": "uint256", + "name": "ethToLock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesToBurn", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_amounts", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "requestWithdrawals", + "outputs": [ + { + "internalType": "uint256[]", + "name": "requestIds", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_amounts", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct WithdrawalQueue.PermitInput", + "name": "_permit", + "type": "tuple" + } + ], + "name": "requestWithdrawalsWithPermit", + "outputs": [ + { + "internalType": "uint256[]", + "name": "requestIds", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_amounts", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "requestWithdrawalsWstETH", + "outputs": [ + { + "internalType": "uint256[]", + "name": "requestIds", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_amounts", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct WithdrawalQueue.PermitInput", + "name": "_permit", + "type": "tuple" + } + ], + "name": "requestWithdrawalsWstETHWithPermit", + "outputs": [ + { + "internalType": "uint256[]", + "name": "requestIds", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resume", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "_approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_baseURI", + "type": "string" + } + ], + "name": "setBaseURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nftDescriptorAddress", + "type": "address" + } + ], + "name": "setNFTDescriptorAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_requestId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unfinalizedRequestNumber", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unfinalizedStETH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index c70444e90..dec2a7648 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,12 +1,12 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" version = "2.6.1" description = "Happy Eyeballs for asyncio" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -16,9 +16,9 @@ files = [ name = "aiohttp" version = "3.12.9" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiohttp-3.12.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:abb01935bb606bbc080424799bfda358d38374c45a7cbbc89f9bb330deb1db26"}, {file = "aiohttp-3.12.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2337516411cd15b7257736484dfd5101fa0e6b11ef2086b4bb6db9365373dcb"}, @@ -118,15 +118,15 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns (>=3.3.0)", "brotlicffi"] +speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "brotlicffi ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" version = "1.3.2" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, @@ -139,9 +139,9 @@ frozenlist = ">=1.1.0" name = "annotated-types" version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" -category = "main" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -151,9 +151,9 @@ files = [ name = "astroid" version = "3.3.10" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.9.0" +groups = ["dev"] files = [ {file = "astroid-3.3.10-py3-none-any.whl", hash = "sha256:104fb9cb9b27ea95e847a94c003be03a9e039334a8ebca5ee27dafaf5c5711eb"}, {file = "astroid-3.3.10.tar.gz", hash = "sha256:c332157953060c6deb9caa57303ae0d20b0fbdb2e59b4a4f2a6ba49d0a7961ce"}, @@ -163,9 +163,9 @@ files = [ name = "asttokens" version = "3.0.0" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -179,29 +179,29 @@ test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] name = "attrs" version = "25.3.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "base58" version = "2.1.1" description = "Base58 and Base58Check implementation." -category = "main" optional = false python-versions = ">=3.5" +groups = ["main", "dev"] files = [ {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, @@ -214,9 +214,9 @@ tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", " name = "bitarray" version = "3.4.2" description = "efficient arrays of booleans -- C extension" -category = "main" optional = false python-versions = "*" +groups = ["main", "dev"] files = [ {file = "bitarray-3.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:42b552f885c5629182928c79237b375a92bcf1bc1e725b1c8a5e8eab28ea300d"}, {file = "bitarray-3.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e16d6184f349587b6a5045bcf073baf763a86273aab454485ba437d0bca82e8"}, @@ -358,9 +358,9 @@ files = [ name = "black" version = "24.10.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -399,13 +399,25 @@ d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "cached-property" +version = "2.0.1" +description = "A decorator for caching properties in classes." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "cached_property-2.0.1-py3-none-any.whl", hash = "sha256:f617d70ab1100b7bcf6e42228f9ddcb78c676ffa167278d9f730d1c2fba69ccb"}, + {file = "cached_property-2.0.1.tar.gz", hash = "sha256:484d617105e3ee0e4f1f58725e72a8ef9e93deee462222dbd51cd91230897641"}, +] + [[package]] name = "certifi" version = "2025.4.26" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, @@ -415,9 +427,9 @@ files = [ name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -427,9 +439,9 @@ files = [ name = "charset-normalizer" version = "3.4.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, @@ -529,9 +541,9 @@ files = [ name = "ckzg" version = "2.1.1" description = "Python bindings for C-KZG-4844" -category = "main" optional = false python-versions = "*" +groups = ["main", "dev"] files = [ {file = "ckzg-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b9825a1458219e8b4b023012b8ef027ef1f47e903f9541cbca4615f80132730"}, {file = "ckzg-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2a40a3ba65cca4b52825d26829e6f7eb464aa27a9e9efb6b8b2ce183442c741"}, @@ -639,9 +651,9 @@ files = [ name = "click" version = "8.2.1" description = "Composable command line interface toolkit" -category = "dev" optional = false python-versions = ">=3.10" +groups = ["dev"] files = [ {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, @@ -654,21 +666,22 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "sys_platform == \"win32\"", dev = "sys_platform == \"win32\" or platform_system == \"Windows\""} [[package]] name = "conventional-pre-commit" version = "4.2.0" description = "A pre-commit hook that checks commit messages for Conventional Commits formatting." -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "conventional_pre_commit-4.2.0-py3-none-any.whl", hash = "sha256:08acc2bca20bc998090653ca0de9b250e5a51b1f9b0b1bae00f424cc071616cb"}, {file = "conventional_pre_commit-4.2.0.tar.gz", hash = "sha256:6b5a2867338c58a1d14d300de68b56c17b7c8403bb122155f38639a423d21ff1"}, @@ -681,9 +694,9 @@ dev = ["black", "build", "coverage", "flake8", "pre-commit", "pytest", "setuptoo name = "coverage" version = "7.8.2" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "coverage-7.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd8ec21e1443fd7a447881332f7ce9d35b8fbd2849e761bb290b584535636b0a"}, {file = "coverage-7.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26c2396674816deaeae7ded0e2b42c26537280f8fe313335858ffff35019be"}, @@ -755,15 +768,16 @@ files = [ ] [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cytoolz" version = "1.0.1" description = "Cython implementation of Toolz: High performance functional utilities" -category = "main" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] +markers = "implementation_name == \"cpython\"" files = [ {file = "cytoolz-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cec9af61f71fc3853eb5dca3d42eb07d1f48a4599fa502cbe92adde85f74b042"}, {file = "cytoolz-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:140bbd649dbda01e91add7642149a5987a7c3ccc251f2263de894b89f50b6608"}, @@ -877,9 +891,9 @@ cython = ["cython"] name = "decorator" version = "5.2.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -889,9 +903,9 @@ files = [ name = "dill" version = "0.4.0" description = "serialize all of Python" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, @@ -905,9 +919,9 @@ profile = ["gprof2dot (>=2022.7.29)"] name = "distlib" version = "0.3.9" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -917,9 +931,9 @@ files = [ name = "eth-abi" version = "5.2.0" description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877"}, {file = "eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0"}, @@ -940,9 +954,9 @@ tools = ["hypothesis (>=6.22.0,<6.108.7)"] name = "eth-account" version = "0.13.7" description = "eth-account: Sign Ethereum transactions and messages with local private keys" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "eth_account-0.13.7-py3-none-any.whl", hash = "sha256:39727de8c94d004ff61d10da7587509c04d2dc7eac71e04830135300bdfc6d24"}, {file = "eth_account-0.13.7.tar.gz", hash = "sha256:5853ecbcbb22e65411176f121f5f24b8afeeaf13492359d254b16d8b18c77a46"}, @@ -965,13 +979,33 @@ dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "coverage", "hypothesis docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] test = ["coverage", "hypothesis (>=6.22.0,<6.108.7)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] +[[package]] +name = "eth-bloom" +version = "3.1.0" +description = "A python implementation of the bloom filter used by Ethereum" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "eth_bloom-3.1.0-py3-none-any.whl", hash = "sha256:c96b2dd6cafa407373bca1a9d74b650378ba672d5b17f2771bf7d3c3aaa7651c"}, + {file = "eth_bloom-3.1.0.tar.gz", hash = "sha256:4bc918f6fde44334e92b23cfb345db961e2e3af620535cbc872444f7a143cb88"}, +] + +[package.dependencies] +eth-hash = {version = ">=0.4.0", extras = ["pycryptodome"]} + +[package.extras] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "hypothesis (>=3.31.2)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["towncrier (>=24,<25)"] +test = ["hypothesis (>=3.31.2)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + [[package]] name = "eth-hash" version = "0.7.1" description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "eth_hash-0.7.1-py3-none-any.whl", hash = "sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a"}, {file = "eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5"}, @@ -984,16 +1018,16 @@ pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"p dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] pycryptodome = ["pycryptodome (>=3.6.6,<4)"] -pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"] +pysha3 = ["pysha3 (>=1.0.0,<2.0.0) ; python_version < \"3.9\"", "safe-pysha3 (>=1.0.0) ; python_version >= \"3.9\""] test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-keyfile" version = "0.8.1" description = "eth-keyfile: A library for handling the encrypted keyfiles used to store ethereum private keys" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64"}, {file = "eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1"}, @@ -1013,9 +1047,9 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] name = "eth-keys" version = "0.7.0" description = "eth-keys: Common API for Ethereum key operations" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "eth_keys-0.7.0-py3-none-any.whl", hash = "sha256:b0cdda8ffe8e5ba69c7c5ca33f153828edcace844f67aabd4542d7de38b159cf"}, {file = "eth_keys-0.7.0.tar.gz", hash = "sha256:79d24fd876201df67741de3e3fefb3f4dbcbb6ace66e47e6fe662851a4547814"}, @@ -1035,9 +1069,9 @@ test = ["asn1tools (>=0.146.2)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "h name = "eth-rlp" version = "2.2.0" description = "eth-rlp: RLP definitions for common Ethereum objects in Python" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "eth_rlp-2.2.0-py3-none-any.whl", hash = "sha256:5692d595a741fbaef1203db6a2fedffbd2506d31455a6ad378c8449ee5985c47"}, {file = "eth_rlp-2.2.0.tar.gz", hash = "sha256:5e4b2eb1b8213e303d6a232dfe35ab8c29e2d3051b86e8d359def80cd21db83d"}, @@ -1057,9 +1091,9 @@ test = ["eth-hash[pycryptodome]", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] name = "eth-tester" version = "0.12.1b1" description = "eth-tester: Tools for testing Ethereum applications." -category = "dev" optional = false python-versions = "<4,>=3.8" +groups = ["dev"] files = [ {file = "eth_tester-0.12.1b1-py3-none-any.whl", hash = "sha256:aa3f91960e5ce9fe74eac4a0dcb22ffada84b8e28dc11d0f0a69085a5879be60"}, {file = "eth_tester-0.12.1b1.tar.gz", hash = "sha256:7aeb3b5839fb1bc20e7f15c5e289ba95809fa41117a5ac194e8d270467982832"}, @@ -1074,19 +1108,19 @@ rlp = ">=3.0.0" semantic_version = ">=2.6.0" [package.extras] -dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "eth-hash[pysha3] (>=0.1.4,<1.0.0)", "ipython", "pre-commit (>=3.4.0)", "py-evm (>=0.10.0b0,<0.11.0b0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.0.0,<3)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "eth-hash[pycryptodome] (>=0.1.4,<1.0.0) ; implementation_name == \"pypy\"", "eth-hash[pysha3] (>=0.1.4,<1.0.0) ; implementation_name == \"cpython\"", "ipython", "pre-commit (>=3.4.0)", "py-evm (>=0.10.0b0,<0.11.0b0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.0.0,<3)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] docs = ["towncrier (>=24,<25)"] -py-evm = ["eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "eth-hash[pysha3] (>=0.1.4,<1.0.0)", "py-evm (>=0.10.0b0,<0.11.0b0)"] -pyevm = ["eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "eth-hash[pysha3] (>=0.1.4,<1.0.0)", "py-evm (>=0.10.0b0,<0.11.0b0)"] +py-evm = ["eth-hash[pycryptodome] (>=0.1.4,<1.0.0) ; implementation_name == \"pypy\"", "eth-hash[pysha3] (>=0.1.4,<1.0.0) ; implementation_name == \"cpython\"", "py-evm (>=0.10.0b0,<0.11.0b0)"] +pyevm = ["eth-hash[pycryptodome] (>=0.1.4,<1.0.0) ; implementation_name == \"pypy\"", "eth-hash[pysha3] (>=0.1.4,<1.0.0) ; implementation_name == \"cpython\"", "py-evm (>=0.10.0b0,<0.11.0b0)"] test = ["eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.0.0,<3)"] [[package]] name = "eth-typing" version = "5.2.1" description = "eth-typing: Common type annotations for ethereum python packages" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "eth_typing-5.2.1-py3-none-any.whl", hash = "sha256:b0c2812ff978267563b80e9d701f487dd926f1d376d674f3b535cfe28b665d3d"}, {file = "eth_typing-5.2.1.tar.gz", hash = "sha256:7557300dbf02a93c70fa44af352b5c4a58f94e997a0fd6797fb7d1c29d9538ee"}, @@ -1104,9 +1138,9 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] name = "eth-utils" version = "5.3.0" description = "eth-utils: Common utility functions for python code that interacts with Ethereum" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "eth_utils-5.3.0-py3-none-any.whl", hash = "sha256:ac184883ab299d923428bbe25dae5e356979a3993e0ef695a864db0a20bc262d"}, {file = "eth_utils-5.3.0.tar.gz", hash = "sha256:1f096867ac6be895f456fa3acb26e9573ae66e753abad9208f316d24d6178156"}, @@ -1128,9 +1162,9 @@ test = ["hypothesis (>=4.43.0)", "mypy (==1.10.0)", "pytest (>=7.0.0)", "pytest- name = "execnet" version = "2.1.1" description = "execnet: rapid multi-Python deployment" -category = "main" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1143,24 +1177,24 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] name = "executing" version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] [[package]] name = "faker" version = "37.3.0" description = "Faker is a Python package that generates fake data for you." -category = "dev" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "faker-37.3.0-py3-none-any.whl", hash = "sha256:48c94daa16a432f2d2bc803c7ff602509699fca228d13e97e379cd860a7e216e"}, {file = "faker-37.3.0.tar.gz", hash = "sha256:77b79e7a2228d57175133af0bbcdd26dc623df81db390ee52f5104d46c010f2f"}, @@ -1173,9 +1207,9 @@ tzdata = "*" name = "filelock" version = "3.18.0" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, @@ -1184,15 +1218,15 @@ files = [ [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] -typing = ["typing-extensions (>=4.12.2)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] [[package]] name = "frozenlist" version = "1.6.2" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "frozenlist-1.6.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:92836b9903e52f787f4f4bfc6cf3b03cf19de4cbc09f5969e58806f876d8647f"}, {file = "frozenlist-1.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3af419982432a13a997451e611ff7681a4fbf81dca04f70b08fc51106335ff0"}, @@ -1304,9 +1338,9 @@ files = [ name = "hexbytes" version = "1.3.1" description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "hexbytes-1.3.1-py3-none-any.whl", hash = "sha256:da01ff24a1a9a2b1881c4b85f0e9f9b0f51b526b379ffa23832ae7899d29c2c7"}, {file = "hexbytes-1.3.1.tar.gz", hash = "sha256:a657eebebdfe27254336f98d8af6e2236f3f83aed164b87466b6cf6c5f5a4765"}, @@ -1321,9 +1355,9 @@ test = ["eth_utils (>=2.0.0)", "hypothesis (>=3.44.24)", "pytest (>=7.0.0)", "py name = "hypothesis" version = "6.135.1" description = "A library for property-based testing" -category = "dev" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "hypothesis-6.135.1-py3-none-any.whl", hash = "sha256:14fab728bfe2409a3934e6e1ea6ae0a706d0bc78187137218a253aec7528b4c8"}, {file = "hypothesis-6.135.1.tar.gz", hash = "sha256:36eea411ef5dde5612301fcd9a293b6f2a3a5ab96488be2e23e7c5799cbd7b33"}, @@ -1334,7 +1368,7 @@ attrs = ">=22.2.0" sortedcontainers = ">=2.1.0,<3.0.0" [package.extras] -all = ["black (>=19.10b0)", "click (>=7.0)", "crosshair-tool (>=0.0.88)", "django (>=4.2)", "dpcontracts (>=0.4)", "hypothesis-crosshair (>=0.0.23)", "lark (>=0.10.1)", "libcst (>=0.3.16)", "numpy (>=1.19.3)", "pandas (>=1.1)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "tzdata (>=2025.2)", "watchdog (>=4.0.0)"] +all = ["black (>=19.10b0)", "click (>=7.0)", "crosshair-tool (>=0.0.88)", "django (>=4.2)", "dpcontracts (>=0.4)", "hypothesis-crosshair (>=0.0.23)", "lark (>=0.10.1)", "libcst (>=0.3.16)", "numpy (>=1.19.3)", "pandas (>=1.1)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "tzdata (>=2025.2) ; sys_platform == \"win32\" or sys_platform == \"emscripten\"", "watchdog (>=4.0.0)"] cli = ["black (>=19.10b0)", "click (>=7.0)", "rich (>=9.0.0)"] codemods = ["libcst (>=0.3.16)"] crosshair = ["crosshair-tool (>=0.0.88)", "hypothesis-crosshair (>=0.0.23)"] @@ -1349,15 +1383,15 @@ pytest = ["pytest (>=4.6)"] pytz = ["pytz (>=2014.1)"] redis = ["redis (>=3.0.0)"] watchdog = ["watchdog (>=4.0.0)"] -zoneinfo = ["tzdata (>=2025.2)"] +zoneinfo = ["tzdata (>=2025.2) ; sys_platform == \"win32\" or sys_platform == \"emscripten\""] [[package]] name = "identify" version = "2.6.12" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2"}, {file = "identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6"}, @@ -1370,9 +1404,9 @@ license = ["ukkonen"] name = "idna" version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1385,9 +1419,9 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 name = "iniconfig" version = "2.1.0" description = "brain-dead simple config-ini parsing" -category = "main" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, @@ -1397,9 +1431,9 @@ files = [ name = "ipfshttpclient" version = "0.7.0" description = "Python IPFS HTTP CLIENT library" -category = "dev" optional = false python-versions = ">=3.5.4,!=3.6.0,!=3.6.1,!=3.7.0,!=3.7.1" +groups = ["dev"] files = [ {file = "ipfshttpclient-0.7.0-py3-none-any.whl", hash = "sha256:161c348e91cdc194c06c8725446a51a2d758ff2cc5ea97ec98f49e2af2465405"}, {file = "ipfshttpclient-0.7.0.tar.gz", hash = "sha256:feb1033c14c3ac87ee81264176c5beefeaf386385804427160466117ccc43693"}, @@ -1413,9 +1447,9 @@ requests = ">=2.11" name = "ipython" version = "9.3.0" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.11" +groups = ["dev"] files = [ {file = "ipython-9.3.0-py3-none-any.whl", hash = "sha256:1a0b6dd9221a1f5dddf725b57ac0cb6fddc7b5f470576231ae9162b9b3455a04"}, {file = "ipython-9.3.0.tar.gz", hash = "sha256:79eb896f9f23f50ad16c3bc205f686f6e030ad246cc309c6279a242b14afe9d8"}, @@ -1445,9 +1479,9 @@ test-extra = ["curio", "ipykernel", "ipython[test]", "jupyter_ai", "matplotlib ( name = "ipython-pygments-lexers" version = "1.1.1" description = "Defines a variety of Pygments lexers for highlighting IPython code." -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, @@ -1460,9 +1494,9 @@ pygments = "*" name = "isort" version = "6.0.1" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.9.0" +groups = ["dev"] files = [ {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, @@ -1476,9 +1510,9 @@ plugins = ["setuptools"] name = "jedi" version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1496,9 +1530,9 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] name = "json-stream" version = "2.3.3" description = "Streaming JSON encoder and decoder" -category = "main" optional = false python-versions = "<4,>=3.5" +groups = ["main"] files = [ {file = "json_stream-2.3.3-py3-none-any.whl", hash = "sha256:65f08c5031d7df145c6fe89e434b718c1574b2bb84b8a0eea974de90916a089d"}, {file = "json_stream-2.3.3.tar.gz", hash = "sha256:894444c68c331174926763e224fb34b7ed3f90749d1c165afd0f5930207534c4"}, @@ -1515,9 +1549,9 @@ requests = ["requests"] name = "json-stream-rs-tokenizer" version = "0.4.29" description = "A faster tokenizer for the json-stream Python library" -category = "main" optional = false python-versions = "<4,>=3.7" +groups = ["main"] files = [ {file = "json_stream_rs_tokenizer-0.4.29-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:52bd1f819196a6a6831c57bf1f232830ccd4cd11f7661d1385f450145eaadca6"}, {file = "json_stream_rs_tokenizer-0.4.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bdd3eaa40af57cb4e3b4546940fe75e45da239eec907ce7bfa6cf4198cd29e55"}, @@ -1606,13 +1640,107 @@ files = [ benchmark = ["contexttimer (>=0.3,<0.4)", "json-stream-to-standard-types (>=0.1,<0.2)", "si-prefix (>=1.2,<2)", "tqdm (>=4.64,<5)", "typer (>=0.6,<0.7)"] test = ["json-stream (==2.3.2)", "json-stream-rs-tokenizer[benchmark]", "pytest (>7.1,<8)"] +[[package]] +name = "lru-dict" +version = "1.3.0" +description = "An Dict like LRU container." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "lru-dict-1.3.0.tar.gz", hash = "sha256:54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b"}, + {file = "lru_dict-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4073333894db9840f066226d50e6f914a2240711c87d60885d8c940b69a6673f"}, + {file = "lru_dict-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0ad6361e4dd63b47b2fc8eab344198f37387e1da3dcfacfee19bafac3ec9f1eb"}, + {file = "lru_dict-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c637ab54b8cd9802fe19b260261e38820d748adf7606e34045d3c799b6dde813"}, + {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fce5f95489ca1fc158cc9fe0f4866db9cec82c2be0470926a9080570392beaf"}, + {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2bf2e24cf5f19c3ff69bf639306e83dced273e6fa775b04e190d7f5cd16f794"}, + {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e90059f7701bef3c4da073d6e0434a9c7dc551d5adce30e6b99ef86b186f4b4a"}, + {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ecb7ae557239c64077e9b26a142eb88e63cddb104111a5122de7bebbbd00098"}, + {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6af36166d22dba851e06a13e35bbf33845d3dd88872e6aebbc8e3e7db70f4682"}, + {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ee38d420c77eed548df47b7d74b5169a98e71c9e975596e31ab808e76d11f09"}, + {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0e1845024c31e6ff246c9eb5e6f6f1a8bb564c06f8a7d6d031220044c081090b"}, + {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3ca5474b1649555d014be1104e5558a92497509021a5ba5ea6e9b492303eb66b"}, + {file = "lru_dict-1.3.0-cp310-cp310-win32.whl", hash = "sha256:ebb03a9bd50c2ed86d4f72a54e0aae156d35a14075485b2127c4b01a3f4a63fa"}, + {file = "lru_dict-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:04cda617f4e4c27009005d0a8185ef02829b14b776d2791f5c994cc9d668bc24"}, + {file = "lru_dict-1.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:20c595764695d20bdc3ab9b582e0cc99814da183544afb83783a36d6741a0dac"}, + {file = "lru_dict-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d9b30a8f50c3fa72a494eca6be5810a1b5c89e4f0fda89374f0d1c5ad8d37d51"}, + {file = "lru_dict-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9710737584650a4251b9a566cbb1a86f83437adb209c9ba43a4e756d12faf0d7"}, + {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b84c321ae34f2f40aae80e18b6fa08b31c90095792ab64bb99d2e385143effaa"}, + {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eed24272b4121b7c22f234daed99899817d81d671b3ed030c876ac88bc9dc890"}, + {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd13af06dab7c6ee92284fd02ed9a5613a07d5c1b41948dc8886e7207f86dfd"}, + {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1efc59bfba6aac33684d87b9e02813b0e2445b2f1c444dae2a0b396ad0ed60c"}, + {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfaf75ac574447afcf8ad998789071af11d2bcf6f947643231f692948839bd98"}, + {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c95f8751e2abd6f778da0399c8e0239321d560dbc58cb063827123137d213242"}, + {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:abd0c284b26b5c4ee806ca4f33ab5e16b4bf4d5ec9e093e75a6f6287acdde78e"}, + {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a47740652b25900ac5ce52667b2eade28d8b5fdca0ccd3323459df710e8210a"}, + {file = "lru_dict-1.3.0-cp311-cp311-win32.whl", hash = "sha256:a690c23fc353681ed8042d9fe8f48f0fb79a57b9a45daea2f0be1eef8a1a4aa4"}, + {file = "lru_dict-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:efd3f4e0385d18f20f7ea6b08af2574c1bfaa5cb590102ef1bee781bdfba84bc"}, + {file = "lru_dict-1.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c279068f68af3b46a5d649855e1fb87f5705fe1f744a529d82b2885c0e1fc69d"}, + {file = "lru_dict-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:350e2233cfee9f326a0d7a08e309372d87186565e43a691b120006285a0ac549"}, + {file = "lru_dict-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4eafb188a84483b3231259bf19030859f070321b00326dcb8e8c6cbf7db4b12f"}, + {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73593791047e36b37fdc0b67b76aeed439fcea80959c7d46201240f9ec3b2563"}, + {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1958cb70b9542773d6241974646e5410e41ef32e5c9e437d44040d59bd80daf2"}, + {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc1cd3ed2cee78a47f11f3b70be053903bda197a873fd146e25c60c8e5a32cd6"}, + {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82eb230d48eaebd6977a92ddaa6d788f14cf4f4bcf5bbffa4ddfd60d051aa9d4"}, + {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5ad659cbc349d0c9ba8e536b5f40f96a70c360f43323c29f4257f340d891531c"}, + {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ba490b8972531d153ac0d4e421f60d793d71a2f4adbe2f7740b3c55dce0a12f1"}, + {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:c0131351b8a7226c69f1eba5814cbc9d1d8daaf0fdec1ae3f30508e3de5262d4"}, + {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0e88dba16695f17f41701269fa046197a3fd7b34a8dba744c8749303ddaa18df"}, + {file = "lru_dict-1.3.0-cp312-cp312-win32.whl", hash = "sha256:6ffaf595e625b388babc8e7d79b40f26c7485f61f16efe76764e32dce9ea17fc"}, + {file = "lru_dict-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf9da32ef2582434842ab6ba6e67290debfae72771255a8e8ab16f3e006de0aa"}, + {file = "lru_dict-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c265f16c936a8ff3bb4b8a4bda0be94c15ec28b63e99fdb1439c1ffe4cd437db"}, + {file = "lru_dict-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:784ca9d3b0730b3ec199c0a58f66264c63dd5d438119c739c349a6a9be8e5f6e"}, + {file = "lru_dict-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e13b2f58f647178470adaa14603bb64cc02eeed32601772ccea30e198252883c"}, + {file = "lru_dict-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ffbce5c2e80f57937679553c8f27e61ec327c962bf7ea0b15f1d74277fd5363"}, + {file = "lru_dict-1.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7969cb034b3ccc707aff877c73c225c32d7e2a7981baa8f92f5dd4d468fe8c33"}, + {file = "lru_dict-1.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca9ab676609cce85dd65d91c275e47da676d13d77faa72de286fbea30fbaa596"}, + {file = "lru_dict-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27c078b5d75989952acbf9b77e14c3dadc468a4aafe85174d548afbc5efc38b"}, + {file = "lru_dict-1.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6123aefe97762ad74215d05320a7f389f196f0594c8813534284d4eafeca1a96"}, + {file = "lru_dict-1.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd869cadba9a63e1e7fe2dced4a5747d735135b86016b0a63e8c9e324ab629ac"}, + {file = "lru_dict-1.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:40a8daddc29c7edb09dfe44292cf111f1e93a8344349778721d430d336b50505"}, + {file = "lru_dict-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a03170e4152836987a88dcebde61aaeb73ab7099a00bb86509d45b3fe424230"}, + {file = "lru_dict-1.3.0-cp38-cp38-win32.whl", hash = "sha256:3b4f121afe10f5a82b8e317626eb1e1c325b3f104af56c9756064cd833b1950b"}, + {file = "lru_dict-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:1470f5828c7410e16c24b5150eb649647986e78924816e6fb0264049dea14a2b"}, + {file = "lru_dict-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a3c9f746a9917e784fffcedeac4c8c47a3dbd90cbe13b69e9140182ad97ce4b7"}, + {file = "lru_dict-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2789296819525a1f3204072dfcf3df6db8bcf69a8fc740ffd3de43a684ea7002"}, + {file = "lru_dict-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:170b66d29945391460351588a7bd8210a95407ae82efe0b855e945398a1d24ea"}, + {file = "lru_dict-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:774ca88501a9effe8797c3db5a6685cf20978c9cb0fe836b6813cfe1ca60d8c9"}, + {file = "lru_dict-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df2e119c6ae412d2fd641a55f8a1e2e51f45a3de3449c18b1b86c319ab79e0c4"}, + {file = "lru_dict-1.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28aa1ea42a7e48174bf513dc2416fea7511a547961e678dc6f5670ca987c18cb"}, + {file = "lru_dict-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9537e1cee6fa582cb68f2fb9ce82d51faf2ccc0a638b275d033fdcb1478eb80b"}, + {file = "lru_dict-1.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:64545fca797fe2c68c5168efb5f976c6e1459e058cab02445207a079180a3557"}, + {file = "lru_dict-1.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a193a14c66cfc0c259d05dddc5e566a4b09e8f1765e941503d065008feebea9d"}, + {file = "lru_dict-1.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:3cb1de0ce4137b060abaafed8474cc0ebd12cedd88aaa7f7b3ebb1ddfba86ae0"}, + {file = "lru_dict-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8551ccab1349d4bebedab333dfc8693c74ff728f4b565fe15a6bf7d296bd7ea9"}, + {file = "lru_dict-1.3.0-cp39-cp39-win32.whl", hash = "sha256:6cb0be5e79c3f34d69b90d8559f0221e374b974b809a22377122c4b1a610ff67"}, + {file = "lru_dict-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9f725f2a0bdf1c18735372d5807af4ea3b77888208590394d4660e3d07971f21"}, + {file = "lru_dict-1.3.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f8f7824db5a64581180ab9d09842e6dd9fcdc46aac9cb592a0807cd37ea55680"}, + {file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acd04b7e7b0c0c192d738df9c317093335e7282c64c9d1bb6b7ebb54674b4e24"}, + {file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5c20f236f27551e3f0adbf1a987673fb1e9c38d6d284502cd38f5a3845ef681"}, + {file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca3703ff03b03a1848c563bc2663d0ad813c1cd42c4d9cf75b623716d4415d9a"}, + {file = "lru_dict-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a9fb71ba262c6058a0017ce83d343370d0a0dbe2ae62c2eef38241ec13219330"}, + {file = "lru_dict-1.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f5b88a7c39e307739a3701194993455968fcffe437d1facab93546b1b8a334c1"}, + {file = "lru_dict-1.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2682bfca24656fb7a643621520d57b7fe684ed5fa7be008704c1235d38e16a32"}, + {file = "lru_dict-1.3.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96fc87ddf569181827458ec5ad8fa446c4690cffacda66667de780f9fcefd44d"}, + {file = "lru_dict-1.3.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcec98e2c7da7631f0811730303abc4bdfe70d013f7a11e174a2ccd5612a7c59"}, + {file = "lru_dict-1.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6bba2863060caeaedd8386b0c8ee9a7ce4d57a7cb80ceeddf440b4eff2d013ba"}, + {file = "lru_dict-1.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c497fb60279f1e1d7dfbe150b1b069eaa43f7e172dab03f206282f4994676c5"}, + {file = "lru_dict-1.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d9509d817a47597988615c1a322580c10100acad10c98dfcf3abb41e0e5877f"}, + {file = "lru_dict-1.3.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0213ab4e3d9a8d386c18e485ad7b14b615cb6f05df6ef44fb2a0746c6ea9278b"}, + {file = "lru_dict-1.3.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b50fbd69cd3287196796ab4d50e4cc741eb5b5a01f89d8e930df08da3010c385"}, + {file = "lru_dict-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5247d1f011f92666010942434020ddc5a60951fefd5d12a594f0e5d9f43e3b3b"}, +] + +[package.extras] +test = ["pytest"] + [[package]] name = "matplotlib-inline" version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, @@ -1625,9 +1753,9 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -1637,9 +1765,9 @@ files = [ name = "more-itertools" version = "10.7.0" description = "More routines for operating on iterables, beyond itertools" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, @@ -1649,9 +1777,9 @@ files = [ name = "morphys" version = "1.0" description = "Smart conversions between unicode and bytes types for common cases" -category = "main" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "morphys-1.0-py2.py3-none-any.whl", hash = "sha256:76d6dbaa4d65f597e59d332c81da786d83e4669387b9b2a750cfec74e7beec20"}, ] @@ -1660,9 +1788,9 @@ files = [ name = "multiaddr" version = "0.0.9" description = "Python implementation of jbenet's multiaddr" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +groups = ["dev"] files = [ {file = "multiaddr-0.0.9-py2.py3-none-any.whl", hash = "sha256:5c0f862cbcf19aada2a899f80ef896ddb2e85614e0c8f04dd287c06c69dac95b"}, {file = "multiaddr-0.0.9.tar.gz", hash = "sha256:30b2695189edc3d5b90f1c303abb8f02d963a3a4edf2e7178b975eb417ab0ecf"}, @@ -1678,9 +1806,9 @@ varint = "*" name = "multidict" version = "6.4.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "multidict-6.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8adee3ac041145ffe4488ea73fa0a622b464cc25340d98be76924d0cda8545ff"}, {file = "multidict-6.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b61e98c3e2a861035aaccd207da585bdcacef65fe01d7a0d07478efac005e028"}, @@ -1792,9 +1920,9 @@ files = [ name = "mypy" version = "1.16.0" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "mypy-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7909541fef256527e5ee9c0a7e2aeed78b6cda72ba44298d1334fe7881b05c5c"}, {file = "mypy-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e71d6f0090c2256c713ed3d52711d01859c82608b5d68d4fa01a3fe30df95571"}, @@ -1846,9 +1974,9 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, @@ -1858,9 +1986,9 @@ files = [ name = "netaddr" version = "1.3.0" description = "A network address manipulation library for Python" -category = "dev" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe"}, {file = "netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a"}, @@ -1873,9 +2001,9 @@ nicer-shell = ["ipython"] name = "nodeenv" version = "1.9.1" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -1885,9 +2013,9 @@ files = [ name = "oz-merkle-tree" version = "0.1.0" description = "A Python library to generate merkle trees and merkle proofs." -category = "main" optional = false python-versions = "^3.11" +groups = ["main"] files = [] develop = false @@ -1905,9 +2033,9 @@ resolved_reference = "f4ad6e006b8daf05ce2ce255e123eb9f923d8ef8" name = "packaging" version = "25.0" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -1917,9 +2045,9 @@ files = [ name = "parsimonious" version = "0.10.0" description = "(Soon to be) the fastest pure-Python PEG parser I could muster" -category = "main" optional = false python-versions = "*" +groups = ["main", "dev"] files = [ {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, {file = "parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c"}, @@ -1932,9 +2060,9 @@ regex = ">=2022.3.15" name = "parso" version = "0.8.4" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -1948,9 +2076,9 @@ testing = ["docopt", "pytest"] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -1960,9 +2088,10 @@ files = [ name = "pexpect" version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -1975,9 +2104,9 @@ ptyprocess = ">=0.5" name = "platformdirs" version = "4.3.8" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -category = "dev" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, @@ -1992,9 +2121,9 @@ type = ["mypy (>=1.14.1)"] name = "pluggy" version = "1.6.0" description = "plugin and hook calling mechanisms for python" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, @@ -2008,9 +2137,9 @@ testing = ["coverage", "pytest", "pytest-benchmark"] name = "polyfactory" version = "2.21.0" description = "Mock data generation factories" -category = "dev" optional = false python-versions = "<4.0,>=3.8" +groups = ["dev"] files = [ {file = "polyfactory-2.21.0-py3-none-any.whl", hash = "sha256:9483b764756c8622313d99f375889b1c0d92f09affb05742d7bcfa2b5198d8c5"}, {file = "polyfactory-2.21.0.tar.gz", hash = "sha256:a6d8dba91b2515d744cc014b5be48835633f7ccb72519a68f8801759e5b1737a"}, @@ -2033,9 +2162,9 @@ sqlalchemy = ["sqlalchemy (>=1.4.29)"] name = "pre-commit" version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, @@ -2052,9 +2181,9 @@ virtualenv = ">=20.10.0" name = "prometheus-client" version = "0.21.1" description = "Python client for the Prometheus monitoring system." -category = "main" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, @@ -2067,9 +2196,9 @@ twisted = ["twisted"] name = "prompt-toolkit" version = "3.0.51" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, @@ -2082,9 +2211,9 @@ wcwidth = "*" name = "propcache" version = "0.3.1" description = "Accelerated property cache" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "propcache-0.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98"}, {file = "propcache-0.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180"}, @@ -2190,9 +2319,10 @@ files = [ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -2202,9 +2332,9 @@ files = [ name = "pure-eval" version = "0.2.3" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -2213,13 +2343,66 @@ files = [ [package.extras] tests = ["pytest"] +[[package]] +name = "py-ecc" +version = "8.0.0" +description = "py-ecc: Elliptic curve crypto in python including secp256k1, alt_bn128, and bls12_381" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "py_ecc-8.0.0-py3-none-any.whl", hash = "sha256:c0b2dfc4bde67a55122a392591a10e851a986d5128f680628c80b405f7663e13"}, + {file = "py_ecc-8.0.0.tar.gz", hash = "sha256:56aca19e5dc37294f60c1cc76666c03c2276e7666412b9a559fa0145d099933d"}, +] + +[package.dependencies] +eth-typing = ">=3.0.0" +eth-utils = ">=2.0.0" + +[package.extras] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "py-evm" +version = "0.12.1b1" +description = "Python implementation of the Ethereum Virtual Machine" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "py_evm-0.12.1b1-py3-none-any.whl", hash = "sha256:015ebc8dd95925030be87ce4b3fd31e3c70df626c5ad8665fb06cd611c73eb68"}, + {file = "py_evm-0.12.1b1.tar.gz", hash = "sha256:7bcd9935a3ac2989c8f068b2006f136189281ebc6e279663405cb2c5397ed890"}, +] + +[package.dependencies] +cached-property = ">=1.5.1" +ckzg = ">=2.0.0" +eth-bloom = ">=1.0.3" +eth-keys = ">=0.4.0" +eth-typing = ">=5.2.0" +eth-utils = ">=2.0.0" +lru-dict = ">=1.1.6" +py-ecc = ">=8.0.0" +rlp = ">=3.0.0" +trie = ">=2.0.0" + +[package.extras] +benchmark = ["termcolor (>=1.1.0)", "web3 (>=6.0.0)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "cached-property (>=1.5.1)", "ckzg (>=2.0.0)", "eth-bloom (>=1.0.3)", "eth-keys (>=0.4.0)", "eth-typing (>=5.2.0)", "eth-utils (>=2.0.0)", "factory-boy (>=3.0.0)", "hypothesis (>=6,<7)", "ipython", "lru-dict (>=1.1.6)", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "py-ecc (>=8.0.0)", "py-evm (>=0.8.0b1)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.20.0)", "pytest-cov (>=4.0.0)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=3.0)", "rlp (>=3.0.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "sphinxcontrib-asyncio (>=0.2.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "trie (>=2.0.0)", "twine", "wheel"] +docs = ["py-evm (>=0.8.0b1)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "sphinxcontrib-asyncio (>=0.2.0)", "towncrier (>=24,<25)"] +eth = ["cached-property (>=1.5.1)", "ckzg (>=2.0.0)", "eth-bloom (>=1.0.3)", "eth-keys (>=0.4.0)", "eth-typing (>=5.2.0)", "eth-utils (>=2.0.0)", "lru-dict (>=1.1.6)", "py-ecc (>=8.0.0)", "rlp (>=3.0.0)", "trie (>=2.0.0)"] +eth-extra = ["blake2b-py (>=0.2.0)", "coincurve (>=18.0.0)"] +test = ["factory-boy (>=3.0.0)", "hypothesis (>=6,<7)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.20.0)", "pytest-cov (>=4.0.0)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=3.0)"] + [[package]] name = "py-multibase" version = "1.0.3" description = "Multibase implementation for Python" -category = "main" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "py-multibase-1.0.3.tar.gz", hash = "sha256:d28a20efcbb61eec28f55827a0bf329c7cea80fffd933aecaea6ae8431267fe4"}, {file = "py_multibase-1.0.3-py2.py3-none-any.whl", hash = "sha256:2677c1fafcc0ae15ddb9c7f444c5becc2530b3889124fd4fa2959ddfefb8c15b"}, @@ -2234,9 +2417,9 @@ six = ">=1.10.0,<2.0" name = "py-multicodec" version = "0.2.1" description = "Multicodec implementation in Python" -category = "main" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "py-multicodec-0.2.1.tar.gz", hash = "sha256:83021ffe8c0e272d19b5b86bc5b39efa67c8e9f4735ce6cafdbc1ace767ec647"}, {file = "py_multicodec-0.2.1-py2.py3-none-any.whl", hash = "sha256:55b6bb53088a63e56c434cb11b29795e8805652bac43d50a8f2a9bcf5ca84e1f"}, @@ -2251,9 +2434,9 @@ varint = ">=1.0.2,<2.0.0" name = "py-multiformats-cid" version = "0.4.4" description = "Self-describing content-addressed identifiers for distributed systems" -category = "main" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "py_multiformats_cid-0.4.4-py2.py3-none-any.whl", hash = "sha256:83f6c3109ed56664799c7367703a68d1724b1e9bd79b45c8935c77660560d1dd"}, ] @@ -2269,9 +2452,9 @@ py-multihash = "*" name = "py-multihash" version = "2.0.1" description = "Multihash implementation in Python" -category = "main" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "py-multihash-2.0.1.tar.gz", hash = "sha256:b97511a87b7091f8b37a3d74ccb4a898e133529e7c5e431f9a27f78248a75e60"}, {file = "py_multihash-2.0.1-py2.py3-none-any.whl", hash = "sha256:c388728b3456d35cd6668b42a3d9ba32dd640493c8e93b992979668dcf2c0676"}, @@ -2287,9 +2470,9 @@ varint = ">=1.0.2,<2.0" name = "pycryptodome" version = "3.23.0" description = "Cryptographic library for Python" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "pycryptodome-3.23.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a176b79c49af27d7f6c12e4b178b0824626f40a7b9fed08f712291b6d54bf566"}, {file = "pycryptodome-3.23.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:573a0b3017e06f2cffd27d92ef22e46aa3be87a2d317a5abf7cc0e84e321bd75"}, @@ -2338,9 +2521,9 @@ files = [ name = "pydantic" version = "2.11.5" description = "Data validation using Python type hints" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7"}, {file = "pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a"}, @@ -2354,15 +2537,15 @@ typing-inspection = ">=0.4.0" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" version = "2.33.2" description = "Core functionality for Pydantic validation and serialization" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, @@ -2472,9 +2655,9 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" name = "pygments" version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -2487,9 +2670,9 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pylint" version = "3.3.7" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.9.0" +groups = ["dev"] files = [ {file = "pylint-3.3.7-py3-none-any.whl", hash = "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d"}, {file = "pylint-3.3.7.tar.gz", hash = "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559"}, @@ -2498,10 +2681,7 @@ files = [ [package.dependencies] astroid = ">=3.3.8,<=3.4.0.dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = [ - {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, - {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, -] +dill = {version = ">=0.3.7", markers = "python_version >= \"3.12\""} isort = ">=4.2.5,<5.13 || >5.13,<7" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2" @@ -2511,13 +2691,55 @@ tomlkit = ">=0.10.1" spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] +[[package]] +name = "pyrsistent" +version = "0.20.0" +description = "Persistent/Functional/Immutable data structures" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, + {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, + {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, + {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, + {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, + {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, + {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, +] + [[package]] name = "pytest" version = "7.4.4" description = "pytest: simple powerful testing with Python" -category = "main" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -2536,9 +2758,9 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, @@ -2555,9 +2777,9 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-xdist" version = "3.7.0" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pytest_xdist-3.7.0-py3-none-any.whl", hash = "sha256:7d3fbd255998265052435eb9daa4e99b62e6fb9cfb6efd1f858d4d8c0c7f0ca0"}, {file = "pytest_xdist-3.7.0.tar.gz", hash = "sha256:f9248c99a7c15b7d2f90715df93610353a485827bc06eefb6566d23f6400f126"}, @@ -2576,9 +2798,9 @@ testing = ["filelock"] name = "python-baseconv" version = "1.2.2" description = "Convert numbers from base 10 integers to base X strings and back again." -category = "main" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "python-baseconv-1.2.2.tar.gz", hash = "sha256:0539f8bd0464013b05ad62e0a1673f0ac9086c76b43ebf9f833053527cd9931b"}, ] @@ -2587,9 +2809,9 @@ files = [ name = "pyunormalize" version = "16.0.0" description = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent of the Python core Unicode database." -category = "main" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "pyunormalize-16.0.0-py3-none-any.whl", hash = "sha256:c647d95e5d1e2ea9a2f448d1d95d8518348df24eab5c3fd32d2b5c3300a49152"}, {file = "pyunormalize-16.0.0.tar.gz", hash = "sha256:2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7"}, @@ -2599,9 +2821,10 @@ files = [ name = "pywin32" version = "310" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Windows\"" files = [ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, @@ -2625,9 +2848,9 @@ files = [ name = "pyyaml" version = "6.0.2" description = "YAML parser and emitter for Python" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -2688,9 +2911,9 @@ files = [ name = "regex" version = "2024.11.6" description = "Alternative regular expression module, to replace re." -category = "main" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -2792,9 +3015,9 @@ files = [ name = "requests" version = "2.32.3" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -2814,9 +3037,9 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "responses" version = "0.25.7" description = "A utility library for mocking out the `requests` Python library." -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "responses-0.25.7-py3-none-any.whl", hash = "sha256:92ca17416c90fe6b35921f52179bff29332076bb32694c0df02dcac2c6bc043c"}, {file = "responses-0.25.7.tar.gz", hash = "sha256:8ebae11405d7a5df79ab6fd54277f6f2bc29b2d002d0dd2d5c632594d1ddcedb"}, @@ -2828,15 +3051,15 @@ requests = ">=2.30.0,<3.0" urllib3 = ">=1.25.10,<3.0" [package.extras] -tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-PyYAML", "types-requests"] +tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli ; python_version < \"3.11\"", "tomli-w", "types-PyYAML", "types-requests"] [[package]] name = "rlp" version = "4.1.0" description = "rlp: A package for Recursive Length Prefix encoding and decoding" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main", "dev"] files = [ {file = "rlp-4.1.0-py3-none-any.whl", hash = "sha256:8eca394c579bad34ee0b937aecb96a57052ff3716e19c7a578883e767bc5da6f"}, {file = "rlp-4.1.0.tar.gz", hash = "sha256:be07564270a96f3e225e2c107db263de96b5bc1f27722d2855bd3459a08e95a9"}, @@ -2855,25 +3078,25 @@ test = ["hypothesis (>=6.22.0,<6.108.7)", "pytest (>=7.0.0)", "pytest-xdist (>=2 name = "semantic-version" version = "2.10.0" description = "A library implementing the 'SemVer' scheme." -category = "dev" optional = false python-versions = ">=2.7" +groups = ["dev"] files = [ {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"}, {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"}, ] [package.extras] -dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"] +dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1) ; python_version == \"3.4\"", "coverage", "flake8", "nose2", "readme-renderer (<25.0) ; python_version == \"3.4\"", "tox", "wheel", "zest.releaser[recommended]"] doc = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "six" version = "1.17.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -2883,21 +3106,44 @@ files = [ name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "dev" optional = false python-versions = "*" +groups = ["main", "dev"] files = [ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] +[[package]] +name = "ssz" +version = "0.5.2" +description = "ssz: Python implementation of the Simple Serialization encoding and decoding" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "ssz-0.5.2-py3-none-any.whl", hash = "sha256:089df4e02d03f74cbac7675c83afe15295bea3ff07a4d158ac5dec8e21386c28"}, + {file = "ssz-0.5.2.tar.gz", hash = "sha256:ab0bab2bc391610f2e49083cc74fb01974e044d9389f31f65344f17a4476cd53"}, +] + +[package.dependencies] +eth-utils = ">=2" +lru-dict = ">=1.1.6" +pyrsistent = ">=0.16.0" + +[package.extras] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "hypothesis (>=6.22.0,<6.108.7)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "ruamel.yaml (>=0.17.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["hypothesis (>=6.22.0,<6.108.7)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] +yaml = ["ruamel.yaml (>=0.17.0)"] + [[package]] name = "stack-data" version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -2915,9 +3161,9 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "timeout-decorator" version = "0.5.0" description = "Timeout decorator" -category = "main" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "timeout-decorator-0.5.0.tar.gz", hash = "sha256:6a2f2f58db1c5b24a2cc79de6345760377ad8bdc13813f5265f6c3e63d16b3d7"}, ] @@ -2926,9 +3172,9 @@ files = [ name = "tomlkit" version = "0.13.3" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, @@ -2938,9 +3184,10 @@ files = [ name = "toolz" version = "1.0.0" description = "List processing tools and functional utilities" -category = "main" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] +markers = "implementation_name == \"pypy\" or implementation_name == \"cpython\"" files = [ {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, @@ -2950,9 +3197,9 @@ files = [ name = "traitlets" version = "5.14.3" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -2962,13 +3209,37 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] +[[package]] +name = "trie" +version = "3.1.0" +description = "Python implementation of the Ethereum Trie structure" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "trie-3.1.0-py3-none-any.whl", hash = "sha256:dfc3e6ac0e76f0efa900ec1bfd082f0f1ba87f95cbfd81cc12338b03f4c679c4"}, + {file = "trie-3.1.0.tar.gz", hash = "sha256:b31fd3376d6dccfe8ad13b525e233f2c268d5c48afb90a4de09672423d4b1026"}, +] + +[package.dependencies] +eth-hash = ">=0.1.0" +eth-utils = ">=2.0.0" +hexbytes = ">=0.2.3" +rlp = ">=3" +sortedcontainers = ">=2.1.0" + +[package.extras] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash (>=0.1.0,<1.0.0)", "hypothesis (>=6.56.4,<7)", "ipython", "pre-commit (>=3.4.0)", "pycryptodome", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["towncrier (>=24,<25)"] +test = ["hypothesis (>=6.56.4,<7)", "pycryptodome", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + [[package]] name = "types-requests" version = "2.32.0.20250602" description = "Typing stubs for requests" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "types_requests-2.32.0.20250602-py3-none-any.whl", hash = "sha256:f4f335f87779b47ce10b8b8597b409130299f6971ead27fead4fe7ba6ea3e726"}, {file = "types_requests-2.32.0.20250602.tar.gz", hash = "sha256:ee603aeefec42051195ae62ca7667cd909a2f8128fdf8aad9e8a5219ecfab3bf"}, @@ -2981,9 +3252,9 @@ urllib3 = ">=2" name = "types-setuptools" version = "67.8.0.0" description = "Typing stubs for setuptools" -category = "dev" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "types-setuptools-67.8.0.0.tar.gz", hash = "sha256:95c9ed61871d6c0e258433373a4e1753c0a7c3627a46f4d4058c7b5a08ab844f"}, {file = "types_setuptools-67.8.0.0-py3-none-any.whl", hash = "sha256:6df73340d96b238a4188b7b7668814b37e8018168aef1eef94a3b1872e3f60ff"}, @@ -2993,9 +3264,9 @@ files = [ name = "types-urllib3" version = "1.26.25.14" description = "Typing stubs for urllib3" -category = "dev" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -3005,9 +3276,9 @@ files = [ name = "typing-extensions" version = "4.14.0" description = "Backported and Experimental Type Hints for Python 3.9+" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af"}, {file = "typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4"}, @@ -3017,9 +3288,9 @@ files = [ name = "typing-inspection" version = "0.4.1" description = "Runtime typing introspection tools" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, @@ -3032,9 +3303,9 @@ typing-extensions = ">=4.12.0" name = "tzdata" version = "2025.2" description = "Provider of IANA time zone data" -category = "dev" optional = false python-versions = ">=2" +groups = ["dev"] files = [ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, @@ -3044,16 +3315,16 @@ files = [ name = "urllib3" version = "2.4.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -3062,9 +3333,9 @@ zstd = ["zstandard (>=0.18.0)"] name = "varint" version = "1.0.2" description = "Simple python varint implementation" -category = "main" optional = false python-versions = "*" +groups = ["main", "dev"] files = [ {file = "varint-1.0.2.tar.gz", hash = "sha256:a6ecc02377ac5ee9d65a6a8ad45c9ff1dac8ccee19400a5950fb51d594214ca5"}, ] @@ -3073,9 +3344,9 @@ files = [ name = "virtualenv" version = "20.31.2" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11"}, {file = "virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af"}, @@ -3088,15 +3359,15 @@ platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wcwidth" version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -3106,9 +3377,9 @@ files = [ name = "web3" version = "7.12.0" description = "web3: A Python library for interacting with Ethereum" -category = "main" optional = false python-versions = "<4,>=3.8" +groups = ["main"] files = [ {file = "web3-7.12.0-py3-none-any.whl", hash = "sha256:c7e2b9c1db5a379ef53b45fe8a19bdc2d47ad262039fbf6675794bc40f74bf06"}, {file = "web3-7.12.0.tar.gz", hash = "sha256:08fbe79a2e2503c9820132ebad24ba0372831588cabac5f467999c97ace7dda3"}, @@ -3140,9 +3411,9 @@ tester = ["eth-tester[py-evm] (>=0.13.0b1,<0.14.0b1)", "py-geth (>=5.1.0)"] name = "web3-multi-provider" version = "2.2.1" description = "Web3py provider that makes it easy to switch between different blockchain nodes to make sure application will be be online if main blockchain node will be unavailable." -category = "main" optional = false python-versions = "<4,>=3.12" +groups = ["main"] files = [ {file = "web3_multi_provider-2.2.1-py3-none-any.whl", hash = "sha256:7c9096a52ff7fc331546367656e351f75b9ba79f1013d9205412557bde98024e"}, {file = "web3_multi_provider-2.2.1.tar.gz", hash = "sha256:ba6c68db3a2832c443e81d3cf620c9bf89039d810934f5a1085719a2629a1f0d"}, @@ -3159,9 +3430,9 @@ metrics = ["prometheus-client (>=0.21.1,<0.22.0)"] name = "websockets" version = "15.0.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"}, {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205"}, @@ -3238,9 +3509,9 @@ files = [ name = "yarl" version = "1.20.0" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "yarl-1.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f1f6670b9ae3daedb325fa55fbe31c22c8228f6e0b513772c2e1c623caa6ab22"}, {file = "yarl-1.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85a231fa250dfa3308f3c7896cc007a47bc76e9e8e8595c20b7426cac4884c62"}, @@ -3354,6 +3625,6 @@ multidict = ">=4.0" propcache = ">=0.2.1" [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.12" -content-hash = "64f864ebb5829acdcae25318b0a5d03217ba50234ae48019e00f037b08fb26af" +content-hash = "583459e9cf8a0b59797a3c97a17de194d8a5a554a99569aab457d0f00fc23211" diff --git a/pyproject.toml b/pyproject.toml index c97138c05..7c58160bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,9 @@ web3-multi-provider = { version = "^2.2.1", extras = ["metrics"] } json-stream = "^2.3.2" oz-merkle-tree = { git = "https://github.com/lidofinance/oz-merkle-tree" } py-multiformats-cid = "^0.4.4" +ssz = "^0.5.2" +py-ecc = "^8.0.0" +py-evm = "^0.12.1b1" [tool.poetry.group.dev.dependencies] base58 = "^2.1.1" diff --git a/src/constants.py b/src/constants.py index e143cc477..aebd4f99c 100644 --- a/src/constants.py +++ b/src/constants.py @@ -57,3 +57,7 @@ UINT256_MAX = 2**256 - 1 ALLOWED_KAPI_VERSION = Version('1.5.0') + +ONE_DAY_IN_EPOCH = 225 +WITHDRAWAL_EPOCH_LEFT_MARGIN = 36 * ONE_DAY_IN_EPOCH +WITHDRAWAL_EPOCH_RIGHT_MARGIN = 18 * ONE_DAY_IN_EPOCH diff --git a/src/main.py b/src/main.py index 44c39ea5b..4c03523bb 100644 --- a/src/main.py +++ b/src/main.py @@ -10,6 +10,7 @@ from src.metrics.logging import logging from src.metrics.prometheus.basic import BUILD_INFO, ENV_VARIABLES_INFO from src.modules.accounting.accounting import Accounting +from src.modules.accounting.staking_vaults import StakingVaults from src.modules.checks.checks_module import ChecksModule from src.modules.csm.csm import CSOracle from src.modules.ejector.ejector import Ejector @@ -89,6 +90,14 @@ def main(module_name: OracleModule): 'ipfs': lambda: ipfs, # type: ignore[dict-item] }) + web3.staking_vaults = StakingVaults( + web3, cc, ipfs, + web3.lido_contracts.lido, + web3.lido_contracts.vault_hub, + web3.lido_contracts.lazy_oracle, + web3.lido_contracts.oracle_daemon_config, + ) + logger.info({'msg': 'Initialize prometheus metrics.'}) init_metrics() diff --git a/src/modules/accounting/accounting.py b/src/modules/accounting/accounting.py index da1ba7f06..823a034e7 100644 --- a/src/modules/accounting/accounting.py +++ b/src/modules/accounting/accounting.py @@ -9,42 +9,61 @@ from src import variables from src.constants import SHARE_RATE_PRECISION_E27 from src.metrics.prometheus.accounting import ( - ACCOUNTING_IS_BUNKER, ACCOUNTING_CL_BALANCE_GWEI, ACCOUNTING_EL_REWARDS_VAULT_BALANCE_WEI, - ACCOUNTING_WITHDRAWAL_VAULT_BALANCE_WEI + ACCOUNTING_IS_BUNKER, + ACCOUNTING_WITHDRAWAL_VAULT_BALANCE_WEI, ) from src.metrics.prometheus.duration_meter import duration_meter +from src.modules.accounting.events import ( + BurnedSharesOnVaultEvent, + MintedSharesOnVaultEvent, + VaultFeesUpdatedEvent, +) from src.modules.accounting.third_phase.extra_data import ExtraDataService from src.modules.accounting.third_phase.types import ExtraData, FormatList from src.modules.accounting.types import ( - ReportData, - LidoReportRebase, + BLOCKS_PER_YEAR, + AccountingProcessingState, + BunkerMode, GenericExtraData, - WqReport, RebaseReport, - BunkerMode, - FinalizationShareRate, - ValidatorsCount, + ReportData, + ReportResults, + ReportValues, ValidatorsBalance, - AccountingProcessingState, + ValidatorsCount, + VaultsMap, + VaultsReport, + WqReport, +) +from src.modules.submodules.consensus import ( + ConsensusModule, + InitialEpochIsYetToArriveRevert, ) -from src.modules.submodules.consensus import ConsensusModule, InitialEpochIsYetToArriveRevert from src.modules.submodules.oracle_module import BaseModule, ModuleExecuteDelay from src.modules.submodules.types import ZERO_HASH from src.providers.execution.contracts.accounting_oracle import AccountingOracleContract from src.services.bunker import BunkerService from src.services.validator_state import LidoValidatorStateService from src.services.withdrawal import Withdrawal -from src.types import BlockStamp, Gwei, ReferenceBlockStamp, StakingModuleId, NodeOperatorGlobalIndex, FinalizationBatches +from src.types import ( + BlockStamp, + FinalizationBatches, + Gwei, + NodeOperatorGlobalIndex, + ReferenceBlockStamp, + StakingModuleId, +) +from src.utils.apr import calculate_steth_apr from src.utils.cache import global_lru_cache as lru_cache -from src.utils.units import gwei_to_wei from src.variables import ALLOW_REPORTING_IN_BUNKER_MODE from src.web3py.extensions.lido_validators import StakingModule from src.web3py.types import Web3 logger = logging.getLogger(__name__) +TOTAL_BASIS_POINTS = 10_000 class Accounting(BaseModule, ConsensusModule): """ @@ -57,8 +76,8 @@ class Accounting(BaseModule, ConsensusModule): - Send extra data Contains stuck and exited validator's updates count by each node operator. """ - COMPATIBLE_CONTRACT_VERSION = 2 - COMPATIBLE_CONSENSUS_VERSION = 4 + COMPATIBLE_CONTRACT_VERSION = 3 + COMPATIBLE_CONSENSUS_VERSION = 3 def __init__(self, w3: Web3): self.report_contract: AccountingOracleContract = w3.lido_contracts.accounting_oracle @@ -173,6 +192,8 @@ def _calculate_report(self, blockstamp: ReferenceBlockStamp): modules_part = self._get_newly_exited_validators_by_modules(blockstamp) wq_part = self._calculate_wq_report(blockstamp) + vaults_part = self._handle_vaults_report(blockstamp) + extra_data_part = self._calculate_extra_data_report(blockstamp) report_data = self._combine_report_parts( consensus_version, @@ -180,6 +201,7 @@ def _calculate_report(self, blockstamp: ReferenceBlockStamp): rebase_part, modules_part, wq_part, + vaults_part, extra_data_part, ) self._update_metrics(report_data) @@ -221,10 +243,12 @@ def _get_consensus_lido_state(self, blockstamp: ReferenceBlockStamp) -> tuple[Va logger.info({'msg': 'Calculate Lido validators count', 'value': len(lido_validators)}) total_lido_balance = lido_validators_state_balance = sum((validator.balance for validator in lido_validators), Gwei(0)) - logger.info({'msg': 'Calculate Lido validators state balance (in Gwei)', 'value': lido_validators_state_balance}) + logger.info( + {'msg': 'Calculate Lido validators state balance (in Gwei)', 'value': lido_validators_state_balance}) + return ValidatorsCount(len(lido_validators)), ValidatorsBalance(Gwei(total_lido_balance)) - def _get_finalization_data(self, blockstamp: ReferenceBlockStamp) -> tuple[FinalizationShareRate, FinalizationBatches]: + def _get_finalization_batches(self, blockstamp: ReferenceBlockStamp) -> FinalizationBatches: simulation = self.simulate_full_rebase(blockstamp) chain_config = self.get_chain_config(blockstamp) frame_config = self.get_frame_config(blockstamp) @@ -242,22 +266,22 @@ def _get_finalization_data(self, blockstamp: ReferenceBlockStamp) -> tuple[Final is_bunker, share_rate, simulation.withdrawals, - simulation.el_reward, + simulation.el_rewards, ) logger.info({'msg': 'Calculate last withdrawal id to finalize.', 'value': batches}) - return FinalizationShareRate(share_rate), batches + return batches @lru_cache(maxsize=1) - def simulate_cl_rebase(self, blockstamp: ReferenceBlockStamp) -> LidoReportRebase: + def simulate_cl_rebase(self, blockstamp: ReferenceBlockStamp) -> ReportResults: """ Simulate rebase excluding any execution rewards. This used to check worst scenarios in bunker service. """ return self.simulate_rebase_after_report(blockstamp, el_rewards=Wei(0)) - def simulate_full_rebase(self, blockstamp: ReferenceBlockStamp) -> LidoReportRebase: + def simulate_full_rebase(self, blockstamp: ReferenceBlockStamp) -> ReportResults: el_rewards = self.w3.lido_contracts.get_el_vault_balance(blockstamp) return self.simulate_rebase_after_report(blockstamp, el_rewards=el_rewards) @@ -265,29 +289,35 @@ def simulate_rebase_after_report( self, blockstamp: ReferenceBlockStamp, el_rewards: Wei, - ) -> LidoReportRebase: + ) -> ReportResults: """ To calculate how much withdrawal request protocol can finalize - needs finalization share rate after this report """ validators_count, cl_balance = self._get_consensus_lido_state(blockstamp) - chain_conf = self.get_chain_config(blockstamp) - return self.w3.lido_contracts.lido.handle_oracle_report( - # Lido contract has sanity check that timestamp is not in the future. + withdrawal_share_rate = 0 # For initial calculation we assume 0 share rate + withdrawal_finalization_batches: list[int] = [] # For initial calculation we assume no withdrawals + + report = ReportValues( + # Accounting contract has sanity check that timestamp is not in the future. # That's why we get revert if timestamp in args > call block timestamp. # In normal case, we call handleOracleReport with timestamp == call block timestamp. - blockstamp.block_timestamp, # _reportTimestamp - self._get_slots_elapsed_from_last_report(blockstamp) * chain_conf.seconds_per_slot, # _timeElapsed + blockstamp.block_timestamp, # timestamp + self._get_slots_elapsed_from_last_report(blockstamp) * chain_conf.seconds_per_slot, # timeElapsed # CL values - validators_count, # _clValidators - gwei_to_wei(cl_balance), # _clBalance + validators_count, # cl_validators + Web3.to_wei(cl_balance, 'gwei'), # cl_balance # EL values - self.w3.lido_contracts.get_withdrawal_balance(blockstamp), # _withdrawalVaultBalance - el_rewards, # _elRewardsVaultBalance - self.get_shares_to_burn(blockstamp), # _sharesRequestedToBurn - self.w3.lido_contracts.accounting_oracle.address, - blockstamp.ref_slot, + self.w3.lido_contracts.get_withdrawal_balance(blockstamp), # withdrawal_vault_balance + el_rewards, # el_rewards_vault_balance + self.get_shares_to_burn(blockstamp), # shares_requested_to_burn + withdrawal_finalization_batches, + ) + + return self.w3.lido_contracts.accounting.simulate_oracle_report( + report, + withdrawal_share_rate, blockstamp.block_hash, ) @@ -295,7 +325,7 @@ def get_shares_to_burn(self, blockstamp: ReferenceBlockStamp) -> int: shares_data = self.w3.lido_contracts.burner.get_shares_requested_to_burn(blockstamp.block_hash) return shares_data.cover_shares + shares_data.non_cover_shares - def _get_slots_elapsed_from_last_report(self, blockstamp: ReferenceBlockStamp): + def _get_slots_elapsed_from_last_report(self, blockstamp: ReferenceBlockStamp) -> int: chain_conf = self.get_chain_config(blockstamp) frame_config = self.get_frame_config(blockstamp) @@ -347,13 +377,46 @@ def _calculate_rebase_report(self, blockstamp: ReferenceBlockStamp) -> RebaseRep withdrawal_vault_balance = self.w3.lido_contracts.get_withdrawal_balance(blockstamp) el_rewards_vault_balance = self.w3.lido_contracts.get_el_vault_balance(blockstamp) shares_requested_to_burn = self.get_shares_to_burn(blockstamp) - return validators_count, cl_balance, withdrawal_vault_balance, el_rewards_vault_balance, shares_requested_to_burn + return ( + validators_count, + cl_balance, + withdrawal_vault_balance, + el_rewards_vault_balance, + shares_requested_to_burn, + ) - # calculates is_bunker, finalization_share_rate, finalization_batches + # calculates is_bunker, finalization_batches def _calculate_wq_report(self, blockstamp: ReferenceBlockStamp) -> WqReport: is_bunker = self._is_bunker(blockstamp) - finalization_share_rate, finalization_batches = self._get_finalization_data(blockstamp) - return is_bunker, finalization_share_rate, finalization_batches + finalization_batches = self._get_finalization_batches(blockstamp) + return is_bunker, finalization_batches + + # fetches vaults_values, vaults_net_cash_flows from the contract and beacon chain + # uploads tree's root, vaults' proofs + def _handle_vaults_report(self, blockstamp: ReferenceBlockStamp) -> VaultsReport: + vaults = self.w3.staking_vaults.get_vaults(blockstamp.block_number) + if len(vaults) == 0: + return bytes(0), '' + + validators = self.w3.cc.get_validators(blockstamp) + pending_deposits = self.w3.cc.get_pending_deposits(blockstamp) + chain_config = self.get_chain_config(blockstamp) + vaults_total_values = self.w3.staking_vaults.get_vaults_total_values(vaults, validators, pending_deposits) + vaults_fees = self._get_vaults_fees(blockstamp, vaults, vaults_total_values) + vaults_slashing_reserve = self.w3.staking_vaults.get_vaults_slashing_reserve(blockstamp, vaults, validators, chain_config) + tree_data = self.w3.staking_vaults.build_tree_data(vaults, vaults_total_values, vaults_fees, vaults_slashing_reserve) + + merkle_tree = self.w3.staking_vaults.get_merkle_tree(tree_data) + # proof_cid = self.w3.staking_vaults.publish_proofs(merkle_tree, blockstamp, vaults) + # logger.info({'msg': "Vault's proof ipfs", 'ipfs': str(proof_cid)}) + + prev_report_cid = self.w3.staking_vaults.get_prev_cid(blockstamp) + tree_cid = self.w3.staking_vaults.publish_tree( + merkle_tree, vaults, blockstamp, prev_report_cid, chain_config + ) + logger.info({'msg': "Tree's proof ipfs", 'ipfs': str(tree_cid), 'treeHex': f"0x{merkle_tree.root.hex()}"}) + + return merkle_tree.root, str(tree_cid) def _calculate_extra_data_report(self, blockstamp: ReferenceBlockStamp) -> ExtraData: exited_validators, orl = self._get_generic_extra_data(blockstamp) @@ -377,11 +440,16 @@ def _combine_report_parts( report_rebase_part: RebaseReport, report_modules_part: tuple[list[StakingModuleId], list[int]], report_wq_part: WqReport, - extra_data: ExtraData + report_vaults_part: VaultsReport, + extra_data: ExtraData, ) -> ReportData: - validators_count, cl_balance, withdrawal_vault_balance, el_rewards_vault_balance, shares_requested_to_burn = report_rebase_part + validators_count, cl_balance, withdrawal_vault_balance, el_rewards_vault_balance, shares_requested_to_burn = ( + report_rebase_part + ) staking_module_ids_list, exit_validators_count_list = report_modules_part - is_bunker, finalization_share_rate, finalization_batches = report_wq_part + is_bunker, finalization_batches = report_wq_part + tree_root, tree_cid = report_vaults_part + return ReportData( consensus_version=consensus_version, ref_slot=blockstamp.ref_slot, @@ -393,9 +461,154 @@ def _combine_report_parts( el_rewards_vault_balance=el_rewards_vault_balance, shares_requested_to_burn=shares_requested_to_burn, withdrawal_finalization_batches=finalization_batches, - finalization_share_rate=finalization_share_rate, is_bunker=is_bunker, + tree_root=tree_root, + tree_cid=tree_cid, extra_data_format=extra_data.format, extra_data_hash=extra_data.data_hash, extra_data_items_count=extra_data.items_count, ) + + @staticmethod + def _get_ether_by_shares(shares: int, pre_total_ether: int, pre_total_shares: int) -> float: + return (shares * pre_total_ether) / pre_total_shares + + # pylint: disable=too-many-branches,too-many-statements + def _get_vaults_fees(self, blockstamp: ReferenceBlockStamp, vaults: VaultsMap, vaults_total_values: list[int]) -> list[int]: + prev_report = self.w3.staking_vaults.get_prev_report(blockstamp) + ## When we do not have a report - then we do not have starting point for calculation + if prev_report is None: + rebased_event = self.w3.lido_contracts.lido.get_last_token_rebased_event(blockstamp.block_number - 7200, blockstamp.block_number) + if rebased_event is None: + # This case for testnet when protocol is deployed but no events + # So it's impossible to take line for calculations + # we need submit empty report before + return [] + prev_block_number = rebased_event.block_number + else: + prev_block_number = prev_report.block_number + + + simulation = self.simulate_full_rebase(blockstamp) + modules_fee, treasury_fee, base_precision = self.w3.lido_contracts.staking_router.get_staking_fee_aggregate_distribution(blockstamp.block_hash) + lido_fee_bp = ((modules_fee + treasury_fee) / base_precision) * TOTAL_BASIS_POINTS + + if lido_fee_bp >= 10_000: + raise ValueError(f"Got incorrect lido_fee_bp: {lido_fee_bp} >= 10_000 bp") + + chain_conf = self.get_chain_config(blockstamp) + slots_elapsed = self._get_slots_elapsed_from_last_report(blockstamp) + time_elapsed = slots_elapsed * chain_conf.seconds_per_slot + + core_apr_ratio: float = 0.0 + if lido_fee_bp != 0: + steth_apr_ratio = calculate_steth_apr( + simulation.pre_total_shares, + simulation.pre_total_pooled_ether, + simulation.post_total_shares, + simulation.post_total_pooled_ether, + time_elapsed, + ) + core_apr_ratio = steth_apr_ratio * TOTAL_BASIS_POINTS / (TOTAL_BASIS_POINTS - lido_fee_bp) + + vaults_on_prev_report = self.w3.staking_vaults.get_vaults(prev_block_number) + + fees_updated_events = self.w3.lido_contracts.vault_hub.get_vaults_fee_updated_events(prev_block_number, blockstamp.block_number) + minted_events = self.w3.lido_contracts.vault_hub.get_minted_events(prev_block_number, blockstamp.block_number) + burn_events = self.w3.lido_contracts.vault_hub.get_burned_events(prev_block_number, blockstamp.block_number) + + events = defaultdict(list) + prev_fee = defaultdict(int) + + if prev_report is not None: + for vault in prev_report.values: + prev_fee[vault.vault_address] = vault.fee + + for event in fees_updated_events: + events[event.vault].append(event) + + for event in minted_events: + events[event.vault].append(event) + + for event in burn_events: + events[event.vault].append(event) + + # Sort list of events by block_number in descending order + for vault_address in events: + events[vault_address].sort(key=lambda x: x.block_number, reverse=True) + + out = [0] * len(vaults) + for vault_address, vault_info in vaults.items(): + liability_shares = vault_info.liability_shares + current_block = int(blockstamp.block_number) + blocks_elapsed = current_block - prev_block_number + + vault_liquidity_fee: float = 0 + liquidity_fee = vault_info.liquidity_feeBP + + # Infrastructure fee = Total_value * Lido_Core_APR * Infrastructure_fee_rate + vault_infrastructure_fee = ( + vaults_total_values[vault_info.id()] + * blocks_elapsed + * core_apr_ratio + * vault_info.infra_feeBP / (BLOCKS_PER_YEAR * TOTAL_BASIS_POINTS) + ) + + # Mintable_stETH * Lido_Core_APR * Reservation_liquidity_fee_rate + vault_reservation_liquidity_fee = ( + vault_info.mintable_capacity_StETH + * blocks_elapsed + * core_apr_ratio + * vault_info.reservation_feeBP / (BLOCKS_PER_YEAR * TOTAL_BASIS_POINTS) + ) + + # Liquidity fee = Minted_stETH * Lido_Core_APR * Liquidity_fee_rate + # NB: below we determine liquidity fee for the vault as a bunch of intervals between minting, burning and + # fee change events. + + # In case of no events, we just use `liability_shares` to calculate minted stETH. + if vault_address not in events: + # TODO: DRY with the next block + minted_steth = self._get_ether_by_shares(liability_shares, simulation.pre_total_pooled_ether, simulation.pre_total_shares) + vault_liquidity_fee = ( + minted_steth + * blocks_elapsed + * core_apr_ratio + * liquidity_fee / (BLOCKS_PER_YEAR * TOTAL_BASIS_POINTS) + ) + + # In case of events, we iterate through them backwards, calculating liquidity fee for each interval based + # on the `liability_shares` and the elapsed blocks between events. + for event in events[vault_address]: + blocks_elapsed_between_events = current_block - event.block_number + minted_steth_on_event = self._get_ether_by_shares(liability_shares, simulation.pre_total_pooled_ether, simulation.pre_total_shares) + vault_liquidity_fee += ( + minted_steth_on_event + * blocks_elapsed_between_events + * core_apr_ratio + * liquidity_fee / (BLOCKS_PER_YEAR * TOTAL_BASIS_POINTS) + ) + + if isinstance(event, VaultFeesUpdatedEvent): + liquidity_fee = event.prev_liquidity_fee_bp + current_block = event.block_number + continue + if isinstance(event, BurnedSharesOnVaultEvent): + liability_shares += event.amount_of_shares + current_block = event.block_number + continue + if isinstance(event, MintedSharesOnVaultEvent): + liability_shares -= event.amount_of_shares + current_block = event.block_number + + if vaults_on_prev_report.get(vault_address) is not None: + if vaults_on_prev_report[vault_address].liability_shares != liability_shares: + raise ValueError(f"Wrong liability shares by vault {vault_address}") + else: + if liability_shares != 0: + raise ValueError(f"Wrong liability shares by vault {vault_address}") + + vault_total_fees_for_period = vault_infrastructure_fee + vault_reservation_liquidity_fee + vault_liquidity_fee + out[vault_info.id()] = int(prev_fee[vault_address]) + int(vault_total_fees_for_period) + + return out diff --git a/src/modules/accounting/events.py b/src/modules/accounting/events.py new file mode 100644 index 000000000..194470dd6 --- /dev/null +++ b/src/modules/accounting/events.py @@ -0,0 +1,128 @@ +from dataclasses import dataclass +from hexbytes import HexBytes + +@dataclass +class TokenRebasedEvent: + report_timestamp: int + time_elapsed: int + pre_total_shares: int + pre_total_ether: int + post_total_shares: int + post_total_ether: int + shares_minted_as_fees: int + event: str + log_index: int + transaction_index: int + transaction_hash: HexBytes + address: str + block_hash: HexBytes + block_number: int + + @classmethod + def from_log(cls, log: dict) -> "TokenRebasedEvent": + args = log["args"] + return cls( + report_timestamp=args["reportTimestamp"], + time_elapsed=args["timeElapsed"], + pre_total_shares=args["preTotalShares"], + pre_total_ether=args["preTotalEther"], + post_total_shares=args["postTotalShares"], + post_total_ether=args["postTotalEther"], + shares_minted_as_fees=args["sharesMintedAsFees"], + event=log["event"], + log_index=log["logIndex"], + transaction_index=log["transactionIndex"], + transaction_hash=log["transactionHash"], + address=log["address"], + block_hash=log["blockHash"], + block_number=log["blockNumber"], + ) + +@dataclass +class MintedSharesOnVaultEvent: + vault: str + amount_of_shares: int + locked_amount: int + event: str + log_index: int + transaction_index: int + transaction_hash: HexBytes + address: str + block_hash: HexBytes + block_number: int + + @classmethod + def from_log(cls, log: dict) -> "MintedSharesOnVaultEvent": + args = log["args"] + return cls( + vault=args["vault"], + amount_of_shares=args["amountOfShares"], + locked_amount=args["lockedAmount"], + event=log["event"], + log_index=log["logIndex"], + transaction_index=log["transactionIndex"], + transaction_hash=log["transactionHash"], + address=log["address"], + block_hash=log["blockHash"], + block_number=log["blockNumber"], + ) + +@dataclass +class BurnedSharesOnVaultEvent: + vault: str + amount_of_shares: int + event: str + log_index: int + transaction_index: int + transaction_hash: HexBytes + address: str + block_hash: HexBytes + block_number: int + + @classmethod + def from_log(cls, log: dict) -> "BurnedSharesOnVaultEvent": + args = log["args"] + return cls( + vault=args["vault"], + amount_of_shares=args["amountOfShares"], + event=log["event"], + log_index=log["logIndex"], + transaction_index=log["transactionIndex"], + transaction_hash=log["transactionHash"], + address=log["address"], + block_hash=log["blockHash"], + block_number=log["blockNumber"], + ) + +@dataclass +class VaultFeesUpdatedEvent: + vault: str + infra_fee_bp: int + prev_liquidity_fee_bp: int + liquidity_fee_bp: int + reservation_fee_bp: int + event: str + log_index: int + transaction_index: int + transaction_hash: HexBytes + address: str + block_hash: HexBytes + block_number: int + + @classmethod + def from_log(cls, log: dict) -> "VaultFeesUpdatedEvent": + args = log["args"] + return cls( + vault=args["vault"], + infra_fee_bp=args["infraFeeBP"], + prev_liquidity_fee_bp=args["preLiquidityFeeBP"], + liquidity_fee_bp=args["liquidityFeeBP"], + reservation_fee_bp=args["reservationFeeBP"], + event=log["event"], + log_index=log["logIndex"], + transaction_index=log["transactionIndex"], + transaction_hash=log["transactionHash"], + address=log["address"], + block_hash=log["blockHash"], + block_number=log["blockNumber"], + ) diff --git a/src/modules/accounting/staking_vaults.py b/src/modules/accounting/staking_vaults.py new file mode 100644 index 000000000..6c49abfaf --- /dev/null +++ b/src/modules/accounting/staking_vaults.py @@ -0,0 +1,449 @@ +import json +import logging +from collections import defaultdict +from dataclasses import asdict +from typing import Any, Dict, Optional + +from oz_merkle_tree import StandardMerkleTree +from web3 import Web3 +from web3.module import Module +from web3.types import Wei + +from src.constants import WITHDRAWAL_EPOCH_LEFT_MARGIN, WITHDRAWAL_EPOCH_RIGHT_MARGIN +from src.modules.accounting.types import ( + MerkleTreeData, + MerkleValue, + VaultInfo, + VaultProof, + VaultsMap, + VaultToPendingDeposits, + VaultToValidators, + VaultTreeNode, +) +from src.modules.submodules.types import ChainConfig +from src.providers.consensus.client import ConsensusClient +from src.providers.consensus.types import PendingDeposit, Validator +from src.providers.execution.contracts.lazy_oracle import LazyOracleContract +from src.providers.execution.contracts.lido import LidoContract +from src.providers.execution.contracts.oracle_daemon_config import ( + OracleDaemonConfigContract, +) +from src.providers.execution.contracts.vault_hub import VaultHubContract +from src.providers.ipfs import CID, MultiIPFSProvider +from src.types import BlockStamp, ReferenceBlockStamp, SlotNumber +from src.utils.deposit_signature import is_valid_deposit_signature +from src.utils.types import hex_str_to_bytes + +logger = logging.getLogger(__name__) + + +class StakingVaults(Module): + w3: Web3 + ipfs_client: MultiIPFSProvider + cl: ConsensusClient + lido: LidoContract + vault_hub: VaultHubContract + lazy_oracle: LazyOracleContract + daemon_config: OracleDaemonConfigContract + + def __init__(self, w3: Web3, cl: ConsensusClient, ipfs: MultiIPFSProvider, lido: LidoContract, vault_hub: VaultHubContract, lazy_oracle: LazyOracleContract, daemon_config: OracleDaemonConfigContract) -> None: + super().__init__(w3) + + self.w3 = w3 + self.ipfs_client = ipfs + self.cl = cl + self.lido = lido + self.vault_hub = vault_hub + self.lazy_oracle = lazy_oracle + self.daemon_config = daemon_config + + def get_vaults(self, block_number: int) -> VaultsMap: + vaults = self.lazy_oracle.get_all_vaults(block_identifier=block_number) + if len(vaults) == 0: + return {} + + out = VaultsMap() + for vault in vaults: + out[vault.vault] = vault + + return out + + def get_vaults_total_values(self + , vaults: VaultsMap + , validators: list[Validator] + , pending_deposits: list[PendingDeposit] + ) -> list[int]: + vaults_validators = StakingVaults._connect_vaults_to_validators(validators, vaults) + vaults_pending_deposits = StakingVaults._connect_vaults_to_pending_deposits(pending_deposits, vaults) + + vaults_total_values = [0] * len(vaults) + + for vault_address, vault in vaults.items(): + vaults_total_values[vault.id()] = vault.balance + vault_validators = vaults_validators.get(vault_address, []) + vault_pending_deposits = vaults_pending_deposits.get(vault_address, []) + + # Add active validators balances + if vault_address in vaults_validators: + vaults_total_values[vault.id()] += self._calculate_vault_validators_balances(vault_validators) + + # Add pending deposits balances + if vault_address in vaults_pending_deposits: + vaults_total_values[vault.id()] += self._calculate_pending_deposits_balances( + validators, + pending_deposits, + vault_validators, + vault_pending_deposits, + vault.withdrawal_credentials, + ) + + logger.info( + { + 'msg': f'Vault values for vault: {vault_address}.', + 'vault_value': vaults_total_values[vault.id()], + } + ) + + return vaults_total_values + + def get_vaults_slashing_reserve(self, bs: ReferenceBlockStamp, vaults: VaultsMap, validators: list[Validator], chain_config: ChainConfig) -> list[int]: + vaults_validators = StakingVaults._connect_vaults_to_validators(validators, vaults) + left_margin, right_margin = WITHDRAWAL_EPOCH_LEFT_MARGIN, 2 * WITHDRAWAL_EPOCH_RIGHT_MARGIN + + vaults_reserves = [0] * len(vaults) + for vault_address, validator_arr in vaults_validators.items(): + vault_id = vaults[vault_address].id() + vaults_reserves[vault_id] = Wei(0) + + for validator in validator_arr: + if validator.validator.slashed: + we = validator.validator.withdrawable_epoch + + if we - left_margin <= bs.ref_epoch <= we + right_margin: + slot_id = self._withdrawable_epoch_to_past_slot(we, WITHDRAWAL_EPOCH_LEFT_MARGIN, chain_config.slots_per_epoch) + validator_state = self.cl.get_validator_state(SlotNumber(slot_id), validator.index) + vaults_reserves[vault_id] += Web3.to_wei(int(validator_state.balance), 'gwei') * vaults[ + vault_address].reserve_ratioBP // 10_000 + + elif bs.ref_epoch < we - left_margin: + vaults_reserves[vault_id] += Web3.to_wei(int(validator.balance), 'gwei') * vaults[ + vault_address].reserve_ratioBP // 10_000 + + return vaults_reserves + + def publish_tree( + self, tree: StandardMerkleTree, vaults: VaultsMap, bs: BlockStamp, prev_tree_cid: str, + chain_config: ChainConfig + ) -> CID: + def encoder(o): + if isinstance(o, bytes): + return f"0x{o.hex()}" + if isinstance(o, CID): + return str(o) + if hasattr(o, "__dataclass_fields__"): + return asdict(o) + raise TypeError(f"Object of type {type(o)} is not JSON serializable") + + def stringify_values(data) -> list[dict[str, Any]]: + out = [] + for item in data: + val = item["value"] + out.append({ + "value": (val[0], str(val[1]), str(val[2]), str(val[3]), str(val[4])), + "treeIndex": item["treeIndex"], + }) + return out + + values = stringify_values(tree.values) + + extra_values = {} + for vault_adr, vault_info in vaults.items(): + extra_values[vault_adr] = { + "inOutDelta": str(vault_info.in_out_delta) + } + + output: dict[str, Any] = { + **dict(tree.dump()), + "merkleTreeRoot": f"0x{tree.root.hex()}", + "refSlot": bs.slot_number, + "blockNumber": bs.block_number, + "timestamp": chain_config.genesis_time + bs.slot_number * chain_config.seconds_per_slot, + "extraValues": extra_values, + "prevTreeCID": prev_tree_cid, + "leafIndexToData": { + "0": "vaultAddress", + "1": "totalValueWei", + "2": "fee", + "3": "liabilityShares", + "4": "slashingReserve", + }, + } + output.update(values=values) + + dumped_tree_str = json.dumps(output, default=encoder) + + cid = self.ipfs_client.publish(dumped_tree_str.encode('utf-8'), 'merkle_tree.json') + + return cid + + def get_prev_report(self, bs: BlockStamp) -> Optional[MerkleTreeData]: + report = self.lazy_oracle.get_report(block_identifier=bs.block_number) + if report is None: + return None + return self.get_vault_report(report.cid) + + def get_prev_cid(self, bs: BlockStamp) -> str: + report = self.lazy_oracle.get_report(block_identifier=bs.block_number) + if report is None: + return "" + return report.cid + + @staticmethod + def get_vault_prev_fees(report_data: MerkleTreeData) -> dict[str, int]: + prev_vault_fees = {} + for merkle_value in report_data.values: + prev_vault_fees[merkle_value.vault_address] = merkle_value.fee + + return prev_vault_fees + + def _calculate_pending_deposits_balances( + self, + validators: list[Validator], + pending_deposits: list[PendingDeposit], + vault_validators: list[Validator], + vault_pending_deposits: list[PendingDeposit], + vault_withdrawal_credentials: str, + ) -> int: + validator_pubkeys = set(validator.validator.pubkey for validator in validators) + vault_validator_pubkeys = set(validator.validator.pubkey for validator in vault_validators) + deposits_by_pubkey: dict[str, list[PendingDeposit]] = defaultdict(list) + + for deposit in vault_pending_deposits: + deposits_by_pubkey[deposit.pubkey].append(deposit) + + total_value = 0 + + for pubkey, deposits in deposits_by_pubkey.items(): + deposit_value = sum(Web3.to_wei(int(deposit.amount), 'gwei') for deposit in deposits) + + # Case 1: Validator exists and is already bound to this vault + if pubkey in vault_validator_pubkeys: + total_value += deposit_value + continue + + # Case 2: Validator exists but not bound to this vault + if pubkey in validator_pubkeys: + validator = next(v for v in validators if v.validator.pubkey == pubkey) + if validator.validator.withdrawal_credentials == vault_withdrawal_credentials: + total_value += deposit_value + else: + logger.warning( + { + 'msg': f'Skipping pending deposits for key {pubkey} because validator is not bound to the vault', + 'validator': validator, + } + ) + continue + + # Case 3: No validator found for this pubkey - validate deposits + deposits_for_pubkey = [d for d in pending_deposits if d.pubkey == pubkey] + valid_deposits = self._filter_valid_deposits(vault_withdrawal_credentials, deposits_for_pubkey) + + if valid_deposits: + valid_value = sum(Web3.to_wei(int(d.amount), 'gwei') for d in valid_deposits) + total_value += valid_value + + return total_value + + @staticmethod + def build_tree_data(vaults: VaultsMap, vaults_values: list[int], vaults_fees: list[int], vaults_slashing_reserve: list[int]) -> list[VaultTreeNode]: + """Build tree data structure from vaults and their values.""" + tree_data: list[VaultTreeNode] = [('', 0, 0, 0, 0) for _ in range(len(vaults))] + + for vault_address, vault in vaults.items(): + vault_fee = 0 + if 0 <= vault.id() < len(vaults_fees): + vault_fee = vaults_fees[vault.id()] + + vault_value = 0 + if 0 <= vault.id() < len(vaults_values): + vault_value = vaults_values[vault.id()] + + vault_slashing_reserve = 0 + if 0 <= vault.id() < len(vaults_slashing_reserve): + vault_slashing_reserve = vaults_slashing_reserve[vault.id()] + + tree_data[vault.id()] = ( + vault_address, + vault_value, + vault_fee, + vault.liability_shares, + vault_slashing_reserve + ) + + return tree_data + + @staticmethod + def _filter_valid_deposits( + vault_withdrawal_credentials: str, + deposits: list[PendingDeposit] + ) -> list[PendingDeposit]: + """ + Validates deposit signatures and returns a list of valid deposits. + Once a valid pending deposit is found, all subsequent deposits are considered valid. + """ + valid_deposits = [] + valid_found = False + + for deposit in deposits: + # If we've already found a valid pending deposit, accept all subsequent ones + if valid_found: + valid_deposits.append(deposit) + continue + + # Verify the deposit signature + is_valid = is_valid_deposit_signature( + pubkey=hex_str_to_bytes(deposit.pubkey), + withdrawal_credentials=hex_str_to_bytes(deposit.withdrawal_credentials), + amount_gwei=deposit.amount, + signature=hex_str_to_bytes(deposit.signature), + ) + + if not is_valid: + logger.warning( + { + 'msg': f'Invalid deposit signature for deposit: {deposit}.', + } + ) + continue + + if deposit.withdrawal_credentials != vault_withdrawal_credentials: + logger.warning( + { + 'msg': f'Invalid withdrawal credentials for proven deposit: {deposit}. Skipping any further pending deposits count.', + } + ) + # In case the first deposit is a VALID, but WC are NOT matching the vault's WC, + # we should return an empty deposit list because it means that all the future deposits + # will be mapped to the wrong WC and will not be under the vault's control + return [] + + # Mark that we found a valid deposit and include it + valid_found = True + valid_deposits.append(deposit) + + return valid_deposits + + @staticmethod + def get_merkle_tree(data: list[VaultTreeNode]) -> StandardMerkleTree: + return StandardMerkleTree(data, ("address", "uint256", "uint256", "uint256", "int256")) + + @staticmethod + def _get_vault_to_proof_map(merkle_tree: StandardMerkleTree, vaults: VaultsMap) -> dict[str, VaultProof]: + result = {} + for v in merkle_tree.values: + vault_address = v["value"][0] + vault_total_value_wei = v["value"][1] + vault_fee = v["value"][2] + vault_liability_shares = v["value"][3] + vault_slashing_reserve = v["value"][4] + + leaf = f"0x{merkle_tree.leaf(v["value"]).hex()}" + proof = [] + for elem in merkle_tree.get_proof(v["treeIndex"]): + proof.append(f"0x{elem.hex()}") + + result[vault_address] = VaultProof( + id=vaults[vault_address].vault_ind, + totalValueWei=str(vault_total_value_wei), + fee=str(vault_fee), + liabilityShares=str(vault_liability_shares), + slashingReserve=str(vault_slashing_reserve), + leaf=leaf, + proof=proof, + inOutDelta=str(vaults[vault_address].in_out_delta) + ) + + return result + + @staticmethod + def _calculate_vault_validators_balances(validators: list[Validator]) -> int: + return sum(Web3.to_wei(int(validator.balance), 'gwei') for validator in validators) + + @staticmethod + def _connect_vaults_to_validators(validators: list[Validator], vault_addresses: VaultsMap) -> VaultToValidators: + wc_vault_map: dict[str, VaultInfo] = { + vault_data.withdrawal_credentials: vault_data for vault_data in vault_addresses.values() + } + + result: VaultToValidators = defaultdict(list) + for validator in validators: + wc = validator.validator.withdrawal_credentials + + if wc in wc_vault_map: + vault = wc_vault_map[validator.validator.withdrawal_credentials] + result[vault.vault].append(validator) + + return result + + @staticmethod + def _connect_vaults_to_pending_deposits( + pending_deposits: list[PendingDeposit], vault_addresses: VaultsMap + ) -> VaultToPendingDeposits: + wc_vault_map: dict[str, VaultInfo] = { + vault_data.withdrawal_credentials: vault_data for vault_data in vault_addresses.values() + } + + result: VaultToPendingDeposits = defaultdict(list) + for deposit in pending_deposits: + wc = deposit.withdrawal_credentials + + if wc in wc_vault_map: + vault = wc_vault_map[deposit.withdrawal_credentials] + result[vault.vault].append(deposit) + + return result + + def get_vault_report(self, tree_cid: str) -> MerkleTreeData: + bb = self.ipfs_client.fetch(CID(tree_cid)) + return self.parse_merkle_tree_data(bb) + + @staticmethod + def parse_merkle_tree_data(raw_bytes: bytes) -> MerkleTreeData: + data = json.loads(raw_bytes.decode("utf-8")) + + index_map: Dict[str, str] = data["leafIndexToData"] + + def decode_value(entry: Dict[str, Any]) -> MerkleValue: + value_list = entry["value"] + value_dict = {index_map[str(i)]: v for i, v in enumerate(value_list)} + return MerkleValue( + vault_address=value_dict["vaultAddress"], + total_value_wei=value_dict["totalValueWei"], + fee=value_dict["fee"], + liability_shares=value_dict["liabilityShares"], + slashing_reserve=value_dict["slashingReserve"], + ) + + decoded_values = [decode_value(entry) for entry in data["values"]] + tree_indices = [entry["treeIndex"] for entry in data["values"]] + + return MerkleTreeData( + format=data["format"], + leaf_encoding=data["leafEncoding"], + tree=data["tree"], + values=decoded_values, + tree_indices=tree_indices, + merkle_tree_root=data["merkleTreeRoot"], + ref_slot=data["refSlot"], + block_number=data["blockNumber"], + timestamp=data["timestamp"], + prev_tree_cid=data["prevTreeCID"], + extra_values=data["extraValues"], + ) + + @staticmethod + def _withdrawable_epoch_to_past_slot(withdrawable_epoch: int, epochs_ago: int, slots_per_epoch: int) -> int: + target_epoch = withdrawable_epoch - epochs_ago + target_slot = target_epoch * slots_per_epoch + return target_slot diff --git a/src/modules/accounting/types.py b/src/modules/accounting/types.py index 6facee665..f21fa4f9c 100644 --- a/src/modules/accounting/types.py +++ b/src/modules/accounting/types.py @@ -1,20 +1,38 @@ from dataclasses import dataclass -from typing import Self, NewType +from typing import List, NewType, Self from eth_typing import ChecksumAddress from hexbytes import HexBytes from web3.types import Wei +from src.providers.consensus.types import PendingDeposit, Validator from src.types import ( - SlotNumber, + ELVaultBalance, + FinalizationBatches, Gwei, + OperatorsValidatorCount, + SlotNumber, StakingModuleId, - FinalizationBatches, - ELVaultBalance, WithdrawalVaultBalance, - OperatorsValidatorCount, ) +BunkerMode = NewType('BunkerMode', bool) +ValidatorsCount = NewType('ValidatorsCount', int) +ValidatorsBalance = NewType('ValidatorsBalance', Gwei) + +type Shares = NewType('Shares', int) +type VaultsTreeRoot = NewType('VaultsTreeRoot', bytes) +type VaultsTreeCid = NewType('VaultsTreeCid', str) +type VaultTreeNode = tuple[str, int, int, int, int] + +SECONDS_IN_YEAR = 365 * 24 * 60 * 60 +BLOCKS_PER_YEAR = 2_628_000 +FinalizationShareRate = NewType('FinalizationShareRate', int) + + +type SharesToBurn = int +type RebaseReport = tuple[ValidatorsCount, ValidatorsBalance, WithdrawalVaultBalance, ELVaultBalance, SharesToBurn] +type WqReport = tuple[BunkerMode, FinalizationBatches] @dataclass class ReportData: @@ -26,10 +44,11 @@ class ReportData: count_exited_validators_by_staking_module: list[int] withdrawal_vault_balance: Wei el_rewards_vault_balance: Wei - shares_requested_to_burn: int + shares_requested_to_burn: Shares withdrawal_finalization_batches: list[int] - finalization_share_rate: int is_bunker: bool + tree_root: VaultsTreeRoot + tree_cid: VaultsTreeCid extra_data_format: int extra_data_hash: bytes extra_data_items_count: int @@ -47,8 +66,9 @@ def as_tuple(self): self.el_rewards_vault_balance, self.shares_requested_to_burn, self.withdrawal_finalization_batches, - self.finalization_share_rate, self.is_bunker, + self.tree_root, + self.tree_cid, self.extra_data_format, self.extra_data_hash, self.extra_data_items_count, @@ -67,13 +87,11 @@ class AccountingProcessingState: extra_data_items_count: int extra_data_items_submitted: int - @dataclass class OracleReportLimits: exited_validators_per_day_limit: int appeared_validators_per_day_limit: int annual_balance_increase_bp_limit: int - simulated_share_rate_deviation_bp_limit: int max_validator_exit_requests_per_report: int max_items_per_extra_data_transaction: int max_node_operators_per_extra_data_item: int @@ -90,14 +108,7 @@ def from_response(cls, **kwargs) -> Self: # Unpack structure by order return cls(*kwargs.values()) # pylint: disable=no-value-for-parameter - -@dataclass(frozen=True) -class LidoReportRebase: - post_total_pooled_ether: int - post_total_shares: int - withdrawals: Wei - el_reward: Wei - +type GenericExtraData = tuple[OperatorsValidatorCount, OracleReportLimits] @dataclass class BatchState: @@ -117,8 +128,8 @@ def as_tuple(self): @dataclass class SharesRequestedToBurn: - cover_shares: int - non_cover_shares: int + cover_shares: Shares + non_cover_shares: Shares @dataclass @@ -130,20 +141,154 @@ class WithdrawalRequestStatus: is_finalized: bool is_claimed: bool - -BunkerMode = NewType('BunkerMode', bool) -FinalizationShareRate = NewType('FinalizationShareRate', int) -ValidatorsCount = NewType('ValidatorsCount', int) -ValidatorsBalance = NewType('ValidatorsBalance', Gwei) - -type SharesToBurn = int -type GenericExtraData = tuple[OperatorsValidatorCount, OracleReportLimits] -type RebaseReport = tuple[ValidatorsCount, ValidatorsBalance, WithdrawalVaultBalance, ELVaultBalance, SharesToBurn] -type WqReport = tuple[BunkerMode, FinalizationShareRate, FinalizationBatches] - - @dataclass class BeaconStat: deposited_validators: int beacon_validators: int beacon_balance: int + + +@dataclass(frozen=True) +class ReportValues: + timestamp: int + time_elapsed: int + cl_validators: int + cl_balance: Wei + withdrawal_vault_balance: Wei + el_rewards_vault_balance: Wei + shares_requested_to_burn: Shares + withdrawal_finalization_batches: List[int] + + +@dataclass(frozen=True) +class StakingRewardsDistribution: + recipients: List[ChecksumAddress] + module_ids: List[int] + modules_fees: List[int] + total_fee: int + precision_points: int + + +@dataclass(frozen=True) +class ReportResults: + withdrawals: Wei + el_rewards: Wei + ether_to_finalize_wq: Wei + shares_to_finalize_wq: Shares + shares_to_burn_for_withdrawals: Shares + total_shares_to_burn: SharesToBurn + shares_to_mint_as_fees: Shares + reward_distribution: StakingRewardsDistribution + principal_cl_balance: Wei + pre_total_shares: Shares + pre_total_pooled_ether: Wei + post_internal_shares: Shares + post_internal_ether: Wei + post_total_shares: Shares + post_total_pooled_ether: Wei + + +@dataclass(frozen=True) +class VaultSocket: + vault: ChecksumAddress + share_limit: Shares + liability_shares: Shares + reserve_ratio_bp: int + rebalance_threshold_bp: int + treasury_fee_bp: int + pending_disconnect: bool + + +@dataclass +class VaultData: + vault_ind: int + balance_wei: Wei + in_out_delta: Wei + liability_shares: Shares + fee: int + address: ChecksumAddress + withdrawal_credentials: str + # Feature smart contract release + share_limit: int + minted_StETH: int + mintable_capacity_StETH: int + reserve_ratioBP: int + forced_rebalance_thresholdBP: int + infra_feeBP: int + liquidity_feeBP: int + reservation_feeBP: int + pending_disconnect: bool + + +@dataclass +class LatestReportData: + timestamp: int + tree_root: VaultsTreeRoot + cid: VaultsTreeCid + +@dataclass +class VaultInfo: + vault: ChecksumAddress + balance: Wei + withdrawal_credentials: str + liability_shares: Shares + # Feature smart contract release + share_limit: int + reserve_ratioBP: int + forced_rebalance_thresholdBP: int + infra_feeBP: int + liquidity_feeBP: int + reservation_feeBP: int + pending_disconnect: bool + mintable_capacity_StETH: int + vault_ind: int + in_out_delta: Wei + + def id(self) -> int: + return self.vault_ind - 1 + +VaultToValidators = dict[ChecksumAddress, list[Validator]] +VaultToPendingDeposits = dict[ChecksumAddress, list[PendingDeposit]] + +VaultsMap = dict[ChecksumAddress, VaultInfo] +VaultTotalValue = int +VaultsTotalValues = list[VaultTotalValue] +type VaultsReport = tuple[VaultsTreeRoot, VaultsTreeCid] +type VaultsData = tuple[list[VaultTreeNode], VaultsMap, VaultsTotalValues] + +@dataclass +class VaultProof: + id: int + totalValueWei: str + fee: str + liabilityShares: str + slashingReserve: str + leaf: str + proof: List[str] + inOutDelta: str + +@dataclass +class MerkleValue: + vault_address: str + total_value_wei: int + fee: int + liability_shares: int + slashing_reserve: int + +@dataclass +class ExtraValue: + inOutDelta: int + +@dataclass +class MerkleTreeData: + format: str + leaf_encoding: List[str] + tree: List[str] + values: List[MerkleValue] + tree_indices: List[int] + merkle_tree_root: str + ref_slot: int + block_number: int + timestamp: int + prev_tree_cid: str + extra_values: dict[str, ExtraValue] diff --git a/src/providers/consensus/client.py b/src/providers/consensus/client.py index 347c3401e..cb052bb02 100644 --- a/src/providers/consensus/client.py +++ b/src/providers/consensus/client.py @@ -19,6 +19,7 @@ SyncAggregate, SyncCommittee, Validator, + PendingDeposit ) from src.providers.http_provider import ( HTTPProvider, @@ -62,6 +63,7 @@ class ConsensusClient(HTTPProvider): API_GET_VALIDATORS = 'eth/v1/beacon/states/{}/validators' API_GET_SPEC = 'eth/v1/config/spec' API_GET_GENESIS = 'eth/v1/beacon/genesis' + API_GET_VALIDATOR = 'eth/v1/beacon/states/{}/validators/{}' def get_config_spec(self) -> BeaconSpecResponse: """Spec: https://ethereum.github.io/beacon-APIs/#/Config/getSpec""" @@ -237,6 +239,20 @@ def get_state_view_no_cache(self, blockstamp: BlockStamp) -> BeaconStateView: return BeaconStateView.from_response(**data) + def get_pending_deposits(self, blockstamp: BlockStamp) -> list[PendingDeposit]: + return self.get_state_view(blockstamp).pending_deposits + + def get_validator_state(self, state_id: SlotNumber | BlockRoot, validator_id: int) -> Validator: + """Spec: https://ethereum.github.io/beacon-APIs/#/Beacon/getStateValidator""" + data, _ = self._get( + self.API_GET_VALIDATOR, + path_params=(state_id, validator_id), + force_raise=self.__raise_last_missed_slot_error, + ) + if not isinstance(data, dict): + raise ValueError("Expected mapping response from getStateValidator") + return Validator.from_response(**data) + def _get_state_by_state_id(self, state_id: StateRoot | SlotNumber) -> dict: data, _ = self._get( self.API_GET_STATE, diff --git a/src/providers/consensus/types.py b/src/providers/consensus/types.py index 5b6fb42ef..23c49cf4e 100644 --- a/src/providers/consensus/types.py +++ b/src/providers/consensus/types.py @@ -163,6 +163,15 @@ class PendingPartialWithdrawal(Nested): withdrawable_epoch: EpochNumber +@dataclass +class PendingDeposit(Nested): + pubkey: str + withdrawal_credentials: str + amount: Gwei + signature: str + slot: SlotNumber + + @dataclass class BeaconStateView(Nested, FromResponse): """ @@ -178,6 +187,7 @@ class BeaconStateView(Nested, FromResponse): # These fields are new in Electra, so here are default values for backward compatibility. exit_balance_to_consume: Gwei = Gwei(0) earliest_exit_epoch: EpochNumber = EpochNumber(0) + pending_deposits: list[PendingDeposit] = field(default_factory=list) pending_partial_withdrawals: list[PendingPartialWithdrawal] = field(default_factory=list) @cached_property diff --git a/src/providers/execution/contracts/accounting.py b/src/providers/execution/contracts/accounting.py new file mode 100644 index 000000000..3d6403c65 --- /dev/null +++ b/src/providers/execution/contracts/accounting.py @@ -0,0 +1,63 @@ +import logging + +from web3.types import BlockIdentifier + +from src.modules.accounting.types import ReportValues, ReportResults +from src.providers.execution.base_interface import ContractInterface + +logger = logging.getLogger(__name__) + + +class AccountingContract(ContractInterface): + abi_path = './assets/Accounting.json' + + def simulate_oracle_report( + self, + payload: ReportValues, + withdrawal_share_rate: int = 0, + block_identifier: BlockIdentifier = 'latest', + ) -> ReportResults: + """ + Simulates the effects of the `handleOracleReport` function without actually updating the contract state. + NB: should be calculated off-chain by calling the simulateOracleReport function with the same arguments as the + handleOracleReport function, while keeping `_withdrawalFinalizationBatches` empty ([]) and `_simulatedShareRate` == 0, + plugging the returned values to the following formula: `_simulatedShareRate = (postTotalPooledEther * 1e27) / postTotalShares` + """ + + report = { + "timestamp": payload.timestamp, + "timeElapsed": payload.time_elapsed, + "clValidators": payload.cl_validators, + "clBalance": payload.cl_balance, + "withdrawalVaultBalance": payload.withdrawal_vault_balance, + "elRewardsVaultBalance": payload.el_rewards_vault_balance, + "sharesRequestedToBurn": payload.shares_requested_to_burn, + "withdrawalFinalizationBatches": payload.withdrawal_finalization_batches, + } + + response = self.functions.simulateOracleReport(report, withdrawal_share_rate).call( + block_identifier=block_identifier + ) + + response = ReportResults(*response) + + logger.info( + { + 'msg': 'Call `simulateOracleReport({}, {}, {}, {}, {}, {}, {}, {}, {})`.'.format( # pylint: disable=consider-using-f-string + payload.timestamp, + payload.time_elapsed, + payload.cl_validators, + payload.cl_balance, + payload.withdrawal_vault_balance, + payload.el_rewards_vault_balance, + payload.shares_requested_to_burn, + payload.withdrawal_finalization_batches, + withdrawal_share_rate, + ), + 'value': str(response), + 'block_identifier': repr(block_identifier), + 'to': self.address, + } + ) + + return response diff --git a/src/providers/execution/contracts/lazy_oracle.py b/src/providers/execution/contracts/lazy_oracle.py new file mode 100644 index 000000000..08316748f --- /dev/null +++ b/src/providers/execution/contracts/lazy_oracle.py @@ -0,0 +1,134 @@ +import logging +from typing import List, Optional + +from web3.exceptions import BadFunctionCallOutput, ContractLogicError +from web3.types import BlockIdentifier, Wei + +from src.modules.accounting.types import VaultSocket, LatestReportData, VaultInfo +from src.providers.execution.base_interface import ContractInterface + +from src.utils.cache import global_lru_cache as lru_cache +from src.utils.types import bytes_to_hex_str + +logger = logging.getLogger(__name__) + + +class LazyOracleContract(ContractInterface): + abi_path = './assets/LazyOracle.json' + + @lru_cache(maxsize=1) + def get_vaults_count(self, block_identifier: BlockIdentifier = 'latest') -> int: + """ + Returns the number of vaults attached to the VaultHub. + """ + response = self.functions.vaultsCount.call(block_identifier=block_identifier) + + logger.info( + { + 'msg': 'Call `vaultsCount().', + 'value': response, + 'block_identifier': repr(block_identifier), + 'to': self.address, + } + ) + + return response + + def get_report(self, block_identifier: BlockIdentifier = 'latest') -> Optional[LatestReportData]: + try: + response = self.functions.latestReportData.call(block_identifier=block_identifier) + + if response.reportCid == '': + logger.error( + { + 'msg': 'No data returned from latestReportData().', + 'block_identifier': repr(block_identifier), + 'to': self.address, + } + ) + return None + + logger.info( + { + 'msg': 'Call `latestReportData()`.', + 'value': response, + 'block_identifier': repr(block_identifier), + 'to': self.address, + } + ) + + return LatestReportData( + response.timestamp, + response.treeRoot, + response.reportCid, + ) + + except (BadFunctionCallOutput, ContractLogicError) as e: + logger.error( + { + 'msg': 'latestReportData() call failed.', + 'error': str(e), + 'block_identifier': repr(block_identifier), + 'to': self.address, + } + ) + return None + + def get_vaults(self, block_identifier: BlockIdentifier = 'latest', offset: int = 0, limit: int = 1_000) -> List[VaultInfo]: + """ + Returns the Vaults + """ + response = self.functions.batchVaultsInfo(offset, limit).call(block_identifier=block_identifier) + + logger.info( + { + 'msg': 'Call `batchVaultsInfo(offset, limit).', + 'value': response, + 'block_identifier': repr(block_identifier), + 'to': self.address, + } + ) + + out: List[VaultInfo] = [] + for vault in response: + out.append(VaultInfo( + vault.vault, + vault.balance, + bytes_to_hex_str(vault.withdrawalCredentials), + vault.liabilityShares, + vault.shareLimit, + vault.reserveRatioBP, + vault.forcedRebalanceThresholdBP, + vault.infraFeeBP, + vault.liquidityFeeBP, + vault.reservationFeeBP, + vault.pendingDisconnect, + vault.mintableStETH, + vault.vaultIndex, + vault.inOutDelta + )) + + return out + + def get_all_vaults(self, block_identifier: BlockIdentifier = 'latest', limit: int = 1_000) -> List[VaultInfo]: + """ + Fetch all vaults using pagination via `get_vaults` in batches of `page_size`. + """ + vaults: List[VaultInfo] = [] + offset = 0 + + total_count = self.get_vaults_count(block_identifier) + if total_count == 0: + return [] + + while offset < total_count: + batch = self.get_vaults(block_identifier=block_identifier, offset=offset, limit=limit) + if not batch: + break + vaults.extend(batch) + offset += limit + + vaults.sort(key=lambda vault: vault.vault_ind) + + return vaults + diff --git a/src/providers/execution/contracts/lido.py b/src/providers/execution/contracts/lido.py index 90bfb569a..0f7f44c68 100644 --- a/src/providers/execution/contracts/lido.py +++ b/src/providers/execution/contracts/lido.py @@ -1,13 +1,11 @@ import logging +from typing import Optional -from eth_typing import ChecksumAddress, HexStr -from web3 import Web3 -from web3.exceptions import Web3RPCError -from web3.types import Wei, BlockIdentifier, StateOverride, StateOverrideParams +from web3.types import Wei, BlockIdentifier -from src.modules.accounting.types import LidoReportRebase, BeaconStat +from src.modules.accounting.events import TokenRebasedEvent +from src.modules.accounting.types import BeaconStat from src.providers.execution.base_interface import ContractInterface -from src.types import SlotNumber from src.utils.abi import named_tuple_to_dataclass from src.utils.cache import global_lru_cache as lru_cache @@ -17,127 +15,6 @@ class LidoContract(ContractInterface): abi_path = './assets/Lido.json' - def handle_oracle_report( - self, - timestamp: int, - time_elapsed: int, - validators_count: int, - cl_balance: Wei, - withdrawal_vault_balance: Wei, - el_rewards: Wei, - shares_to_burn: int, - accounting_oracle_address: ChecksumAddress, - ref_slot: SlotNumber, - block_identifier: BlockIdentifier = 'latest', - ) -> LidoReportRebase: - """ - Updates accounting stats, collects EL rewards and distributes collected rewards - if beacon balance increased, performs withdrawal requests finalization - periodically called by the AccountingOracle contract - - NB: `_simulatedShareRate` should be calculated off-chain by calling the method with `eth_call` JSON-RPC API - while passing empty `_withdrawalFinalizationBatches` and `_simulatedShareRate` == 0, plugging the returned values - to the following formula: `_simulatedShareRate = (postTotalPooledEther * 1e27) / postTotalShares` - """ - hex_ref_slot = HexStr('0x' + ref_slot.to_bytes(32).hex()) - - try: - return self._handle_oracle_report( - timestamp, - time_elapsed, - validators_count, - cl_balance, - withdrawal_vault_balance, - el_rewards, - shares_to_burn, - accounting_oracle_address, - hex_ref_slot, - block_identifier, - ) - except Web3RPCError as error: - # {'code': -32602, 'message': 'invalid argument 2: hex number with leading zero digits'} - logger.warning({ - 'msg': 'Request failed. This is expected behaviour from Erigon nodes. Try another request format.', - 'error': repr(error), - }) - hex_ref_slot = HexStr(hex(ref_slot)) - - return self._handle_oracle_report( - timestamp, - time_elapsed, - validators_count, - cl_balance, - withdrawal_vault_balance, - el_rewards, - shares_to_burn, - accounting_oracle_address, - hex_ref_slot, - block_identifier, - ) - - def _handle_oracle_report( - self, - timestamp: int, - time_elapsed: int, - validators_count: int, - cl_balance: Wei, - withdrawal_vault_balance: Wei, - el_rewards: Wei, - shares_to_burn: int, - accounting_oracle_address: ChecksumAddress, - ref_slot: HexStr, - block_identifier: BlockIdentifier = 'latest', - ) -> LidoReportRebase: - state_override: StateOverride = { - accounting_oracle_address: StateOverrideParams( - # Fix: insufficient funds for gas * price + value - balance=Wei(100 * 10**18), - # Fix: Sanity checker uses `lastProcessingRefSlot` from AccountingOracle to - # properly process negative rebase sanity checks. Since current simulation skips call to AO, - # setting up `lastProcessingRefSlot` directly. - stateDiff={ - Web3.to_hex(primitive=self.w3.keccak(text="lido.BaseOracle.lastProcessingRefSlot")): ref_slot, - } - ), - } - - response = self.functions.handleOracleReport( - timestamp, - time_elapsed, - validators_count, - cl_balance, - withdrawal_vault_balance, - el_rewards, - shares_to_burn, - [], - 0, - ).call( - transaction={'from': accounting_oracle_address}, - block_identifier=block_identifier, - state_override=state_override, - ) - - response = LidoReportRebase(*response) - - logger.info({ - 'msg': 'Call `handleOracleReport({}, {}, {}, {}, {}, {}, {}, {}, {})`.'.format( # pylint: disable=consider-using-f-string - timestamp, - time_elapsed, - validators_count, - cl_balance, - withdrawal_vault_balance, - el_rewards, - shares_to_burn, - [], - 0, - ), - 'state_override': repr(state_override), - 'value': response, - 'block_identifier': repr(block_identifier), - 'to': self.address, - }) - return response - @lru_cache(maxsize=1) def get_buffered_ether(self, block_identifier: BlockIdentifier = 'latest') -> Wei: """ @@ -192,4 +69,24 @@ def get_beacon_stat(self, block_identifier: BlockIdentifier = 'latest') -> Beaco 'block_identifier': repr(block_identifier), 'to': self.address, }) + return response + + def get_last_token_rebased_event(self, from_block, to_block: int) -> Optional[TokenRebasedEvent]: + logs = self.events.TokenRebased().get_logs( + from_block=from_block, + to_block=to_block + ) + + logger.info({ + 'msg': 'Call `getTokenRebasedEvents()`.', + 'from_block': from_block, + 'to_block': to_block, + 'to': self.address, + 'len(events)': len(logs), + }) + + if len(logs) == 0: + return None + + return TokenRebasedEvent.from_log(logs[-1]) \ No newline at end of file diff --git a/src/providers/execution/contracts/lido_locator.py b/src/providers/execution/contracts/lido_locator.py index 23a44c224..de3b99df1 100644 --- a/src/providers/execution/contracts/lido_locator.py +++ b/src/providers/execution/contracts/lido_locator.py @@ -25,6 +25,20 @@ def lido(self, block_identifier: BlockIdentifier = 'latest') -> ChecksumAddress: }) return response + @lru_cache(maxsize=1) + def accounting(self, block_identifier: BlockIdentifier = 'latest') -> ChecksumAddress: + response = self.functions.accounting().call(block_identifier=block_identifier) + + logger.debug( + { + 'msg': 'Call `accounting()`.', + 'value': response, + 'block_identifier': repr(block_identifier), + 'to': self.address, + } + ) + return response + @lru_cache(maxsize=1) def accounting_oracle(self, block_identifier: BlockIdentifier = 'latest') -> ChecksumAddress: response = self.functions.accountingOracle().call(block_identifier=block_identifier) @@ -132,3 +146,31 @@ def el_rewards_vault(self, block_identifier: BlockIdentifier = 'latest') -> Chec 'to': self.address, }) return response + + @lru_cache(maxsize=1) + def vault_hub(self, block_identifier: BlockIdentifier = 'latest') -> ChecksumAddress: + response = self.functions.vaultHub().call(block_identifier=block_identifier) + + logger.debug( + { + 'msg': 'Call `vaultHub()`.', + 'value': response, + 'block_identifier': repr(block_identifier), + 'to': self.address, + } + ) + return response + + @lru_cache(maxsize=1) + def lazy_oracle(self, block_identifier: BlockIdentifier = 'latest') -> ChecksumAddress: + response = self.functions.lazyOracle().call(block_identifier=block_identifier) + + logger.debug( + { + 'msg': 'Call `lazyOracle()`.', + 'value': response, + 'block_identifier': repr(block_identifier), + 'to': self.address, + } + ) + return response diff --git a/src/providers/execution/contracts/staking_router.py b/src/providers/execution/contracts/staking_router.py index 2840429ce..b4509d51a 100644 --- a/src/providers/execution/contracts/staking_router.py +++ b/src/providers/execution/contracts/staking_router.py @@ -74,3 +74,18 @@ def get_staking_modules(self, block_identifier: BlockIdentifier = 'latest') -> l 'to': self.address, }) return response + + def get_staking_fee_aggregate_distribution(self, block_identifier: BlockIdentifier = 'latest') -> tuple[int, int, int]: + """ + Returns all registered staking modules + """ + response = self.functions.getStakingFeeAggregateDistribution().call(block_identifier=block_identifier) + + logger.info({ + 'msg': 'Call `getStakingFeeAggregateDistribution()`.', + 'value': response, + 'block_identifier': repr(block_identifier), + 'to': self.address, + }) + + return response.modulesFee, response.treasuryFee, response.basePrecision diff --git a/src/providers/execution/contracts/vault_hub.py b/src/providers/execution/contracts/vault_hub.py new file mode 100644 index 000000000..4d776853f --- /dev/null +++ b/src/providers/execution/contracts/vault_hub.py @@ -0,0 +1,56 @@ +import logging + +from src.modules.accounting.events import MintedSharesOnVaultEvent, BurnedSharesOnVaultEvent, VaultFeesUpdatedEvent +from src.providers.execution.base_interface import ContractInterface + + +logger = logging.getLogger(__name__) + + +class VaultHubContract(ContractInterface): + abi_path = './assets/VaultHub.json' + + def get_minted_events(self, from_block_number: int, to_block_number: int) -> list: + logs = self.events.MintedSharesOnVault().get_logs( + from_block=from_block_number, + to_block=to_block_number + ) + + if not logs: + return [] + + events: list[MintedSharesOnVaultEvent] = [] + for log in logs: + events.append(MintedSharesOnVaultEvent.from_log(log)) + + return events + + def get_burned_events(self, from_block_number: int, to_block_number: int) -> list: + logs = self.events.BurnedSharesOnVault().get_logs( + from_block=from_block_number, + to_block=to_block_number + ) + + if not logs: + return [] + + events: list[BurnedSharesOnVaultEvent] = [] + for log in logs: + events.append(BurnedSharesOnVaultEvent.from_log(log)) + + return events + + def get_vaults_fee_updated_events(self, from_block_number: int, to_block_number: int) -> list: + logs = self.events.VaultFeesUpdated().get_logs( + from_block=from_block_number, + to_block=to_block_number + ) + + if not logs: + return [] + + events: list[VaultFeesUpdatedEvent] = [] + for log in logs: + events.append(VaultFeesUpdatedEvent.from_log(log)) + + return events \ No newline at end of file diff --git a/src/services/bunker.py b/src/services/bunker.py index 1294570d1..154736444 100644 --- a/src/services/bunker.py +++ b/src/services/bunker.py @@ -10,7 +10,7 @@ ALL_SLASHED_VALIDATORS, LIDO_SLASHED_VALIDATORS, ) -from src.modules.accounting.types import LidoReportRebase +from src.modules.accounting.types import ReportResults from src.modules.submodules.consensus import FrameConfig, ChainConfig from src.services.bunker_cases.abnormal_cl_rebase import AbnormalClRebase from src.services.bunker_cases.midterm_slashing_penalty import MidtermSlashingPenalty @@ -37,6 +37,7 @@ class BunkerService: For more info about bunker mode see: https://research.lido.fi/t/withdrawals-for-lido-on-ethereum-bunker-mode-design-and-implementation/ """ + def __init__(self, w3: Web3): self.w3 = w3 @@ -46,7 +47,7 @@ def is_bunker_mode( blockstamp: ReferenceBlockStamp, frame_config: FrameConfig, chain_config: ChainConfig, - simulated_cl_rebase: LidoReportRebase, + simulated_cl_rebase: ReportResults, ) -> bool: """If any of cases is True, then bunker mode is ON""" bunker_config = self._get_config(blockstamp) @@ -97,7 +98,7 @@ def is_bunker_mode( return False - def get_cl_rebase_for_current_report(self, blockstamp: BlockStamp, simulated_cl_rebase: LidoReportRebase) -> Gwei: + def get_cl_rebase_for_current_report(self, blockstamp: BlockStamp, simulated_cl_rebase: ReportResults) -> Gwei: """ Get simulated Cl rebase and subtract total supply before report """ diff --git a/src/utils/apr.py b/src/utils/apr.py new file mode 100644 index 000000000..44e99bbe1 --- /dev/null +++ b/src/utils/apr.py @@ -0,0 +1,28 @@ +from src.modules.accounting.types import SECONDS_IN_YEAR + + +def calculate_steth_apr( + pre_total_shares: int, + pre_total_ether: int, + post_total_shares: int, + post_total_ether: int, + time_elapsed: int, +) -> float: + """ + Compute user-facing APR using share rate growth over time. + Formula follows Lido V2-style: + apr = (postRate - preRate) * SECONDS_IN_YEAR / preRate / timeElapsed + """ + + if pre_total_shares == 0 or time_elapsed == 0 or post_total_shares == 0: + raise ValueError("Cannot compute APR: zero division risk.") + + pre_rate = pre_total_ether * 10 ** 27 // pre_total_shares + post_rate = post_total_ether * 10 ** 27 // post_total_shares + + rate_diff = post_rate - pre_rate + + if time_elapsed == 0: + raise ValueError("Cannot compute APR. time_elapsed is 0") + + return (rate_diff * SECONDS_IN_YEAR) / (pre_rate * time_elapsed) diff --git a/src/utils/deposit_signature.py b/src/utils/deposit_signature.py new file mode 100644 index 000000000..2defb7792 --- /dev/null +++ b/src/utils/deposit_signature.py @@ -0,0 +1,104 @@ +import ssz + +from py_ecc.bls import G2ProofOfPossession as BLSVerifier +from py_ecc.bls.g2_primitives import BLSPubkey, BLSSignature + +from src import variables +from src.utils.types import hex_str_to_bytes + +# 0x00000000 for mainnet, but for testnet may be different +GENESIS_FORK_VERSION = variables.GENESIS_FORK_VERSION +GENESIS_VALIDATORS_ROOT = bytes([0] * 32) # all zeros for deposits + +# https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#domain-types +DOMAIN_DEPOSIT_TYPE = bytes.fromhex("03000000") # 0x03000000 + + +class DepositMessage(ssz.Serializable): + fields = [ + ("pubkey", ssz.bytes48), + ("withdrawal_credentials", ssz.bytes32), + ("amount", ssz.uint64), # value in Gwei + ] + + +class ForkData(ssz.Serializable): + fields = [ + ("current_version", ssz.bytes4), + ("genesis_validators_root", ssz.bytes32), + ] + + +class SigningData(ssz.Serializable): + fields = [ + ("object_root", ssz.bytes32), + ("domain", ssz.bytes32), + ] + + +def compute_fork_data_root( + fork_version: bytes, + genesis_validators_root: bytes, +) -> bytes: + """ + https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#compute_fork_data_root + """ + return ssz.get_hash_tree_root(ForkData(fork_version, genesis_validators_root)) + + +def compute_domain( + domain_type: bytes, + fork_version: bytes, + genesis_validators_root: bytes, +) -> bytes: + """ + https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#compute_domain + """ + fork_data_root = compute_fork_data_root(fork_version, genesis_validators_root) + return domain_type + fork_data_root[:28] + + +def compute_signing_root( + message: DepositMessage, + domain: bytes, +) -> bytes: + """ + https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#compute_signing_root + """ + object_root = ssz.get_hash_tree_root(message) + return ssz.get_hash_tree_root(SigningData(object_root, domain)) + + +def is_valid_deposit_signature( + pubkey: bytes, + withdrawal_credentials: bytes, + amount_gwei: int, + signature: bytes, + fork_version: str = GENESIS_FORK_VERSION, + genesis_validators_root: bytes = GENESIS_VALIDATORS_ROOT, +) -> bool: + """Return **True** if the deposit proof-of-possession (BLS signature) is valid. + + Parameters + ---------- + pubkey : bytes + 48-byte BLS public key + withdrawal_credentials : bytes + 32-byte field from the deposit data + amount_gwei : int + Integer value in **Gwei** (NOT wei) + signature : bytes + 96-byte BLS signature + fork_version : bytes + 4-byte fork version + genesis_validators_root : bytes + 32-byte genesis validators root + """ + + fork_version_bytes = hex_str_to_bytes(fork_version) + + message = DepositMessage(pubkey, withdrawal_credentials, amount_gwei) + domain = compute_domain(DOMAIN_DEPOSIT_TYPE, fork_version_bytes, genesis_validators_root) + signing_root = compute_signing_root(message, domain) + + return BLSVerifier.Verify(BLSPubkey(pubkey), signing_root, BLSSignature(signature)) diff --git a/src/utils/types.py b/src/utils/types.py index 846a170c6..6564e70f5 100644 --- a/src/utils/types.py +++ b/src/utils/types.py @@ -1,2 +1,8 @@ +from eth_typing import HexStr + + def hex_str_to_bytes(hex_str: str) -> bytes: return bytes.fromhex(hex_str[2:]) if hex_str.startswith("0x") else bytes.fromhex(hex_str) + +def bytes_to_hex_str(b: bytes) -> HexStr: + return HexStr('0x' + b.hex()) diff --git a/src/variables.py b/src/variables.py index ca36f1f61..b754afd27 100644 --- a/src/variables.py +++ b/src/variables.py @@ -30,6 +30,7 @@ FINALIZATION_BATCH_MAX_REQUEST_COUNT: Final = int(os.getenv('FINALIZATION_BATCH_MAX_REQUEST_COUNT', 1000)) EL_REQUESTS_BATCH_SIZE: Final = int(os.getenv('EL_REQUESTS_BATCH_SIZE', 500)) CSM_ORACLE_MAX_CONCURRENCY: Final = min(32, int(os.getenv('CSM_ORACLE_MAX_CONCURRENCY', 2))) +GENESIS_FORK_VERSION: Final = os.getenv('GENESIS_FORK_VERSION', "0x00000000") # We add some gas to the transaction to be sure that we have enough gas to execute corner cases # eg when we tried to submit a few reports in a single block @@ -122,6 +123,7 @@ def raise_from_errors(errors): for key, value in { 'ACCOUNT': 'Dry' if ACCOUNT is None else ACCOUNT.address, 'LIDO_LOCATOR_ADDRESS': LIDO_LOCATOR_ADDRESS, + 'GENESIS_FORK_VERSION': GENESIS_FORK_VERSION, 'CSM_MODULE_ADDRESS': CSM_MODULE_ADDRESS, 'FINALIZATION_BATCH_MAX_REQUEST_COUNT': FINALIZATION_BATCH_MAX_REQUEST_COUNT, 'EL_REQUESTS_BATCH_SIZE': EL_REQUESTS_BATCH_SIZE, diff --git a/src/web3py/extensions/contracts.py b/src/web3py/extensions/contracts.py index 39f30536c..8e9d833d9 100644 --- a/src/web3py/extensions/contracts.py +++ b/src/web3py/extensions/contracts.py @@ -8,6 +8,7 @@ from src import variables from src.metrics.prometheus.business import FRAME_PREV_REPORT_REF_SLOT +from src.providers.execution.contracts.accounting import AccountingContract from src.providers.execution.contracts.accounting_oracle import AccountingOracleContract from src.providers.execution.contracts.burner import BurnerContract from src.providers.execution.contracts.exit_bus_oracle import ExitBusOracleContract @@ -16,6 +17,8 @@ from src.providers.execution.contracts.oracle_daemon_config import OracleDaemonConfigContract from src.providers.execution.contracts.oracle_report_sanity_checker import OracleReportSanityCheckerContract from src.providers.execution.contracts.staking_router import StakingRouterContract +from src.providers.execution.contracts.lazy_oracle import LazyOracleContract +from src.providers.execution.contracts.vault_hub import VaultHubContract from src.providers.execution.contracts.withdrawal_queue_nft import WithdrawalQueueNftContract from src.types import BlockStamp, SlotNumber, WithdrawalVaultBalance, ELVaultBalance @@ -37,6 +40,9 @@ class LidoContracts(Module): oracle_report_sanity_checker: OracleReportSanityCheckerContract oracle_daemon_config: OracleDaemonConfigContract burner: BurnerContract + accounting: AccountingContract + lazy_oracle: LazyOracleContract + vault_hub: VaultHubContract def __init__(self, w3: Web3): super().__init__(w3) @@ -138,6 +144,33 @@ def _load_contracts(self): ), ) + self.accounting: AccountingContract = cast( + AccountingContract, + self.w3.eth.contract( + address=self.lido_locator.accounting(), + ContractFactoryClass=AccountingContract, + decode_tuples=True, + ), + ) + + self.lazy_oracle: LazyOracleContract = cast( + LazyOracleContract, + self.w3.eth.contract( + address=self.lido_locator.lazy_oracle(), + ContractFactoryClass=LazyOracleContract, + decode_tuples=True, + ), + ) + + self.vault_hub: VaultHubContract = cast( + VaultHubContract, + self.w3.eth.contract( + address=self.lido_locator.vault_hub(), + ContractFactoryClass=VaultHubContract, + decode_tuples=True, + ), + ) + # --- Contract methods --- @lru_cache(maxsize=1) def get_withdrawal_balance(self, blockstamp: BlockStamp) -> WithdrawalVaultBalance: diff --git a/src/web3py/types.py b/src/web3py/types.py index 7f206cd46..d2347d48e 100644 --- a/src/web3py/types.py +++ b/src/web3py/types.py @@ -1,6 +1,8 @@ from web3 import Web3 as _Web3 +from src.modules.accounting.staking_vaults import StakingVaults from src.providers.ipfs import IPFSProvider + from src.web3py.extensions import ( CSM, ConsensusClientModule, @@ -13,6 +15,7 @@ class Web3(_Web3): lido_contracts: LidoContracts + staking_vaults: StakingVaults lido_validators: LidoValidatorsProvider transaction: TransactionUtils cc: ConsensusClientModule diff --git a/tests/conftest.py b/tests/conftest.py index 7c4b03ca5..616940faf 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -11,6 +11,7 @@ from src import variables from src.providers.execution.base_interface import ContractInterface from src.providers.ipfs import MultiIPFSProvider +from src.variables import CSM_MODULE_ADDRESS from src.web3py.contract_tweak import tweak_w3_contracts from src.web3py.extensions import ( CSM, @@ -100,8 +101,11 @@ def configure_testnet_tests(request, monkeypatch): monkeypatch.setattr(variables, 'EXECUTION_CLIENT_URI', TESTNET_EXECUTION_CLIENT_URI) monkeypatch.setattr(variables, 'KEYS_API_URI', TESTNET_KAPI_URI) - monkeypatch.setattr(variables, 'LIDO_LOCATOR_ADDRESS', '0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8') - monkeypatch.setattr(variables, 'CSM_MODULE_ADDRESS', '0x79CEf36D84743222f37765204Bec41E92a93E59d') + # TODO: temporary from https://docs.lido.fi/deployed-contracts/hoodi-lidov3, need to + # TODO: revert to https://docs.lido.fi/deployed-contracts/hoodi after vaults deploy + # monkeypatch.setattr(variables, 'LIDO_LOCATOR_ADDRESS', LIDO_LOCATOR_ADDRESS) + monkeypatch.setattr(variables, 'LIDO_LOCATOR_ADDRESS', '0xD7c1B80fA86965B48cCA3aDcCB08E1DAEa291980') + monkeypatch.setattr(variables, 'CSM_MODULE_ADDRESS', CSM_MODULE_ADDRESS) yield diff --git a/tests/factory/configs.py b/tests/factory/configs.py index 36dbf5fd4..9b971d00d 100644 --- a/tests/factory/configs.py +++ b/tests/factory/configs.py @@ -27,7 +27,6 @@ class OracleReportLimitsFactory(Web3DataclassFactory[OracleReportLimits]): churn_validators_per_day_limit = 0 appeared_validators_per_day_limit = 0 annual_balance_increase_bp_limit = 0 - simulated_share_rate_deviation_bp_limit = 0 max_validator_exit_requests_per_report = 0 max_items_per_extra_data_transaction = 0 max_node_operators_per_extra_data_item = 0 diff --git a/tests/factory/contract_responses.py b/tests/factory/contract_responses.py index 39df162c5..7e71b342f 100644 --- a/tests/factory/contract_responses.py +++ b/tests/factory/contract_responses.py @@ -1,6 +1,6 @@ -from src.modules.accounting.types import LidoReportRebase +from src.modules.accounting.types import ReportResults from tests.factory.web3_factory import Web3DataclassFactory -class LidoReportRebaseFactory(Web3DataclassFactory[LidoReportRebase]): # noqa: E701 +class ReportResultsFactory(Web3DataclassFactory[ReportResults]): # noqa: E701 ... diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 5e3b94700..1b4edc16f 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -4,6 +4,7 @@ from web3 import HTTPProvider, Web3 from src import variables +from src.providers.execution.contracts.accounting import AccountingContract from src.providers.execution.contracts.accounting_oracle import AccountingOracleContract from src.providers.execution.contracts.burner import BurnerContract from src.providers.execution.contracts.cs_accounting import CSAccountingContract @@ -18,18 +19,14 @@ from src.providers.execution.contracts.oracle_daemon_config import OracleDaemonConfigContract from src.providers.execution.contracts.oracle_report_sanity_checker import OracleReportSanityCheckerContract from src.providers.execution.contracts.staking_router import StakingRouterContract +from src.providers.execution.contracts.lazy_oracle import LazyOracleContract from src.providers.execution.contracts.withdrawal_queue_nft import WithdrawalQueueNftContract @pytest.fixture def web3_provider_integration(request): - # Some tests can be executed only on mainnet, because of not trivial selected params - variables.LIDO_LOCATOR_ADDRESS = '0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb' - w3 = Web3(HTTPProvider(variables.EXECUTION_CLIENT_URI[0], request_kwargs={'timeout': 3600})) - assert w3.eth.chain_id == 1 - return w3 @@ -72,6 +69,15 @@ def accounting_oracle_contract(web3_provider_integration, lido_locator_contract) ) +@pytest.fixture +def accounting_contract(web3_provider_integration, lido_locator_contract) -> AccountingContract: + return get_contract( + web3_provider_integration, + AccountingContract, + lido_locator_contract.accounting(), + ) + + @pytest.fixture def staking_router_contract(web3_provider_integration, lido_locator_contract) -> StakingRouterContract: return get_contract( @@ -126,6 +132,15 @@ def burner_contract(web3_provider_integration, lido_locator_contract): ) +@pytest.fixture +def vault_hub_contract(web3_provider_integration, lido_locator_contract): + return get_contract( + web3_provider_integration, + LazyOracleContract, + lido_locator_contract.vault_hub(), + ) + + # ╔══════════════════════════════════════════════════════════════════════════════════════════════════╗ # ║ CSM contracts ║ # ╚══════════════════════════════════════════════════════════════════════════════════════════════════╝ diff --git a/tests/integration/contracts/test_accounting.py b/tests/integration/contracts/test_accounting.py new file mode 100644 index 000000000..9e90c7c27 --- /dev/null +++ b/tests/integration/contracts/test_accounting.py @@ -0,0 +1,31 @@ +import pytest + +from src.modules.accounting.types import ReportValues, ReportResults +from tests.integration.contracts.contract_utils import check_contract, check_value_type + + +@pytest.mark.testnet # TODO: Bounded to hoodie due to st. vaults task, move to mainnet after release +@pytest.mark.integration +def test_accounting_contract_call(accounting_contract, caplog): + check_contract( + accounting_contract, + [ + ( + 'simulate_oracle_report', + ( + ReportValues( + timestamp=0, + time_elapsed=0, + cl_validators=100, + cl_balance=0, + withdrawal_vault_balance=0, + el_rewards_vault_balance=0, + shares_requested_to_burn=0, + withdrawal_finalization_batches=[], + ), + ), + lambda response: check_value_type(response, ReportResults), + ), + ], + caplog, + ) diff --git a/tests/integration/contracts/test_accounting_oracle.py b/tests/integration/contracts/test_accounting_oracle.py index adb41541d..25fd8a12f 100644 --- a/tests/integration/contracts/test_accounting_oracle.py +++ b/tests/integration/contracts/test_accounting_oracle.py @@ -5,6 +5,7 @@ from tests.integration.contracts.contract_utils import check_contract, check_is_instance_of +@pytest.mark.testnet # TODO: Bounded to hoodie due to st. vaults task, move to mainnet after release @pytest.mark.integration def test_accounting_oracle_contract(accounting_oracle_contract, caplog): check_contract( diff --git a/tests/integration/contracts/test_bunker.py b/tests/integration/contracts/test_bunker.py index 146810450..d1cc224a2 100644 --- a/tests/integration/contracts/test_bunker.py +++ b/tests/integration/contracts/test_bunker.py @@ -4,6 +4,7 @@ from tests.integration.contracts.contract_utils import check_contract, check_is_instance_of +@pytest.mark.mainnet @pytest.mark.integration def test_burner(burner_contract, caplog): check_contract( diff --git a/tests/integration/contracts/test_lido.py b/tests/integration/contracts/test_lido.py index b76e72b40..05f6452bf 100644 --- a/tests/integration/contracts/test_lido.py +++ b/tests/integration/contracts/test_lido.py @@ -1,9 +1,10 @@ import pytest -from src.modules.accounting.types import BeaconStat, LidoReportRebase +from src.modules.accounting.types import BeaconStat from tests.integration.contracts.contract_utils import check_contract, check_value_type +@pytest.mark.mainnet @pytest.mark.integration def test_lido_contract_call(lido_contract, accounting_oracle_contract, burner_contract, caplog): check_contract( @@ -12,23 +13,6 @@ def test_lido_contract_call(lido_contract, accounting_oracle_contract, burner_co ('get_buffered_ether', None, lambda response: check_value_type(response, int)), ('total_supply', None, lambda response: check_value_type(response, int)), ('get_beacon_stat', None, lambda response: check_value_type(response, BeaconStat)), - ( - 'handle_oracle_report', - ( - 1746275159, # timestamp - 86400, - 389746, - 9190764598468942000000000, - 13771995248000000000, - 478072602914417566, - 0, - accounting_oracle_contract.address, - 11620928, - # Call depends on contract state - '0xffa34bcc5a08c92272a62e591f7afb9cb839134aa08c091ae0c95682fba35da9', - ), - lambda response: check_value_type(response, LidoReportRebase), - ), ], caplog, ) diff --git a/tests/integration/contracts/test_lido_locator.py b/tests/integration/contracts/test_lido_locator.py index bb6d00a22..4d030b005 100644 --- a/tests/integration/contracts/test_lido_locator.py +++ b/tests/integration/contracts/test_lido_locator.py @@ -4,6 +4,7 @@ from tests.integration.contracts.contract_utils import check_contract, check_is_instance_of +@pytest.mark.mainnet @pytest.mark.integration def test_lido_locator_contract(lido_locator_contract, caplog): check_contract( @@ -22,3 +23,16 @@ def test_lido_locator_contract(lido_locator_contract, caplog): ], caplog, ) + + +@pytest.mark.testnet +@pytest.mark.integration +def test_lido_locator_contract_testnet(lido_locator_contract, caplog): + check_contract( + lido_locator_contract, + [ + ('accounting', None, check_is_instance_of(ChecksumAddress)), + ('vault_hub', None, check_is_instance_of(ChecksumAddress)), + ], + caplog, + ) diff --git a/tests/integration/contracts/test_oracle_daemon_config.py b/tests/integration/contracts/test_oracle_daemon_config.py index d07e85aa9..61e2264f9 100644 --- a/tests/integration/contracts/test_oracle_daemon_config.py +++ b/tests/integration/contracts/test_oracle_daemon_config.py @@ -4,6 +4,7 @@ from tests.integration.contracts.contract_utils import check_contract, check_value_type +@pytest.mark.mainnet @pytest.mark.integration def test_oracle_daemon_config_contract(oracle_daemon_config_contract, caplog): check_contract( diff --git a/tests/integration/contracts/test_oracle_report_sanity_checker.py b/tests/integration/contracts/test_oracle_report_sanity_checker.py index aa99c5343..4f9d8c582 100644 --- a/tests/integration/contracts/test_oracle_report_sanity_checker.py +++ b/tests/integration/contracts/test_oracle_report_sanity_checker.py @@ -4,6 +4,7 @@ from tests.integration.contracts.contract_utils import check_contract, check_is_instance_of +@pytest.mark.testnet @pytest.mark.integration def test_oracle_report_sanity_checker(oracle_report_sanity_checker_contract, caplog): check_contract( diff --git a/tests/integration/contracts/test_staking_router.py b/tests/integration/contracts/test_staking_router.py index 82ff51103..88bc35546 100644 --- a/tests/integration/contracts/test_staking_router.py +++ b/tests/integration/contracts/test_staking_router.py @@ -5,6 +5,7 @@ from tests.integration.contracts.contract_utils import check_contract, check_value_type +@pytest.mark.mainnet @pytest.mark.integration def test_staking_router(staking_router_contract, caplog): check_contract( diff --git a/tests/integration/contracts/test_validator_exit_bus_oracle.py b/tests/integration/contracts/test_validator_exit_bus_oracle.py index 93f040271..2fff95c69 100644 --- a/tests/integration/contracts/test_validator_exit_bus_oracle.py +++ b/tests/integration/contracts/test_validator_exit_bus_oracle.py @@ -7,6 +7,7 @@ ) +@pytest.mark.mainnet @pytest.mark.integration def test_vebo(validators_exit_bus_oracle_contract, caplog): check_contract( diff --git a/tests/integration/contracts/test_vault_hub.py b/tests/integration/contracts/test_vault_hub.py new file mode 100644 index 000000000..a0f384409 --- /dev/null +++ b/tests/integration/contracts/test_vault_hub.py @@ -0,0 +1,15 @@ +import pytest + +from tests.integration.contracts.contract_utils import check_contract, check_value_type + + +@pytest.mark.testnet +@pytest.mark.integration +def test_vault_hub_contract_call(vault_hub_contract, caplog): + check_contract( + vault_hub_contract, + [ + ('get_vaults_count', None, lambda response: check_value_type(response, int)), + ], + caplog, + ) diff --git a/tests/integration/contracts/test_withdrawal_queue_nft_contract.py b/tests/integration/contracts/test_withdrawal_queue_nft_contract.py index 5506b54d5..f738f891d 100644 --- a/tests/integration/contracts/test_withdrawal_queue_nft_contract.py +++ b/tests/integration/contracts/test_withdrawal_queue_nft_contract.py @@ -4,6 +4,7 @@ from tests.integration.contracts.contract_utils import check_contract, check_is_instance_of +@pytest.mark.mainnet @pytest.mark.integration def test_withdrawal_queue(withdrawal_queue_nft_contract, caplog): check_contract( diff --git a/tests/modules/accounting/bunker/test_bunker.py b/tests/modules/accounting/bunker/test_bunker.py index 0defa4ce4..95392ce6c 100644 --- a/tests/modules/accounting/bunker/test_bunker.py +++ b/tests/modules/accounting/bunker/test_bunker.py @@ -2,8 +2,9 @@ from unittest.mock import Mock import pytest +from web3.types import Wei -from src.modules.accounting.types import LidoReportRebase +from src.modules.accounting.types import ReportResults, StakingRewardsDistribution from src.providers.consensus.types import BeaconStateView from src.services.bunker import BunkerService from src.types import ReferenceBlockStamp @@ -11,7 +12,7 @@ from tests.factory.blockstamp import ReferenceBlockStampFactory from tests.factory.configs import BunkerConfigFactory, ChainConfigFactory, FrameConfigFactory from tests.factory.consensus import BeaconStateViewFactory -from tests.factory.contract_responses import LidoReportRebaseFactory +from tests.factory.contract_responses import ReportResultsFactory from tests.factory.no_registry import LidoValidatorFactory from tests.modules.accounting.bunker.conftest import simple_ref_blockstamp @@ -33,7 +34,7 @@ def test_false_when_no_prev_report( ref_blockstamp, FrameConfigFactory.build(), ChainConfigFactory.build(), - LidoReportRebaseFactory.build(), + ReportResultsFactory.build(), ) assert result is False bunker.w3.lido_contracts.get_accounting_last_processing_ref_slot.assert_called_once() @@ -58,7 +59,7 @@ def test_true_when_cl_rebase_is_negative( ref_blockstamp, FrameConfigFactory.build(), ChainConfigFactory.build(), - LidoReportRebaseFactory.build(), + ReportResultsFactory.build(), ) assert result is True @@ -87,7 +88,7 @@ def test_true_when_high_midterm_slashing_penalty( ref_blockstamp, FrameConfigFactory.build(), ChainConfigFactory.build(), - LidoReportRebaseFactory.build(), + ReportResultsFactory.build(), ) assert result is True is_high_midterm_slashing_penalty.assert_called_once() @@ -115,7 +116,7 @@ def test_true_when_abnormal_cl_rebase( ref_blockstamp, FrameConfigFactory.build(), ChainConfigFactory.build(), - LidoReportRebaseFactory.build(), + ReportResultsFactory.build(), ) assert result is True is_high_midterm_slashing_penalty.assert_called_once() @@ -144,7 +145,7 @@ def test_no_bunker_mode_by_default( ref_blockstamp, FrameConfigFactory.build(), ChainConfigFactory.build(), - LidoReportRebaseFactory.build(), + ReportResultsFactory.build(), ) assert result is False is_high_midterm_slashing_penalty.assert_called_once() @@ -215,11 +216,28 @@ def test_get_cl_rebase_for_frame( bunker.w3.lido_contracts.lido.total_supply = Mock(return_value=15 * 10**18) blockstamp = simple_ref_blockstamp(0) - simulated_cl_rebase = LidoReportRebase( + simulated_cl_rebase = ReportResults( + withdrawals=Wei(0), + el_rewards=Wei(0), post_total_pooled_ether=simulated_post_total_pooled_ether, post_total_shares=0, - withdrawals=0, - el_reward=0, + ether_to_finalize_wq=0, + shares_to_finalize_wq=0, + shares_to_burn_for_withdrawals=0, + total_shares_to_burn=0, + shares_to_mint_as_fees=0, + reward_distribution=StakingRewardsDistribution( + recipients=[], + module_ids=[], + modules_fees=[], + total_fee=0, + precision_points=0, + ), + pre_total_shares=0, + pre_total_pooled_ether=0, + principal_cl_balance=0, + post_internal_shares=0, + post_internal_ether=0, ) result = bunker.get_cl_rebase_for_current_report(blockstamp, simulated_cl_rebase) diff --git a/tests/modules/accounting/staking_vault/test_staking_vaults.py b/tests/modules/accounting/staking_vault/test_staking_vaults.py new file mode 100644 index 000000000..93a8a4dc1 --- /dev/null +++ b/tests/modules/accounting/staking_vault/test_staking_vaults.py @@ -0,0 +1,579 @@ +from unittest.mock import MagicMock + +import pytest +from eth_typing import BlockNumber, ChecksumAddress, HexAddress, HexStr +from hexbytes import HexBytes +from web3.types import Timestamp, Wei + +from src.main import ipfs_providers +from src.modules.accounting.accounting import Accounting +from src.modules.accounting.events import ( + BurnedSharesOnVaultEvent, + MintedSharesOnVaultEvent, + VaultFeesUpdatedEvent, +) +from src.modules.accounting.staking_vaults import StakingVaults +from src.modules.accounting.types import ( + ExtraValue, + MerkleTreeData, + MerkleValue, + ReportResults, + StakingRewardsDistribution, + VaultInfo, + VaultProof, + VaultsMap, +) +from src.providers.consensus.types import PendingDeposit, Validator, ValidatorState +from src.providers.ipfs import MultiIPFSProvider +from src.types import ( + BlockHash, + BlockStamp, + EpochNumber, + Gwei, + SlotNumber, + StateRoot, + ValidatorIndex, +) + + +class TestStakingVaults: + ipfs_client: MultiIPFSProvider + staking_vaults: StakingVaults + + def setup_method(self): + self.ipfs_client = MultiIPFSProvider(ipfs_providers(), retries=3) + + # Vault addresses + vault_adr_0 = ChecksumAddress(HexAddress(HexStr('0xE312f1ed35c4dBd010A332118baAD69d45A0E302'))) + vault_adr_1 = ChecksumAddress(HexAddress(HexStr('0x652b70E0Ae932896035d553fEaA02f37Ab34f7DC'))) + vault_adr_2 = ChecksumAddress(HexAddress(HexStr('0x20d34FD0482E3BdC944952D0277A306860be0014'))) + vault_adr_3 = ChecksumAddress(HexAddress(HexStr('0x60B614c42d92d6c2E68AF7f4b741867648aBf9A4'))) + + # --- VaultHub Mock --- + self.vaults: VaultsMap = { + vault_adr_0: VaultInfo( + vault_ind=1, + vault=vault_adr_0, + balance=Wei(1000000000000000000), + in_out_delta=Wei(1000000000000000000), + withdrawal_credentials='0x020000000000000000000000e312f1ed35c4dbd010a332118baad69d45a0e302', + liability_shares=0, + share_limit=0, + reserve_ratioBP=0, + forced_rebalance_thresholdBP=0, + infra_feeBP=0, + liquidity_feeBP=0, + reservation_feeBP=0, + pending_disconnect=False, + mintable_capacity_StETH=0, + ), + vault_adr_1: VaultInfo( + vault_ind=2, + vault=vault_adr_1, + balance=Wei(0), + in_out_delta=Wei(2000000000000000000), + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + liability_shares=490000000000000000, + share_limit=0, + reserve_ratioBP=0, + forced_rebalance_thresholdBP=0, + infra_feeBP=0, + liquidity_feeBP=0, + reservation_feeBP=0, + pending_disconnect=False, + mintable_capacity_StETH=0, + ), + vault_adr_2: VaultInfo( + vault_ind=3, + vault=vault_adr_2, + balance=Wei(2000900000000000000), + in_out_delta=Wei(2000900000000000000), + withdrawal_credentials='0x02000000000000000000000020d34fd0482e3bdc944952d0277a306860be0014', + liability_shares=1200000000000010001, + share_limit=0, + reserve_ratioBP=0, + forced_rebalance_thresholdBP=0, + infra_feeBP=0, + liquidity_feeBP=0, + reservation_feeBP=0, + pending_disconnect=False, + mintable_capacity_StETH=0, + ), + vault_adr_3: VaultInfo( + vault_ind=4, + vault=vault_adr_3, + balance=Wei(1000000000000000000), + in_out_delta=Wei(1000000000000000000), + withdrawal_credentials='0x02000000000000000000000060b614c42d92d6c2e68af7f4b741867648abf9a4', + liability_shares=0, + share_limit=0, + reserve_ratioBP=0, + forced_rebalance_thresholdBP=0, + infra_feeBP=0, + liquidity_feeBP=0, + reservation_feeBP=0, + pending_disconnect=False, + mintable_capacity_StETH=0, + ), + } + + # --- Web3 Mock --- + w3_mock = MagicMock() + cc_mock = MagicMock() + lido_mock = MagicMock() + lazy_oracle_mock = MagicMock() + daemon_config_mock = MagicMock() + vault_hub_mock = MagicMock() + + self.staking_vaults = StakingVaults( + w3_mock, cc_mock, self.ipfs_client, lido_mock, vault_hub_mock, lazy_oracle_mock, daemon_config_mock + ) + + self.accounting = Accounting(w3_mock) + + @pytest.mark.unit + def test_get_vaults_total_values(self): + bs = BlockStamp( + state_root=StateRoot(HexStr('0xcdbb26ef98f4f6c46262f34e980dcc92c28268ba6ca9b7d45668eb0c23cad3c3')), + slot_number=SlotNumber(7314880), + block_hash=BlockHash(HexStr('0xbb3ba9405346f2448e9fa02b110539dde714e6e3f06bd5207dc29e14db353a3a')), + block_number=BlockNumber(8027890), + block_timestamp=Timestamp(1743512160), + ) + + validators: list[Validator] = [ + Validator( + index=ValidatorIndex(1985), + balance=Gwei(32834904184), + validator=ValidatorState( + pubkey='0x862d53d9e4313374d202f2b28e6ffe64efb0312f9c2663f2eef67b72345faa8932b27f9b9bb7b476d9b5e418fea99124', + withdrawal_credentials='0x020000000000000000000000e312f1ed35c4dbd010a332118baad69d45a0e302', + effective_balance=Gwei(32000000000), + slashed=False, + activation_eligibility_epoch=EpochNumber(225469), + activation_epoch=EpochNumber(225475), + exit_epoch=EpochNumber(18446744073709551615), + withdrawable_epoch=EpochNumber(18446744073709551615), + ), + ), + Validator( + index=ValidatorIndex(1986), + balance=Gwei(40000000000), + validator=ValidatorState( + pubkey='0xa5d9411ef615c74c9240634905d5ddd46dc40a87a09e8cc0332afddb246d291303e452a850917eefe09b3b8c70a307ce', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + effective_balance=Gwei(0), + slashed=False, + activation_eligibility_epoch=EpochNumber(226130), + activation_epoch=EpochNumber(226136), + exit_epoch=EpochNumber(227556), + withdrawable_epoch=EpochNumber(227812), + ), + ), + Validator( + index=ValidatorIndex(1987), + balance=Gwei(50000000000), + validator=ValidatorState( + pubkey='0xa5d9411ef615c74c9240634905d5ddd46dc40a87a09e8cc0332afddb246d291303e452a850917eefe09b3b8c70a307ce', + withdrawal_credentials='0x02000000000000000000000020d34fd0482e3bdc944952d0277a306860be0014', + effective_balance=Gwei(0), + slashed=False, + activation_eligibility_epoch=EpochNumber(226130), + activation_epoch=EpochNumber(226136), + exit_epoch=EpochNumber(227556), + withdrawable_epoch=EpochNumber(227812), + ), + ), + Validator( + index=ValidatorIndex(1987), + balance=Gwei(60000000000), + validator=ValidatorState( + pubkey='0xa5d9411ef615c74c9240634905d5ddd46dc40a87a09e8cc0332afddb246d291303e452a850917eefe09b3b8c70a307ce', + withdrawal_credentials='0x02000000000000000000000060b614c42d92d6c2e68af7f4b741867648abf9a4', + effective_balance=Gwei(0), + slashed=False, + activation_eligibility_epoch=EpochNumber(226130), + activation_epoch=EpochNumber(226136), + exit_epoch=EpochNumber(227556), + withdrawable_epoch=EpochNumber(227812), + ), + ), + ] + + pending_deposits: list[PendingDeposit] = [ + # Valid + PendingDeposit( + pubkey='0xa50a7821c793e80710f51c681b28f996e5c2f1fa00318dbf91b5844822d58ac2fef892b79aea386a3b97829e090a393e', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + amount=Gwei(1000000000), + signature='0xb5b222b452892bd62a7d2b4925e15bf9823c4443313d86d3e1fe549c86aa8919d0cdd1d5b60d9d3184f3966ced21699f124a14a0d8c1f1ae3e9f25715f40c3e7b81a909424c60ca7a8cbd79f101d6bd86ce1bdd39701cf93b2eecce10699f40b', + slot=SlotNumber(259388), + ), + # Invalid + PendingDeposit( + pubkey='0x8c96ad1b9a1acf4a898009d96293d191ab911b535cd1e6618e76897b5fa239a7078f1fbf9de8dd07a61a51b137c74a87', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + amount=Gwei(1000000000), + signature='0x978f286178050a3dbf6f8551b8020f72dd1de8223fc9cb8553d5ebb22f71164f4278d9b970467084a9dcd54ad07ec8d60792104ff82887b499346f3e8adc55a86f26bfbb032ac2524da42d5186c5a8ed0ccf9d98e9f6ff012cfafbd712335aa5', + slot=SlotNumber(259654), + ), + # Invalid + PendingDeposit( + pubkey='0x99eeb66e77fef5c71d3b303774ecded0d52d521e8d665c2d0f350c33f5f82e7ddd88dd9bc4f8014fb22820beda3a8a85', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + amount=Gwei(1000000000), + signature='0xb4ea337eb8d0fc47361672d4a153dbe3cd943a0418c9f1bc586bca95cdcf8615d60a2394b7680276c4597a2524f9bcf1088c40a08902841ff68d508a9f825803b9fac3bc6333cf3afa7503f560ccf6f689be5b0f5d08fa9e21cb203aa1f53259', + slot=SlotNumber(260393), + ), + ] + + vaults_total_values = self.staking_vaults.get_vaults_total_values(self.vaults, validators, pending_deposits) + expected = [33834904184000000000, 41000000000000000000, 52000900000000000000, 61000000000000000000] + assert vaults_total_values == expected + + @pytest.mark.unit + def test_get_vaults_data_multiple_pending_deposits(self): + bs = BlockStamp( + state_root=StateRoot(HexStr('0xcdbb26ef98f4f6c46262f34e980dcc92c28268ba6ca9b7d45668eb0c23cad3c3')), + slot_number=SlotNumber(7314880), + block_hash=BlockHash(HexStr('0xbb3ba9405346f2448e9fa02b110539dde714e6e3f06bd5207dc29e14db353a3a')), + block_number=BlockNumber(8027890), + block_timestamp=Timestamp(1743512160), + ) + + validators: list[Validator] = [ + Validator( + index=ValidatorIndex(1986), + balance=Gwei(0), + validator=ValidatorState( + pubkey='0xa5d9411ef615c74c9240634905d5ddd46dc40a87a09e8cc0332afddb246d291303e452a850917eefe09b3b8c70a307ce', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + effective_balance=Gwei(0), + slashed=False, + activation_eligibility_epoch=EpochNumber(226130), + activation_epoch=EpochNumber(226136), + exit_epoch=EpochNumber(227556), + withdrawable_epoch=EpochNumber(227812), + ), + ), + ] + + pending_deposits: list[PendingDeposit] = [ + # Invalid (generated with fork_version 0x10000910, Hoodi) + PendingDeposit( + pubkey='0x8f6ef94afaab1b6a693a4e65bcec154a2a285eb8e0aa7f9f8a8c596d4cf98cac8b981d77d1af0427dbaa5a37fab77b80', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + amount=Gwei(1000000000), + signature='0xb859ffb4f3b6ead09dc2be1ac3902194d84a17efe4da195c07c57e8593f2bba4b58d74da113db0dddc96813808a106e215044670bd4230af50ed812a41d5cca0c4dfbffd0d9e0129cfbaf1dbcef9d7479bb27301aa74e1a69e3306b59eb051bb', + slot=SlotNumber(259387), + ), + # Valid (generated with fork_version 0x00000000, Mainnet) + PendingDeposit( + pubkey='0x8f6ef94afaab1b6a693a4e65bcec154a2a285eb8e0aa7f9f8a8c596d4cf98cac8b981d77d1af0427dbaa5a37fab77b80', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + amount=Gwei(1000000000), + signature='0xa8e06b7ad322e27b4aab71c9901f2196c288b9dd616aefbef9eb58084094ddc2e220cbec0024b563918f8ad18ad680ab062b7a09ec5a2287da5f1ef3ab9073f3c6287faaba714bb347958a0563f2aeaa4f7eb56cabeb29a063e964e93c1020db', + slot=SlotNumber(259388), + ), + # Again for hoodi, but should be counted as valid + PendingDeposit( + pubkey='0x8f6ef94afaab1b6a693a4e65bcec154a2a285eb8e0aa7f9f8a8c596d4cf98cac8b981d77d1af0427dbaa5a37fab77b80', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + amount=Gwei(1000000000), + signature='0xb859ffb4f3b6ead09dc2be1ac3902194d84a17efe4da195c07c57e8593f2bba4b58d74da113db0dddc96813808a106e215044670bd4230af50ed812a41d5cca0c4dfbffd0d9e0129cfbaf1dbcef9d7479bb27301aa74e1a69e3306b59eb051bb', + slot=SlotNumber(259389), + ), + ] + + vaults_total_values = self.staking_vaults.get_vaults_total_values(self.vaults, validators, pending_deposits) + expected = [1000000000000000000, 2000000000000000000, 2000900000000000000, 1000000000000000000] + assert vaults_total_values == expected + + @pytest.mark.unit + def test_front_running_pending_deposits_protection(self): + bs = BlockStamp( + state_root=StateRoot(HexStr('0xcdbb26ef98f4f6c46262f34e980dcc92c28268ba6ca9b7d45668eb0c23cad3c3')), + slot_number=SlotNumber(7314880), + block_hash=BlockHash(HexStr('0xbb3ba9405346f2448e9fa02b110539dde714e6e3f06bd5207dc29e14db353a3a')), + block_number=BlockNumber(8027890), + block_timestamp=Timestamp(1743512160), + ) + + validators: list[Validator] = [ + Validator( + index=ValidatorIndex(1986), + balance=Gwei(0), + validator=ValidatorState( + pubkey='0xa5d9411ef615c74c9240634905d5ddd46dc40a87a09e8cc0332afddb246d291303e452a850917eefe09b3b8c70a307ce', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + effective_balance=Gwei(0), + slashed=False, + activation_eligibility_epoch=EpochNumber(226130), + activation_epoch=EpochNumber(226136), + exit_epoch=EpochNumber(227556), + withdrawable_epoch=EpochNumber(227812), + ), + ), + ] + + pending_deposits: list[PendingDeposit] = [ + # Front running deposit with wrong withdrawal credentials + PendingDeposit( + pubkey='0x8f6ef94afaab1b6a693a4e65bcec154a2a285eb8e0aa7f9f8a8c596d4cf98cac8b981d77d1af0427dbaa5a37fab77b80', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f000', + amount=Gwei(1000000000), + signature='0x8a608c679a35a21a5542af583b77fc303b6ad138b5d129b9df323aac2ced17cf36a399ee3d1d68203b495ac0dfdb46161291e8b4d6bf6b4d155bd0a9dd6c3fc158cd90e4e125c8eac8d7bc4ed99b6b8681f32a9481ad087e5229a569255bb8cc', + slot=SlotNumber(259387), + ), + # Valid deposit with correct withdrawal credentials + PendingDeposit( + pubkey='0x8f6ef94afaab1b6a693a4e65bcec154a2a285eb8e0aa7f9f8a8c596d4cf98cac8b981d77d1af0427dbaa5a37fab77b80', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + amount=Gwei(1000000000), + signature='0xa8e06b7ad322e27b4aab71c9901f2196c288b9dd616aefbef9eb58084094ddc2e220cbec0024b563918f8ad18ad680ab062b7a09ec5a2287da5f1ef3ab9073f3c6287faaba714bb347958a0563f2aeaa4f7eb56cabeb29a063e964e93c1020db', + slot=SlotNumber(259388), + ), + ] + + vaults_total_values = self.staking_vaults.get_vaults_total_values(self.vaults, validators, pending_deposits) + expected = [1000000000000000000, 0, 2000900000000000000, 1000000000000000000] + + assert vaults_total_values == expected + + @pytest.mark.unit + def test_existing_validator_with_wrong_withdrawal_credentials(self): + bs = BlockStamp( + state_root=StateRoot(HexStr('0xcdbb26ef98f4f6c46262f34e980dcc92c28268ba6ca9b7d45668eb0c23cad3c3')), + slot_number=SlotNumber(7314880), + block_hash=BlockHash(HexStr('0xbb3ba9405346f2448e9fa02b110539dde714e6e3f06bd5207dc29e14db353a3a')), + block_number=BlockNumber(8027890), + block_timestamp=Timestamp(1743512160), + ) + + validators: list[Validator] = [ + Validator( + index=ValidatorIndex(1986), + balance=Gwei(0), + validator=ValidatorState( + pubkey='0xa5d9411ef615c74c9240634905d5ddd46dc40a87a09e8cc0332afddb246d291303e452a850917eefe09b3b8c70a307ce', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + effective_balance=Gwei(0), + slashed=False, + activation_eligibility_epoch=EpochNumber(226130), + activation_epoch=EpochNumber(226136), + exit_epoch=EpochNumber(227556), + withdrawable_epoch=EpochNumber(227812), + ), + ), + Validator( + index=ValidatorIndex(1986), + balance=Gwei(0), + validator=ValidatorState( + pubkey='0x8f6ef94afaab1b6a693a4e65bcec154a2a285eb8e0aa7f9f8a8c596d4cf98cac8b981d77d1af0427dbaa5a37fab77b80', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f000', + effective_balance=Gwei(0), + slashed=False, + activation_eligibility_epoch=EpochNumber(226130), + activation_epoch=EpochNumber(226136), + exit_epoch=EpochNumber(227556), + withdrawable_epoch=EpochNumber(227812), + ), + ), + ] + + pending_deposits: list[PendingDeposit] = [ + # Valid deposit with correct withdrawal credentials + PendingDeposit( + pubkey='0x8f6ef94afaab1b6a693a4e65bcec154a2a285eb8e0aa7f9f8a8c596d4cf98cac8b981d77d1af0427dbaa5a37fab77b80', + withdrawal_credentials='0x020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc', + amount=Gwei(1000000000), + signature='0xa8e06b7ad322e27b4aab71c9901f2196c288b9dd616aefbef9eb58084094ddc2e220cbec0024b563918f8ad18ad680ab062b7a09ec5a2287da5f1ef3ab9073f3c6287faaba714bb347958a0563f2aeaa4f7eb56cabeb29a063e964e93c1020db', + slot=SlotNumber(259388), + ), + ] + + vaults_total_values = self.staking_vaults.get_vaults_total_values(self.vaults, validators, pending_deposits) + + expected = [1000000000000000000, 0, 2000900000000000000, 1000000000000000000] + + assert vaults_total_values == expected + + @pytest.mark.unit + def test_fees(self): + vault1 = "0xVault1" + prev_block_number = 100_000 + cur_block_number = MagicMock() + block_elapsed = 7_200 + cur_block_number.block_number = prev_block_number + block_elapsed + + mock_merkle_tree_data = MerkleTreeData( + format="v1", + leaf_encoding=["encoding1"], + tree=["node1"], + values=[ + # address, total_value_wei, fee, liability_shares, slashing_reserve + MerkleValue(vault1, 65020591618000000000, 22169367899378, 3000000000000000000, 0), + ], + tree_indices=[0], + merkle_tree_root="root123", + ref_slot=12345, + block_number=prev_block_number, + timestamp=1710000000, + prev_tree_cid="cid122", + extra_values={ + vault1: ExtraValue(0), + }, + ) + + mock_report_results = ReportResults( + withdrawals=100 * 10**18, + el_rewards=5 * 10**18, + ether_to_finalize_wq=2 * 10**18, + shares_to_finalize_wq=1000, + shares_to_burn_for_withdrawals=500, + total_shares_to_burn=1500, + shares_to_mint_as_fees=100, + reward_distribution=StakingRewardsDistribution( + recipients=[ + vault1, + ], + module_ids=[1], + modules_fees=[50, 30], + total_fee=80, + precision_points=10000, + ), + principal_cl_balance=32000 * 10**9, + pre_total_shares=7598409496266444487755575, + pre_total_pooled_ether=Wei(9165134090291140983725643), + post_internal_shares=1_010_000, + post_internal_ether=101_000 * 10**18, + post_total_shares=7589357999778578274703354, + post_total_pooled_ether=Wei(9154964744971805725084856), + ) + + modules_fee, treasury_fee, base_precision = 5121913857400931783, 4878086142599068213, 100000000000000000000 + + mock_w3 = MagicMock(staking_vaults=MagicMock(get_prev_report=MagicMock(return_value=mock_merkle_tree_data))) + mock_w3.lido_contracts = MagicMock( + staking_router=MagicMock( + get_staking_fee_aggregate_distribution=MagicMock( + return_value=(modules_fee, treasury_fee, base_precision) + ) + ) + ) + + mock_chain_config = MagicMock(slots_per_epoch=32, seconds_per_slot=12, genesis_time=1606824000) + + mock_prev_vaults = { + vault1: VaultInfo( + vault=vault1, + balance=1000 * 10**18, + withdrawal_credentials="0x00...", + liability_shares=65000000000000000050, + share_limit=5000, + reserve_ratioBP=2000, + forced_rebalance_thresholdBP=1800, + infra_feeBP=500, + liquidity_feeBP=400, + reservation_feeBP=100, + pending_disconnect=False, + mintable_capacity_StETH=2000, + vault_ind=1, + in_out_delta=100 * 10**18, + ) + } + mock_w3.staking_vaults.get_vaults = MagicMock(return_value=mock_prev_vaults) + + self.accounting = Accounting(mock_w3) + self.accounting.simulate_full_rebase = MagicMock(return_value=mock_report_results) + self.accounting.get_chain_config = MagicMock(return_value=mock_chain_config) + self.accounting._get_slots_elapsed_from_last_report = MagicMock(return_value=block_elapsed) + + vaults = {} + vaults_total_values = [] + + address = ChecksumAddress(vault1) + + # 65020000000000000000,0x0200000000000000000000007228fc874c1d08cae68a558d7b650fc4862b1db7 + vault_info = VaultInfo( + vault_ind=1, + vault=address, + balance=1000 * 10**18, + withdrawal_credentials="0x02", + liability_shares=65 * 10**18, + share_limit=500000000000000000000, + reserve_ratioBP=2000, + forced_rebalance_thresholdBP=1800, + infra_feeBP=500, + liquidity_feeBP=400, + reservation_feeBP=100, + pending_disconnect=False, + mintable_capacity_StETH=52016000000000000000, + in_out_delta=100 * 10**18, + ) + + vaults[address] = vault_info + vaults_total_values.append(65020591618000000000) + + vaults_fee_updated_events = [] + burned_shares_events = [] + minted_shares_events = [] + + address = vault1 + + fee_updated_event = VaultFeesUpdatedEvent( + vault=address, + infra_fee_bp=50, + prev_liquidity_fee_bp=20, + liquidity_fee_bp=20 + 5, + reservation_fee_bp=10, + event="VaultFeesUpdated", + log_index=1, + transaction_index=1, + transaction_hash=HexBytes(f"0x{'a' * 64}"), + address=address, + block_hash=HexBytes(f"0x{'b' * 64}"), + block_number=prev_block_number, + ) + + vaults_fee_updated_events.append(fee_updated_event) + + burned_event = BurnedSharesOnVaultEvent( + vault=address, + amount_of_shares=100, + event="BurnedSharesOnVault", + log_index=1, + transaction_index=1, + transaction_hash=HexBytes(f"0x{'c' * 64}"), + address=address, + block_hash=HexBytes(f"0x{'d' * 64}"), + block_number=prev_block_number + 1, + ) + + burned_shares_events.append(burned_event) + + minted_event = MintedSharesOnVaultEvent( + vault=address, + amount_of_shares=50, + locked_amount=10, + event="MintedSharesOnVault", + log_index=1, + transaction_index=1, + transaction_hash=HexBytes(f"0x{'e' * 64}"), + address=address, + block_hash=HexBytes(f"0x{'f' * 64}"), + block_number=prev_block_number + 2, + ) + + minted_shares_events.append(minted_event) + + mock_w3.lido_contracts.vault_hub.get_vaults_fee_updated_events = MagicMock( + return_value=vaults_fee_updated_events + ) + mock_w3.lido_contracts.vault_hub.get_minted_events = MagicMock(return_value=minted_shares_events) + mock_w3.lido_contracts.vault_hub.get_burned_events = MagicMock(return_value=burned_shares_events) + + actual_fees = self.accounting._get_vaults_fees(cur_block_number, vaults, vaults_total_values) + expected_fees = [649692079630538] + + assert actual_fees == expected_fees diff --git a/tests/modules/accounting/staking_vault/test_staking_vaults_smoke.py b/tests/modules/accounting/staking_vault/test_staking_vaults_smoke.py new file mode 100644 index 000000000..1c545faaf --- /dev/null +++ b/tests/modules/accounting/staking_vault/test_staking_vaults_smoke.py @@ -0,0 +1,214 @@ +import os +from typing import cast + +import pytest +from web3.types import Wei +from web3_multi_provider import init_metrics + +from src import variables +from src.main import ipfs_providers +from src.modules.accounting.accounting import Accounting +from src.modules.accounting.staking_vaults import StakingVaults +from src.modules.submodules.types import ChainConfig +from src.providers.execution.contracts.accounting_oracle import AccountingOracleContract +from src.providers.execution.contracts.hash_consensus import HashConsensusContract +from src.providers.execution.contracts.lazy_oracle import LazyOracleContract +from src.providers.execution.contracts.lido import LidoContract +from src.providers.execution.contracts.lido_locator import LidoLocatorContract +from src.providers.execution.contracts.oracle_daemon_config import ( + OracleDaemonConfigContract, +) +from src.providers.execution.contracts.vault_hub import VaultHubContract +from src.providers.ipfs import MultiIPFSProvider +from src.types import BlockRoot, BlockStamp, ELVaultBalance +from src.utils.apr import calculate_steth_apr +from src.utils.blockstamp import build_blockstamp +from src.web3py.contract_tweak import tweak_w3_contracts +from src.web3py.extensions import ( + ConsensusClientModule, + KeysAPIClientModule, + LazyCSM, + LidoContracts, + LidoValidatorsProvider, + TransactionUtils, +) +from src.web3py.types import Web3 + +EXECUTION_CLIENT_URI = os.getenv('EXECUTION_CLIENT_URI') +CONSENSUS_CLIENT_URI = os.getenv('CONSENSUS_CLIENT_URI') + + +@pytest.mark.skip(reason="Skipping all tests in this class on CI. Cause it's used for local testing") +# @pytest.mark.testnet +# @pytest.mark.integration +class TestStakingVaultsSmoke: + cc: ConsensusClientModule + ipfs_client: MultiIPFSProvider + + def setup_method(self): + self.web3 = Web3(Web3.HTTPProvider(EXECUTION_CLIENT_URI)) + tweak_w3_contracts(self.web3) + + self.cc = ConsensusClientModule([CONSENSUS_CLIENT_URI], self.web3) + self.kac = KeysAPIClientModule(variables.KEYS_API_URI, self.web3) + self.ipfs_client = MultiIPFSProvider(ipfs_providers(), retries=3) + + self.web3.attach_modules( + { + 'lido_contracts': LidoContracts, + 'lido_validators': LidoValidatorsProvider, + 'transaction': TransactionUtils, + 'csm': LazyCSM, + 'cc': lambda: self.cc, # type: ignore[dict-item] + 'kac': lambda: self.kac, # type: ignore[dict-item] + 'ipfs': lambda: self.ipfs_client, # type: ignore[dict-item] + } + ) + + self.web3.staking_vaults = StakingVaults( + self.web3, + self.cc, + self.ipfs_client, + self.web3.lido_contracts.lido, + self.web3.lido_contracts.vault_hub, + self.web3.lido_contracts.lazy_oracle, + self.web3.lido_contracts.oracle_daemon_config, + ) + init_metrics() + self.accounting = Accounting(self.web3) + + self.lido_locator: LidoLocatorContract = cast( + LidoLocatorContract, + self.web3.eth.contract( + address=variables.LIDO_LOCATOR_ADDRESS, + ContractFactoryClass=LidoLocatorContract, + decode_tuples=True, + ), + ) + + self.lido: LidoContract = cast( + LidoContract, + self.web3.eth.contract( + address=self.lido_locator.lido(), + ContractFactoryClass=LidoContract, + decode_tuples=True, + ), + ) + + self.lazy_oracle: LazyOracleContract = cast( + LazyOracleContract, + self.web3.eth.contract( + address=self.lido_locator.lazy_oracle(), + ContractFactoryClass=LazyOracleContract, + decode_tuples=True, + ), + ) + + vault_hub: VaultHubContract = cast( + VaultHubContract, + self.web3.eth.contract( + address=self.lido_locator.lazy_oracle(), + ContractFactoryClass=VaultHubContract, + decode_tuples=True, + ), + ) + + daemon_config: OracleDaemonConfigContract = cast( + OracleDaemonConfigContract, + self.web3.eth.contract( + address=self.lido_locator.oracle_daemon_config(), + ContractFactoryClass=OracleDaemonConfigContract, + decode_tuples=True, + ), + ) + + self.accounting_oracle: AccountingOracleContract = cast( + AccountingOracleContract, + self.web3.eth.contract( + address=self.lido_locator.accounting_oracle(), + ContractFactoryClass=AccountingOracleContract, + decode_tuples=True, + ), + ) + + self.hash_consensus_contract: HashConsensusContract = cast( + HashConsensusContract, + self.web3.eth.contract( + address=self.accounting_oracle.get_consensus_contract(), + ContractFactoryClass=HashConsensusContract, + decode_tuples=True, + ), + ) + + # self.accounting_oracle.get_consensus_contract + + # self.StakingVaults = StakingVaults(self.web3, self.cc, self.ipfs_client, lido, vault_hub, lazy_oracle, daemon_config) + + def get_el_vault_balance(self, blockstamp: BlockStamp) -> ELVaultBalance: + return ELVaultBalance( + Wei( + self.web3.eth.get_balance( + self.lido_locator.el_rewards_vault(blockstamp.block_hash), + block_identifier=blockstamp.block_hash, + ) + ) + ) + + def test_manual_vault_report(self): + block_root = BlockRoot(self.cc.get_block_root('finalized').root) + block_details = self.cc.get_block_details(block_root) + + bs = build_blockstamp(block_details) + # el_balance = self.get_el_vault_balance(bs) + + modules_fee, treasury_fee, base_precision = ( + self.web3.lido_contracts.staking_router.get_staking_fee_aggregate_distribution('latest') + ) + lido_fee_bp = ((modules_fee + treasury_fee) / base_precision) / 0.0001 # 1_000 + + rebased_event = self.web3.lido_contracts.lido.get_last_token_rebased_event( + bs.block_number - 7200, bs.block_number + ) + + time_elapsed = 2316 + + predicted_apr = calculate_steth_apr( + rebased_event.pre_total_shares, + rebased_event.pre_total_ether, + rebased_event.post_total_shares, + rebased_event.post_total_ether, + time_elapsed, + ) + + predicted_apr_bp = predicted_apr * 100 + # core_apr_1 = int(predicted_apr_bp // (lido_fee_bp // 10_000)) + core_apr_2 = int(predicted_apr_bp / lido_fee_bp) + core_apr_3 = int(predicted_apr_bp // lido_fee_bp) + core_apr_4 = int(2.126029181960391e-12 / 0.1) + + print(predicted_apr, predicted_apr_bp, lido_fee_bp) + print(core_apr_2) + print(core_apr_3) + print(core_apr_4) + + # core_apr = int(predicted_apr // (lido_fee_bp // 10_000)) + + # chain_config = self.hash_consensus_contract.get_chain_config() + # print(chain_config) + + # validators = self.cc.get_validators_no_cache(bs) + # pending_deposites = self.cc.get_pending_deposits(bs) + + # tree_data, _, _ = self.StakingVaults.get_vaults_data(bs, validators, pending_deposites) + # merkle_tree = self.StakingVaults.get_merkle_tree(tree_data) + # print(f"0x{merkle_tree.root.hex()}") + + # proof_cid = self.StakingVaults.publish_proofs(merkle_tree, bs, vaults) + # print(proof_cid) + + # proof_tree = self.StakingVaults.publish_tree(merkle_tree, bs, proof_cid) + # print(proof_tree) + + # got = f"0x{merkle_tree.root.hex()}" + # expected = '0xd832e823b84db9ba0d7ba52b3647953c65ae0f86b81949a31605492ebe46f93a' + assert 1 == 1 diff --git a/tests/modules/accounting/test_accounting_module.py b/tests/modules/accounting/test_accounting_module.py index aac6fe512..750f461a3 100644 --- a/tests/modules/accounting/test_accounting_module.py +++ b/tests/modules/accounting/test_accounting_module.py @@ -2,24 +2,40 @@ from unittest.mock import Mock, patch import pytest +from eth_typing import ChecksumAddress, HexAddress, HexStr from web3.exceptions import ContractCustomError from web3.types import Wei from src import variables from src.modules.accounting import accounting as accounting_module -from src.modules.accounting.accounting import Accounting -from src.modules.accounting.accounting import logger as accounting_logger +from src.modules.accounting.accounting import Accounting, logger as accounting_logger +from src.modules.accounting.staking_vaults import StakingVaults from src.modules.accounting.third_phase.types import FormatList -from src.modules.accounting.types import LidoReportRebase, AccountingProcessingState +from src.modules.accounting.types import ( + AccountingProcessingState, + ReportResults, + ReportValues, + StakingRewardsDistribution, + VaultsData, + VaultsMap, + VaultTreeNode, + VaultInfo, +) from src.modules.submodules.oracle_module import ModuleExecuteDelay -from src.modules.submodules.types import ChainConfig, FrameConfig, CurrentFrame, ZERO_HASH +from src.modules.submodules.types import ( + ZERO_HASH, + ChainConfig, + CurrentFrame, + FrameConfig, +) +from src.providers.consensus.types import Validator, ValidatorState from src.services.withdrawal import Withdrawal -from src.types import BlockStamp, ReferenceBlockStamp +from src.types import BlockStamp, EpochNumber, Gwei, ReferenceBlockStamp, ValidatorIndex from src.web3py.extensions.lido_validators import NodeOperatorId, StakingModule from tests.factory.base_oracle import AccountingProcessingStateFactory from tests.factory.blockstamp import BlockStampFactory, ReferenceBlockStampFactory from tests.factory.configs import ChainConfigFactory, FrameConfigFactory -from tests.factory.contract_responses import LidoReportRebaseFactory +from tests.factory.contract_responses import ReportResultsFactory from tests.factory.no_registry import LidoValidatorFactory, StakingModuleFactory @@ -138,9 +154,26 @@ def test_get_consensus_lido_state(accounting: Accounting): ], ) def test_get_finalization_data(accounting: Accounting, post_total_pooled_ether, post_total_shares, expected_share_rate): - lido_rebase = LidoReportRebaseFactory.build( + lido_rebase = ReportResultsFactory.build( post_total_pooled_ether=post_total_pooled_ether, post_total_shares=post_total_shares, + withdrawals=Wei(0), + el_rewards=Wei(0), + ether_to_finalize_wq=0, + shares_to_finalize_wq=0, + shares_to_burn_for_withdrawals=0, + total_shares_to_burn=0, + shares_to_mint_as_fees=0, + reward_distribution=StakingRewardsDistribution( + recipients=[], + module_ids=[], + modules_fees=[], + total_fee=0, + precision_points=0, + ), + principal_cl_balance=0, + post_internal_shares=0, + post_internal_ether=0, ) accounting.get_chain_config = Mock(return_value=ChainConfigFactory.build()) @@ -153,15 +186,9 @@ def test_get_finalization_data(accounting: Accounting, post_total_pooled_ether, with patch.object(Withdrawal, '__init__', return_value=None), patch.object( Withdrawal, 'get_finalization_batches', return_value=[] ): - share_rate, batches = accounting._get_finalization_data(bs) + batches = accounting._get_finalization_batches(bs) assert batches == [] - assert share_rate == expected_share_rate - - if post_total_pooled_ether > post_total_shares: - assert share_rate > 10**27 - else: - assert share_rate <= 10**27 @pytest.mark.unit @@ -440,13 +467,128 @@ def test_simulate_rebase_after_report( accounting.w3.lido_contracts.get_withdrawal_balance = Mock(return_value=17) accounting.get_shares_to_burn = Mock(return_value=13) + validators: list[Validator] = [ + Validator( + index=ValidatorIndex(1985), + balance=Gwei(32834904184), + validator=ValidatorState( + pubkey='0x862d53d9e4313374d202f2b28e6ffe64efb0312f9c2663f2eef67b72345faa8932b27f9b9bb7b476d9b5e418fea99124', + withdrawal_credentials='0x020000000000000000000000ecb7c8d2baf7270f90066b4cd8286e2ca1154f60', + effective_balance=Gwei(32000000000), + slashed=False, + activation_eligibility_epoch=EpochNumber(225469), + activation_epoch=EpochNumber(225475), + exit_epoch=EpochNumber(18446744073709551615), + withdrawable_epoch=EpochNumber(18446744073709551615), + ), + ), + Validator( + index=ValidatorIndex(1986), + balance=Gwei(0), + validator=ValidatorState( + pubkey='0xa5d9411ef615c74c9240634905d5ddd46dc40a87a09e8cc0332afddb246d291303e452a850917eefe09b3b8c70a307ce', + withdrawal_credentials='0x020000000000000000000000ecb7c8d2baf7270f90066b4cd8286e2ca1154f60', + effective_balance=Gwei(0), + slashed=False, + activation_eligibility_epoch=EpochNumber(226130), + activation_epoch=EpochNumber(226136), + exit_epoch=EpochNumber(227556), + withdrawable_epoch=EpochNumber(227812), + ), + ), + ] + accounting.w3.cc = Mock() + accounting.w3.cc.get_validators = Mock(return_value=validators) + + tree_data: list[VaultTreeNode] = [ + ('0xEcB7C8D2BaF7270F90066B4cd8286e2CA1154F60', 99786510875371698360, 33000000000000000000, 0, 0), + ('0xc1F9c4a809cbc6Cb2cA60bCa09cE9A55bD5337Db', 2500000000000000000, 2500000000000000000, 0, 1), + ] + vaults: VaultsMap = { + ChecksumAddress(HexAddress(HexStr('0xEcB7C8D2BaF7270F90066B4cd8286e2CA1154F60'))): VaultInfo( + vault_ind=0, + balance=66951606691371698360, + in_out_delta=33000000000000000000, + liability_shares=0, + vault='0xEcB7C8D2BaF7270F90066B4cd8286e2CA1154F60', + withdrawal_credentials='0x020000000000000000000000ecb7c8d2baf7270f90066b4cd8286e2ca1154f60', + share_limit=0, + reserve_ratioBP=0, + forced_rebalance_thresholdBP=0, + infra_feeBP=0, + liquidity_feeBP=0, + reservation_feeBP=0, + pending_disconnect=False, + mintable_capacity_StETH=0, + ), + ChecksumAddress(HexAddress(HexStr('0xc1F9c4a809cbc6Cb2cA60bCa09cE9A55bD5337Db'))): VaultInfo( + vault_ind=1, + balance=2500000000000000000, + in_out_delta=2500000000000000000, + liability_shares=1, + vault='0xc1F9c4a809cbc6Cb2cA60bCa09cE9A55bD5337Db', + withdrawal_credentials='0x020000000000000000000000c1f9c4a809cbc6cb2ca60bca09ce9a55bd5337db', + share_limit=0, + reserve_ratioBP=0, + forced_rebalance_thresholdBP=0, + infra_feeBP=0, + liquidity_feeBP=0, + reservation_feeBP=0, + pending_disconnect=False, + mintable_capacity_StETH=0, + ), + } + vaults_total_values = [] + mock_vaults_data: VaultsData = (tree_data, vaults, vaults_total_values) + accounting.w3.staking_vaults = Mock() + accounting.w3.staking_vaults.get_vaults_data = Mock(return_value=mock_vaults_data) + accounting.w3.staking_vaults.publish_proofs = Mock(return_value='proof_cid') + accounting.w3.staking_vaults.publish_tree = Mock(return_value='tree_cid') + accounting.w3.staking_vaults.get_merkle_tree = Mock(return_value=StakingVaults.get_merkle_tree(tree_data)) + accounting._get_consensus_lido_state = Mock(return_value=(0, 0)) accounting._get_slots_elapsed_from_last_report = Mock(return_value=42) - accounting.w3.lido_contracts.lido.handle_oracle_report = Mock(return_value=LidoReportRebaseFactory.build()) # type: ignore + accounting.w3.lido_contracts.accounting = Mock() + + accounting.w3.lido_contracts.accounting.simulate_oracle_report = Mock( + return_value=ReportResults( + withdrawals=Wei(0), + el_rewards=Wei(0), + ether_to_finalize_wq=0, + shares_to_finalize_wq=0, + shares_to_burn_for_withdrawals=0, + total_shares_to_burn=0, + shares_to_mint_as_fees=0, + reward_distribution=StakingRewardsDistribution( + recipients=[], module_ids=[], modules_fees=[], total_fee=0, precision_points=0 + ), + principal_cl_balance=0, + post_internal_shares=0, + post_internal_ether=0, + post_total_shares=0, + post_total_pooled_ether=0, + pre_total_shares=0, + pre_total_pooled_ether=0, + ) + ) out = accounting.simulate_rebase_after_report(ref_bs, Wei(0)) - assert isinstance(out, LidoReportRebase), "simulate_rebase_after_report returned unexpected value" + accounting.w3.lido_contracts.accounting.simulate_oracle_report.assert_called_once_with( + ReportValues( + timestamp=1678794852, + time_elapsed=504, + cl_validators=0, + cl_balance=Wei(0), + withdrawal_vault_balance=Wei(17), + el_rewards_vault_balance=Wei(0), + shares_requested_to_burn=13, + withdrawal_finalization_batches=[], + ), + 0, + '0x0d339fdfa3018561311a39bf00568ed08048055082448d17091d5a4dc2fa035b', + ) + assert isinstance(out, ReportResults), "simulate_rebase_after_report returned unexpected value" @pytest.mark.unit diff --git a/tests/modules/accounting/test_withdrawal_integration.py b/tests/modules/accounting/test_withdrawal_integration.py index 7d86041e9..78f131565 100644 --- a/tests/modules/accounting/test_withdrawal_integration.py +++ b/tests/modules/accounting/test_withdrawal_integration.py @@ -43,6 +43,7 @@ def subject(web3_integration, past_blockstamp, chain_config, frame_config): return Withdrawal(web3_integration, past_blockstamp, chain_config, frame_config) +@pytest.mark.testnet @pytest.mark.integration def test_happy_path(subject, past_blockstamp): withdrawal_vault_balance = subject.w3.lido_contracts.get_withdrawal_balance(past_blockstamp) diff --git a/tests/modules/accounting/test_withdrawal_unit.py b/tests/modules/accounting/test_withdrawal_unit.py index 4e1e03eb5..f1e66d703 100644 --- a/tests/modules/accounting/test_withdrawal_unit.py +++ b/tests/modules/accounting/test_withdrawal_unit.py @@ -39,6 +39,7 @@ def test_returns_empty_batch_if_there_is_no_requests(subject: Withdrawal): result = subject.get_finalization_batches(True, 100, 0, 0) + subject.w3.lido_contracts.withdrawal_queue_nft.is_paused.assert_called_once_with(subject.blockstamp.block_hash) assert result == [] @@ -47,6 +48,7 @@ def test_returns_empty_batch_if_paused(subject: Withdrawal): subject.w3.lido_contracts.withdrawal_queue_nft.is_paused.return_value = True result = subject.get_finalization_batches(True, 100, 0, 0) + subject.w3.lido_contracts.withdrawal_queue_nft.is_paused.assert_called_once_with(subject.blockstamp.block_hash) assert result == [] @@ -59,7 +61,10 @@ def test_returns_batch_if_there_are_finalizable_requests(subject: Withdrawal): subject.safe_border_service.get_safe_border_epoch = Mock(return_value=0) subject._calculate_finalization_batches = Mock(return_value=[1, 2, 3]) - assert subject.get_finalization_batches(True, 100, 0, 0) == [1, 2, 3] + result = subject.get_finalization_batches(True, 100, 0, 0) + + subject.w3.lido_contracts.withdrawal_queue_nft.is_paused.assert_called_once_with(subject.blockstamp.block_hash) + assert result == [1, 2, 3] @pytest.mark.unit @@ -70,6 +75,7 @@ def test_no_available_eth_to_cover_wc(subject: Withdrawal): result = subject.get_finalization_batches(False, 100, 0, 0) + subject.w3.lido_contracts.withdrawal_queue_nft.is_paused.assert_called_once_with(subject.blockstamp.block_hash) assert result == [] diff --git a/tests/modules/submodules/consensus/test_reports.py b/tests/modules/submodules/consensus/test_reports.py index d2952dd86..2033a5a2b 100644 --- a/tests/modules/submodules/consensus/test_reports.py +++ b/tests/modules/submodules/consensus/test_reports.py @@ -3,12 +3,14 @@ import pytest from eth_typing import ChecksumAddress from hexbytes import HexBytes +from web3.types import Wei from dataclasses import dataclass from src import variables from src.modules.accounting.accounting import Accounting from src.modules.accounting.types import ReportData from src.modules.submodules.types import ChainConfig, FrameConfig, ZERO_HASH +from src.types import SlotNumber, Gwei, StakingModuleId from tests.factory.blockstamp import ReferenceBlockStampFactory from tests.factory.member_info import MemberInfoFactory @@ -53,7 +55,22 @@ def test_process_report_main(consensus, caplog): consensus.get_member_info = Mock(return_value=member_info) consensus._send_report_hash = Mock() report_data = ReportData( - 1, 2, 3, 4, [5, 6], [7, 8], 9, 10, 11, [12], 13, True, 13, HexBytes(int.to_bytes(14, 32)), 15 + consensus_version=1, + ref_slot=SlotNumber(2), + validators_count=3, + cl_balance_gwei=Gwei(4), + staking_module_ids_with_exited_validators=[StakingModuleId(5), StakingModuleId(6)], + count_exited_validators_by_staking_module=[7, 8], + withdrawal_vault_balance=Wei(9), + el_rewards_vault_balance=Wei(10), + shares_requested_to_burn=11, + withdrawal_finalization_batches=[12], + tree_root=bytes([0]), + tree_cid="tree_cid", + is_bunker=True, + extra_data_format=13, + extra_data_hash=HexBytes(int.to_bytes(14, 32)), + extra_data_items_count=15, ).as_tuple() consensus.build_report = Mock(return_value=report_data) @@ -67,10 +84,27 @@ def test_process_report_main(consensus, caplog): # ----- Hash calculations ---------- @pytest.mark.unit def test_hash_calculations(consensus): - rd = ReportData(1, 2, 3, 4, [5, 6], [7, 8], 9, 10, 11, [12], 13, True, 13, HexBytes(int.to_bytes(14, 32)), 15) + rd = ReportData( + consensus_version=1, + ref_slot=SlotNumber(2), + validators_count=3, + cl_balance_gwei=Gwei(4), + staking_module_ids_with_exited_validators=[StakingModuleId(5), StakingModuleId(6)], + count_exited_validators_by_staking_module=[7, 8], + withdrawal_vault_balance=Wei(9), + el_rewards_vault_balance=Wei(10), + shares_requested_to_burn=11, + withdrawal_finalization_batches=[12], + tree_root=bytes([0]), + tree_cid="tree_cid", + is_bunker=True, + extra_data_format=13, + extra_data_hash=HexBytes(int.to_bytes(14, 32)), + extra_data_items_count=15, + ) report_hash = consensus._encode_data_hash(rd.as_tuple()) assert isinstance(report_hash, HexBytes) - assert report_hash == HexBytes('0x8028b6539e5a5690c15e14f075bd6484fbaa4a6dc2e39e9d1fe9000a5dfa9d14') + assert report_hash == HexBytes('0x67121dd95e262d76aee8747047ae886205e0316661bb7eed9ba407a6b0e61f7f') # ------ Process report hash ----------- @@ -179,10 +213,10 @@ def test_process_report_data_main_data_submitted(consensus, caplog, mock_latest_ @pytest.mark.unit def test_process_report_data_main_sleep_until_data_submitted(consensus, caplog, mock_latest_data): consensus.w3.lido_contracts.accounting_oracle.get_consensus_version = Mock( - return_value=Accounting.COMPATIBLE_CONSENSUS_VERSION + return_value=consensus.COMPATIBLE_CONSENSUS_VERSION ) consensus.w3.lido_contracts.accounting_oracle.get_contract_version = Mock( - return_value=Accounting.COMPATIBLE_CONTRACT_VERSION + return_value=consensus.COMPATIBLE_CONTRACT_VERSION ) consensus.get_chain_config = Mock( return_value=ChainConfig( @@ -193,7 +227,22 @@ def test_process_report_data_main_sleep_until_data_submitted(consensus, caplog, ) blockstamp = ReferenceBlockStampFactory.build() report_data = ReportData( - 1, 2, 3, 4, [5, 6], [7, 8], 9, 10, 11, [12], 13, True, 13, HexBytes(int.to_bytes(14, 32)), 15 + consensus_version=consensus.COMPATIBLE_CONSENSUS_VERSION, + ref_slot=SlotNumber(2), + validators_count=3, + cl_balance_gwei=Gwei(4), + staking_module_ids_with_exited_validators=[StakingModuleId(5), StakingModuleId(6)], + count_exited_validators_by_staking_module=[7, 8], + withdrawal_vault_balance=Wei(9), + el_rewards_vault_balance=Wei(10), + shares_requested_to_burn=11, + withdrawal_finalization_batches=[12], + tree_root=bytes([0]), + tree_cid="tree_cid", + is_bunker=True, + extra_data_format=13, + extra_data_hash=HexBytes(int.to_bytes(14, 32)), + extra_data_items_count=15, ).as_tuple() report_hash = int.to_bytes(1, 32) @@ -203,7 +252,7 @@ def test_process_report_data_main_sleep_until_data_submitted(consensus, caplog, consensus._process_report_data(blockstamp, report_data, report_hash) assert "Sleep for 100 slots before sending data." in caplog.text - assert f"Send report data. Contract version: [{Accounting.COMPATIBLE_CONTRACT_VERSION}]" in caplog.text + assert f"Send report data. Contract version: [{consensus.COMPATIBLE_CONTRACT_VERSION}]" in caplog.text @pytest.mark.unit @@ -232,14 +281,29 @@ def test_process_report_data_sleep_ends(consensus, caplog, mock_latest_data): @pytest.mark.unit def test_process_report_submit_report(consensus, caplog, mock_latest_data): consensus.w3.lido_contracts.accounting_oracle.get_consensus_version = Mock( - return_value=Accounting.COMPATIBLE_CONSENSUS_VERSION + return_value=consensus.COMPATIBLE_CONSENSUS_VERSION ) consensus.w3.lido_contracts.accounting_oracle.get_contract_version = Mock( - return_value=Accounting.COMPATIBLE_CONTRACT_VERSION + return_value=consensus.COMPATIBLE_CONTRACT_VERSION ) blockstamp = ReferenceBlockStampFactory.build() report_data = ReportData( - 1, 2, 3, 4, [5, 6], [7, 8], 9, 10, 11, [12], 13, True, 13, HexBytes(int.to_bytes(14, 32)), 15 + consensus_version=consensus.COMPATIBLE_CONSENSUS_VERSION, + ref_slot=SlotNumber(2), + validators_count=3, + cl_balance_gwei=Gwei(4), + staking_module_ids_with_exited_validators=[StakingModuleId(5), StakingModuleId(6)], + count_exited_validators_by_staking_module=[7, 8], + withdrawal_vault_balance=Wei(9), + el_rewards_vault_balance=Wei(10), + shares_requested_to_burn=11, + withdrawal_finalization_batches=[12], + is_bunker=True, + tree_root=bytes([0]), + tree_cid="tree_cid", + extra_data_format=13, + extra_data_hash=HexBytes(int.to_bytes(14, 32)), + extra_data_items_count=15, ).as_tuple() report_hash = int.to_bytes(1, 32) @@ -250,7 +314,7 @@ def test_process_report_submit_report(consensus, caplog, mock_latest_data): consensus._submit_report = Mock() consensus._process_report_data(blockstamp, report_data, report_hash) - assert f"Send report data. Contract version: [{Accounting.COMPATIBLE_CONTRACT_VERSION}]" in caplog.text + assert f"Send report data. Contract version: [{consensus.COMPATIBLE_CONTRACT_VERSION}]" in caplog.text # ----- Test sleep calculations diff --git a/tests/providers/test_lazy_oracle.py b/tests/providers/test_lazy_oracle.py new file mode 100644 index 000000000..9b51f90ed --- /dev/null +++ b/tests/providers/test_lazy_oracle.py @@ -0,0 +1,14 @@ +import pytest + + +@pytest.mark.testnet +@pytest.mark.integration +class TestLazyOracleHubSmoke: + + def test_vault_lazy_oracle_get_report(self, web3_integration): + report = web3_integration.lido_contracts.lazy_oracle.get_report(block_identifier='latest') + assert report is not None + + def test_get_vaults(self, web3_integration): + vaults = web3_integration.lido_contracts.lazy_oracle.get_all_vaults(block_identifier='latest') + assert len(vaults) != 0 diff --git a/tests/providers/test_lido.py b/tests/providers/test_lido.py new file mode 100644 index 000000000..c750f9765 --- /dev/null +++ b/tests/providers/test_lido.py @@ -0,0 +1,41 @@ +from typing import cast + +import pytest +from web3.exceptions import Web3Exception + +from src import variables +from src.providers.execution.contracts.lido import LidoContract +from src.providers.execution.contracts.lido_locator import LidoLocatorContract + + +@pytest.mark.testnet +@pytest.mark.integration +class TestLidoSmoke: + + @pytest.fixture + def lido(self, web3_integration): + lido_locator: LidoLocatorContract = cast( + LidoLocatorContract, + web3_integration.eth.contract( + address=variables.LIDO_LOCATOR_ADDRESS, + ContractFactoryClass=LidoLocatorContract, + decode_tuples=True, + ), + ) + + return cast( + LidoContract, + web3_integration.eth.contract( + address=lido_locator.lido(), + ContractFactoryClass=LidoContract, + decode_tuples=True, + ), + ) + + def test_last_token_rebased_event(self, lido, web3_integration): + try: + rebased_event = lido.get_last_token_rebased_event(634086 - 1_000, 634086) + + assert rebased_event is not None + except Web3Exception as e: + print(f"Error: {e}") diff --git a/tests/providers/test_vault_hub.py b/tests/providers/test_vault_hub.py new file mode 100644 index 000000000..622463a3e --- /dev/null +++ b/tests/providers/test_vault_hub.py @@ -0,0 +1,31 @@ +import pytest +from web3.exceptions import Web3Exception + + +@pytest.mark.testnet +@pytest.mark.integration +class TestVaultHubSmoke: + + def test_get_burned_events(self, web3_integration): + try: + events = web3_integration.lido_contracts.vault_hub.get_burned_events(634086 - 1_000, 634086) + + assert len(events) != 0 + except Web3Exception as e: + print(f"Error: {e}") + + def test_get_minted_events(self, web3_integration): + try: + events = web3_integration.lido_contracts.vault_hub.get_minted_events(634086 - 1_000, 634086) + + assert len(events) != 0 + except Web3Exception as e: + print(f"Error: {e}") + + def test_get_updated_events(self, web3_integration): + try: + events = web3_integration.lido_contracts.vault_hub.get_vaults_fee_updated_events(634086 - 1_000, 634_086) + + assert len(events) == 0 + except Web3Exception as e: + print(f"Error: {e}") diff --git a/tests/utils/test_deposit_signature.py b/tests/utils/test_deposit_signature.py new file mode 100644 index 000000000..d9ceda983 --- /dev/null +++ b/tests/utils/test_deposit_signature.py @@ -0,0 +1,111 @@ +"""Test for utils.deposit_signature module""" + +import pytest + +from src.utils.deposit_signature import ( + compute_fork_data_root, + compute_domain, + is_valid_deposit_signature, + GENESIS_FORK_VERSION, + GENESIS_VALIDATORS_ROOT, + DOMAIN_DEPOSIT_TYPE, +) +from src.utils.types import hex_str_to_bytes + +HOODI_FORK_VERSION = "0x10000910" + + +@pytest.mark.parametrize( + "fork_version, genesis_validators_root, expected", + [ + ( + GENESIS_FORK_VERSION, + GENESIS_VALIDATORS_ROOT, + bytes.fromhex("f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b"), + ), + ( + HOODI_FORK_VERSION, + GENESIS_VALIDATORS_ROOT, + bytes.fromhex("719103511efa4f1362ff2a50996cccf329cc84cb410c5e5c7d351d0353d25e6c"), + ), + ], +) +@pytest.mark.unit +def test_compute_fork_data_root(fork_version, genesis_validators_root, expected): + fork_version_bytes = hex_str_to_bytes(fork_version) + fork_data_root = compute_fork_data_root(fork_version_bytes, bytes(genesis_validators_root)) + + print(fork_data_root.hex()) + assert isinstance(fork_data_root, bytes) + assert len(fork_data_root) == 32 # Should be 32 bytes + assert fork_data_root == expected + + +@pytest.mark.parametrize( + "domain_type, fork_version, genesis_validators_root, expected", + [ + ( + DOMAIN_DEPOSIT_TYPE, + GENESIS_FORK_VERSION, + GENESIS_VALIDATORS_ROOT, + bytes.fromhex("03000000f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a9"), + ), + ( + DOMAIN_DEPOSIT_TYPE, + HOODI_FORK_VERSION, + GENESIS_VALIDATORS_ROOT, + bytes.fromhex("03000000719103511efa4f1362ff2a50996cccf329cc84cb410c5e5c7d351d03"), + ), + ], +) +@pytest.mark.unit +def test_compute_domain(domain_type, fork_version, genesis_validators_root, expected): + domain = compute_domain(bytes(domain_type), hex_str_to_bytes(fork_version), bytes(genesis_validators_root)) + + print(domain.hex()) + assert len(domain) == 32 # Should be 32 bytes + assert isinstance(domain, bytes) + assert domain[:4] == domain_type # First byte should be domain type + assert domain == expected + + +@pytest.mark.parametrize( + "pubkey, withdrawal_credentials, amount_gwei, signature, expected", + [ + # This one uses fork_version 0x00000000 (not for Hoodi, thus should be False) + ( + "a50a7821c793e80710f51c681b28f996e5c2f1fa00318dbf91b5844822d58ac2fef892b79aea386a3b97829e090a393e", + "020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc", + 1000000000, + "b5b222b452892bd62a7d2b4925e15bf9823c4443313d86d3e1fe549c86aa8919d0cdd1d5b60d9d3184f3966ced21699f124a14a0d8c1f1ae3e9f25715f40c3e7b81a909424c60ca7a8cbd79f101d6bd86ce1bdd39701cf93b2eecce10699f40b", + False, + ), + # Those two are valid signatures for Hoodi + ( + "8c96ad1b9a1acf4a898009d96293d191ab911b535cd1e6618e76897b5fa239a7078f1fbf9de8dd07a61a51b137c74a87", + "020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc", + 1000000000, + "978f286178050a3dbf6f8551b8020f72dd1de8223fc9cb8553d5ebb22f71164f4278d9b970467084a9dcd54ad07ec8d60792104ff82887b499346f3e8adc55a86f26bfbb032ac2524da42d5186c5a8ed0ccf9d98e9f6ff012cfafbd712335aa5", + True, + ), + ( + "99eeb66e77fef5c71d3b303774ecded0d52d521e8d665c2d0f350c33f5f82e7ddd88dd9bc4f8014fb22820beda3a8a85", + "020000000000000000000000652b70e0ae932896035d553feaa02f37ab34f7dc", + 1000000000, + "b4ea337eb8d0fc47361672d4a153dbe3cd943a0418c9f1bc586bca95cdcf8615d60a2394b7680276c4597a2524f9bcf1088c40a08902841ff68d508a9f825803b9fac3bc6333cf3afa7503f560ccf6f689be5b0f5d08fa9e21cb203aa1f53259", + True, + ), + ], +) +@pytest.mark.unit +def test_is_valid_deposit_signature(pubkey, withdrawal_credentials, amount_gwei, signature, expected): + result = is_valid_deposit_signature( + pubkey=bytes.fromhex(pubkey), + withdrawal_credentials=bytes.fromhex(withdrawal_credentials), + amount_gwei=amount_gwei, + signature=bytes.fromhex(signature), + fork_version=HOODI_FORK_VERSION, + genesis_validators_root=GENESIS_VALIDATORS_ROOT, + ) + + assert result == expected