diff --git a/.github/workflows/tests_and_checks.yml b/.github/workflows/tests_and_checks.yml index 9140f60..e760ddc 100644 --- a/.github/workflows/tests_and_checks.yml +++ b/.github/workflows/tests_and_checks.yml @@ -1,19 +1,18 @@ name: Tests and checks on: - push: - branches: - - main + pull_request: + jobs: - test: + lint: name: Linter runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: 'yarn' - name: Install dependencies run: yarn install --immutable @@ -21,3 +20,25 @@ jobs: run: yarn lint - name: Run check types run: yarn check-types + + test: + name: Tests + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: Set up node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'yarn' + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + - name: Check Foundry installation + run: | + anvil --version + cast --version + - name: Install dependencies + run: yarn install --immutable + - name: Run tests + run: yarn test:run diff --git a/.gitignore b/.gitignore index 7e554f2..25060f2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ node_modules .vscode .DS_Store +.idea reports/* wallets/* diff --git a/abi/NodeOperatorsRegistry.json b/abi/NodeOperatorsRegistry.json index bbff816..8d68cfd 100644 --- a/abi/NodeOperatorsRegistry.json +++ b/abi/NodeOperatorsRegistry.json @@ -1,1634 +1 @@ -[ - { - "constant": true, - "inputs": [], - "name": "hasInitialized", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_targetLimitMode", - "type": "uint256" - }, - { - "name": "_targetLimit", - "type": "uint256" - } - ], - "name": "updateTargetValidatorsLimits", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_keysCount", - "type": "uint256" - }, - { - "name": "_publicKeys", - "type": "bytes" - }, - { - "name": "_signatures", - "type": "bytes" - } - ], - "name": "addSigningKeys", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getType", - "outputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "view", - "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": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "clearNodeOperatorPenalty", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getRecoveryVault", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_offset", - "type": "uint256" - }, - { - "name": "_limit", - "type": "uint256" - } - ], - "name": "getNodeOperatorIds", - "outputs": [ - { - "name": "nodeOperatorIds", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_offset", - "type": "uint256" - }, - { - "name": "_limit", - "type": "uint256" - } - ], - "name": "getSigningKeys", - "outputs": [ - { - "name": "pubkeys", - "type": "bytes" - }, - { - "name": "signatures", - "type": "bytes" - }, - { - "name": "used", - "type": "bool[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_fromIndex", - "type": "uint256" - }, - { - "name": "_keysCount", - "type": "uint256" - } - ], - "name": "removeSigningKeysOperatorBH", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "getNodeOperatorIsActive", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_name", - "type": "string" - } - ], - "name": "setNodeOperatorName", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_totalRewardShares", - "type": "uint256" - } - ], - "name": "getRewardsDistribution", - "outputs": [ - { - "name": "recipients", - "type": "address[]" - }, - { - "name": "shares", - "type": "uint256[]" - }, - { - "name": "penalized", - "type": "bool[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_indexFrom", - "type": "uint256" - }, - { - "name": "_indexTo", - "type": "uint256" - } - ], - "name": "invalidateReadyToDepositKeysRange", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_locator", - "type": "address" - }, - { - "name": "_type", - "type": "bytes32" - }, - { - "name": "_stuckPenaltyDelay", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_delay", - "type": "uint256" - } - ], - "name": "setStuckPenaltyDelay", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "finalizeUpgrade_v3", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getStuckPenaltyDelay", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_index", - "type": "uint256" - } - ], - "name": "removeSigningKey", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getRewardDistributionState", - "outputs": [ - { - "name": "", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_fromIndex", - "type": "uint256" - }, - { - "name": "_keysCount", - "type": "uint256" - } - ], - "name": "removeSigningKeys", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "isOperatorPenalized", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "deactivateNodeOperator", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "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": "STAKING_ROUTER_ROLE", - "outputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_keysCount", - "type": "uint256" - }, - { - "name": "_publicKeys", - "type": "bytes" - }, - { - "name": "_signatures", - "type": "bytes" - } - ], - "name": "addSigningKeysOperatorBH", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "appId", - "outputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getActiveNodeOperatorsCount", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_name", - "type": "string" - }, - { - "name": "_rewardAddress", - "type": "address" - } - ], - "name": "addNodeOperator", - "outputs": [ - { - "name": "id", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "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": true, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "getUnusedSigningKeyCount", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "", - "type": "uint256" - } - ], - "name": "onRewardsMinted", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MANAGE_NODE_OPERATOR_ROLE", - "outputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "distributeReward", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "onWithdrawalCredentialsChanged", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "activateNodeOperator", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_rewardAddress", - "type": "address" - } - ], - "name": "setNodeOperatorRewardAddress", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_fullInfo", - "type": "bool" - } - ], - "name": "getNodeOperator", - "outputs": [ - { - "name": "active", - "type": "bool" - }, - { - "name": "name", - "type": "string" - }, - { - "name": "rewardAddress", - "type": "address" - }, - { - "name": "totalVettedValidators", - "type": "uint64" - }, - { - "name": "totalExitedValidators", - "type": "uint64" - }, - { - "name": "totalAddedValidators", - "type": "uint64" - }, - { - "name": "totalDepositedValidators", - "type": "uint64" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_locator", - "type": "address" - }, - { - "name": "_type", - "type": "bytes32" - }, - { - "name": "_stuckPenaltyDelay", - "type": "uint256" - } - ], - "name": "finalizeUpgrade_v2", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getStakingModuleSummary", - "outputs": [ - { - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorIds", - "type": "bytes" - }, - { - "name": "_exitedValidatorsCounts", - "type": "bytes" - } - ], - "name": "updateExitedValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorIds", - "type": "bytes" - }, - { - "name": "_stuckValidatorsCounts", - "type": "bytes" - } - ], - "name": "updateStuckValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_token", - "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": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_refundedValidatorsCount", - "type": "uint256" - } - ], - "name": "updateRefundedValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getEVMScriptRegistry", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getNodeOperatorsCount", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_vettedSigningKeysCount", - "type": "uint64" - } - ], - "name": "setNodeOperatorStakingLimit", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "getNodeOperatorSummary", - "outputs": [ - { - "name": "targetLimitMode", - "type": "uint256" - }, - { - "name": "targetValidatorsCount", - "type": "uint256" - }, - { - "name": "stuckValidatorsCount", - "type": "uint256" - }, - { - "name": "refundedValidatorsCount", - "type": "uint256" - }, - { - "name": "stuckPenaltyEndTimestamp", - "type": "uint256" - }, - { - "name": "totalExitedValidators", - "type": "uint256" - }, - { - "name": "totalDepositedValidators", - "type": "uint256" - }, - { - "name": "depositableValidatorsCount", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_index", - "type": "uint256" - } - ], - "name": "getSigningKey", - "outputs": [ - { - "name": "key", - "type": "bytes" - }, - { - "name": "depositSignature", - "type": "bytes" - }, - { - "name": "used", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MAX_NODE_OPERATOR_NAME_LENGTH", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorIds", - "type": "bytes" - }, - { - "name": "_vettedSigningKeysCounts", - "type": "bytes" - } - ], - "name": "decreaseVettedSigningKeysCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_depositsCount", - "type": "uint256" - }, - { - "name": "", - "type": "bytes" - } - ], - "name": "obtainDepositData", - "outputs": [ - { - "name": "publicKeys", - "type": "bytes" - }, - { - "name": "signatures", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getKeysOpIndex", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getNonce", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "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": "getLocator", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "SET_NODE_OPERATOR_LIMIT_ROLE", - "outputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "getTotalSigningKeyCount", - "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": "MAX_STUCK_PENALTY_DELAY", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "onExitedAndStuckValidatorsCountsUpdated", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MAX_NODE_OPERATORS_COUNT", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_index", - "type": "uint256" - } - ], - "name": "removeSigningKeyOperatorBH", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_exitedValidatorsCount", - "type": "uint256" - }, - { - "name": "_stuckValidatorsCount", - "type": "uint256" - } - ], - "name": "unsafeUpdateValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MANAGE_SIGNING_KEYS", - "outputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - } - ], - "name": "isOperatorPenaltyCleared", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "name", - "type": "string" - }, - { - "indexed": false, - "name": "rewardAddress", - "type": "address" - }, - { - "indexed": false, - "name": "stakingLimit", - "type": "uint64" - } - ], - "name": "NodeOperatorAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "active", - "type": "bool" - } - ], - "name": "NodeOperatorActiveSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "name", - "type": "string" - } - ], - "name": "NodeOperatorNameSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "rewardAddress", - "type": "address" - } - ], - "name": "NodeOperatorRewardAddressSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "totalKeysTrimmed", - "type": "uint64" - } - ], - "name": "NodeOperatorTotalKeysTrimmed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "keysOpIndex", - "type": "uint256" - } - ], - "name": "KeysOpIndexSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "moduleType", - "type": "bytes32" - } - ], - "name": "StakingModuleTypeSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "rewardAddress", - "type": "address" - }, - { - "indexed": false, - "name": "sharesAmount", - "type": "uint256" - } - ], - "name": "RewardsDistributed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "state", - "type": "uint8" - } - ], - "name": "RewardDistributionStateChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "locatorAddress", - "type": "address" - } - ], - "name": "LocatorContractSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "approvedValidatorsCount", - "type": "uint256" - } - ], - "name": "VettedSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "depositedValidatorsCount", - "type": "uint256" - } - ], - "name": "DepositedSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "exitedValidatorsCount", - "type": "uint256" - } - ], - "name": "ExitedSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "totalValidatorsCount", - "type": "uint256" - } - ], - "name": "TotalSigningKeysCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "nonce", - "type": "uint256" - } - ], - "name": "NonceChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "stuckPenaltyDelay", - "type": "uint256" - } - ], - "name": "StuckPenaltyDelayChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "stuckValidatorsCount", - "type": "uint256" - }, - { - "indexed": false, - "name": "refundedValidatorsCount", - "type": "uint256" - }, - { - "indexed": false, - "name": "stuckPenaltyEndTimestamp", - "type": "uint256" - } - ], - "name": "StuckPenaltyStateChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "nodeOperatorId", - "type": "uint256" - }, - { - "indexed": false, - "name": "targetValidatorsCount", - "type": "uint256" - }, - { - "indexed": false, - "name": "targetLimitMode", - "type": "uint256" - } - ], - "name": "TargetValidatorsCountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "recipientAddress", - "type": "address" - }, - { - "indexed": false, - "name": "sharesPenalizedAmount", - "type": "uint256" - } - ], - "name": "NodeOperatorPenalized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "version", - "type": "uint256" - } - ], - "name": "ContractVersionSet", - "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" - } -] +[{"constant":true,"inputs":[],"name":"hasInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_targetLimitMode","type":"uint256"},{"name":"_targetLimit","type":"uint256"}],"name":"updateTargetValidatorsLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_keysCount","type":"uint256"},{"name":"_publicKeys","type":"bytes"},{"name":"_signatures","type":"bytes"}],"name":"addSigningKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getType","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"exitDeadlineThreshold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_script","type":"bytes"}],"name":"getEVMScriptExecutor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRecoveryVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_offset","type":"uint256"},{"name":"_limit","type":"uint256"}],"name":"getNodeOperatorIds","outputs":[{"name":"nodeOperatorIds","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_proofSlotTimestamp","type":"uint256"},{"name":"_publicKey","type":"bytes"},{"name":"_eligibleToExitInSec","type":"uint256"}],"name":"reportValidatorExitDelay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_offset","type":"uint256"},{"name":"_limit","type":"uint256"}],"name":"getSigningKeys","outputs":[{"name":"pubkeys","type":"bytes"},{"name":"signatures","type":"bytes"},{"name":"used","type":"bool[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_fromIndex","type":"uint256"},{"name":"_keysCount","type":"uint256"}],"name":"removeSigningKeysOperatorBH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"getNodeOperatorIsActive","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_name","type":"string"}],"name":"setNodeOperatorName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_totalRewardShares","type":"uint256"}],"name":"getRewardsDistribution","outputs":[{"name":"recipients","type":"address[]"},{"name":"shares","type":"uint256[]"},{"name":"penalized","type":"bool[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_indexFrom","type":"uint256"},{"name":"_indexTo","type":"uint256"}],"name":"invalidateReadyToDepositKeysRange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_locator","type":"address"},{"name":"_type","type":"bytes32"},{"name":"_exitDeadlineThresholdInSeconds","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_publicKey","type":"bytes"},{"name":"_withdrawalRequestPaidFee","type":"uint256"},{"name":"_exitType","type":"uint256"}],"name":"onValidatorExitTriggered","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getStuckPenaltyDelay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_index","type":"uint256"}],"name":"removeSigningKey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRewardDistributionState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_fromIndex","type":"uint256"},{"name":"_keysCount","type":"uint256"}],"name":"removeSigningKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"isOperatorPenalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"deactivateNodeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"STAKING_ROUTER_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_keysCount","type":"uint256"},{"name":"_publicKeys","type":"bytes"},{"name":"_signatures","type":"bytes"}],"name":"addSigningKeysOperatorBH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"appId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"_proofSlotTimestamp","type":"uint256"},{"name":"_publicKey","type":"bytes"},{"name":"_eligibleToExitInSec","type":"uint256"}],"name":"isValidatorExitDelayPenaltyApplicable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getActiveNodeOperatorsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_rewardAddress","type":"address"}],"name":"addNodeOperator","outputs":[{"name":"id","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"getUnusedSigningKeyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"","type":"uint256"}],"name":"onRewardsMinted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MANAGE_NODE_OPERATOR_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_exitDeadlineThresholdInSeconds","type":"uint256"}],"name":"finalizeUpgrade_v4","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"distributeReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"onWithdrawalCredentialsChanged","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"activateNodeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_exitedValidatorsCount","type":"uint256"}],"name":"unsafeUpdateValidatorsCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_rewardAddress","type":"address"}],"name":"setNodeOperatorRewardAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_fullInfo","type":"bool"}],"name":"getNodeOperator","outputs":[{"name":"active","type":"bool"},{"name":"name","type":"string"},{"name":"rewardAddress","type":"address"},{"name":"totalVettedValidators","type":"uint64"},{"name":"totalExitedValidators","type":"uint64"},{"name":"totalAddedValidators","type":"uint64"},{"name":"totalDepositedValidators","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakingModuleSummary","outputs":[{"name":"totalExitedValidators","type":"uint256"},{"name":"totalDepositedValidators","type":"uint256"},{"name":"depositableValidatorsCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorIds","type":"bytes"},{"name":"_exitedValidatorsCounts","type":"bytes"}],"name":"updateExitedValidatorsCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","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":true,"inputs":[],"name":"getEVMScriptRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNodeOperatorsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_isTargetLimitActive","type":"bool"},{"name":"_targetLimit","type":"uint256"}],"name":"updateTargetValidatorsLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_vettedSigningKeysCount","type":"uint64"}],"name":"setNodeOperatorStakingLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"getNodeOperatorSummary","outputs":[{"name":"targetLimitMode","type":"uint256"},{"name":"targetValidatorsCount","type":"uint256"},{"name":"stuckValidatorsCount","type":"uint256"},{"name":"refundedValidatorsCount","type":"uint256"},{"name":"stuckPenaltyEndTimestamp","type":"uint256"},{"name":"totalExitedValidators","type":"uint256"},{"name":"totalDepositedValidators","type":"uint256"},{"name":"depositableValidatorsCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_index","type":"uint256"}],"name":"getSigningKey","outputs":[{"name":"key","type":"bytes"},{"name":"depositSignature","type":"bytes"},{"name":"used","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_NODE_OPERATOR_NAME_LENGTH","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorIds","type":"bytes"},{"name":"_vettedSigningKeysCounts","type":"bytes"}],"name":"decreaseVettedSigningKeysCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_publicKey","type":"bytes"}],"name":"isValidatorExitingKeyReported","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_threshold","type":"uint256"},{"name":"_lateReportingWindow","type":"uint256"}],"name":"setExitDeadlineThreshold","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_depositsCount","type":"uint256"},{"name":"","type":"bytes"}],"name":"obtainDepositData","outputs":[{"name":"publicKeys","type":"bytes"},{"name":"signatures","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"exitPenaltyCutoffTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getKeysOpIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNonce","outputs":[{"name":"","type":"uint256"}],"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":"getLocator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SET_NODE_OPERATOR_LIMIT_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"getTotalSigningKeyCount","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":"MAX_STUCK_PENALTY_DELAY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"onExitedAndStuckValidatorsCountsUpdated","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_NODE_OPERATORS_COUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_index","type":"uint256"}],"name":"removeSigningKeyOperatorBH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MANAGE_SIGNING_KEYS","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"isOperatorPenaltyCleared","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"rewardAddress","type":"address"},{"indexed":false,"name":"stakingLimit","type":"uint64"}],"name":"NodeOperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"active","type":"bool"}],"name":"NodeOperatorActiveSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"name","type":"string"}],"name":"NodeOperatorNameSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"rewardAddress","type":"address"}],"name":"NodeOperatorRewardAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"totalKeysTrimmed","type":"uint64"}],"name":"NodeOperatorTotalKeysTrimmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"keysOpIndex","type":"uint256"}],"name":"KeysOpIndexSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"moduleType","type":"bytes32"}],"name":"StakingModuleTypeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"rewardAddress","type":"address"},{"indexed":false,"name":"sharesAmount","type":"uint256"}],"name":"RewardsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"state","type":"uint8"}],"name":"RewardDistributionStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"locatorAddress","type":"address"}],"name":"LocatorContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"approvedValidatorsCount","type":"uint256"}],"name":"VettedSigningKeysCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"depositedValidatorsCount","type":"uint256"}],"name":"DepositedSigningKeysCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"exitedValidatorsCount","type":"uint256"}],"name":"ExitedSigningKeysCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"totalValidatorsCount","type":"uint256"}],"name":"TotalSigningKeysCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nonce","type":"uint256"}],"name":"NonceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"targetValidatorsCount","type":"uint256"},{"indexed":false,"name":"targetLimitMode","type":"uint256"}],"name":"TargetValidatorsCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"publicKey","type":"bytes"},{"indexed":false,"name":"eligibleToExitInSec","type":"uint256"},{"indexed":false,"name":"proofSlotTimestamp","type":"uint256"}],"name":"ValidatorExitStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"publicKey","type":"bytes"},{"indexed":false,"name":"withdrawalRequestPaidFee","type":"uint256"},{"indexed":false,"name":"exitType","type":"uint256"}],"name":"ValidatorExitTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"threshold","type":"uint256"},{"indexed":false,"name":"reportingWindow","type":"uint256"}],"name":"ExitDeadlineThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"uint256"}],"name":"ContractVersionSet","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"}] \ No newline at end of file diff --git a/abi/TriggerableWithdrawalsGateway.json b/abi/TriggerableWithdrawalsGateway.json new file mode 100644 index 0000000..cbadd32 --- /dev/null +++ b/abi/TriggerableWithdrawalsGateway.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"lidoLocator","type":"address"},{"internalType":"uint256","name":"maxExitRequestsLimit","type":"uint256"},{"internalType":"uint256","name":"exitsPerFrame","type":"uint256"},{"internalType":"uint256","name":"frameDurationInSec","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AdminCannotBeZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"requestsCount","type":"uint256"},{"internalType":"uint256","name":"remainingLimit","type":"uint256"}],"name":"ExitRequestsLimitExceeded","type":"error"},{"inputs":[],"name":"FeeRefundFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"feeRequired","type":"uint256"},{"internalType":"uint256","name":"passedValue","type":"uint256"}],"name":"InsufficientFee","type":"error"},{"inputs":[],"name":"LimitExceeded","type":"error"},{"inputs":[],"name":"PauseUntilMustBeInFuture","type":"error"},{"inputs":[],"name":"PausedExpected","type":"error"},{"inputs":[],"name":"ResumedExpected","type":"error"},{"inputs":[],"name":"TooLargeExitsPerFrame","type":"error"},{"inputs":[],"name":"TooLargeFrameDuration","type":"error"},{"inputs":[],"name":"TooLargeMaxExitRequestsLimit","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":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":[],"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"},{"inputs":[],"name":"ADD_FULL_WITHDRAWAL_REQUEST_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":"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":"TWR_LIMIT_POSITION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TW_EXIT_LIMIT_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","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":"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"},{"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":[],"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":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"bytes","name":"pubkey","type":"bytes"}],"internalType":"struct IStakingRouter.ValidatorExitData[]","name":"validatorsData","type":"tuple[]"},{"internalType":"address","name":"refundRecipient","type":"address"},{"internalType":"uint256","name":"exitType","type":"uint256"}],"name":"triggerFullWithdrawals","outputs":[],"stateMutability":"payable","type":"function"}] \ No newline at end of file diff --git a/abi/ValidatorsExitBusOracle.json b/abi/ValidatorsExitBusOracle.json index 9c30845..972f888 100644 --- a/abi/ValidatorsExitBusOracle.json +++ b/abi/ValidatorsExitBusOracle.json @@ -1 +1 @@ -[{"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":[],"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":"InvalidRequestsData","type":"error"},{"inputs":[],"name":"InvalidRequestsDataLength","type":"error"},{"inputs":[],"name":"InvalidRequestsDataSortOrder","type":"error"},{"inputs":[],"name":"NoConsensusReportToProcess","type":"error"},{"inputs":[{"internalType":"uint256","name":"moduleId","type":"uint256"},{"internalType":"uint256","name":"nodeOpId","type":"uint256"},{"internalType":"uint256","name":"prevRequestedValidatorIndex","type":"uint256"},{"internalType":"uint256","name":"requestedValidatorIndex","type":"uint256"}],"name":"NodeOpValidatorIndexMustIncrease","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":"ResumedExpected","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":"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":[],"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":"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":[],"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":"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":[{"internalType":"uint256","name":"refSlot","type":"uint256"}],"name":"discardConsensusReport","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":[{"internalType":"uint256","name":"moduleId","type":"uint256"},{"internalType":"uint256[]","name":"nodeOpIds","type":"uint256[]"}],"name":"getLastRequestedValidatorIndices","outputs":[{"internalType":"int256[]","name":"","type":"int256[]"}],"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"}],"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":"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":"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"}] \ No newline at end of file +[{"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":[{"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":false,"internalType":"uint256","name":"maxValidatorsPerReport","type":"uint256"}],"name":"SetMaxValidatorsPerReport","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/configs/deployed-hoodi.json b/configs/deployed-hoodi.json new file mode 100644 index 0000000..7b445b0 --- /dev/null +++ b/configs/deployed-hoodi.json @@ -0,0 +1,760 @@ +{ + "accountingOracle": { + "deployParameters": { + "consensusVersion": 2 + }, + "proxy": { + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "address": "0xcb883B1bD0a41512b42D2dB267F2A2cd919FB216", + "constructorArgs": [ + "0x1955CeBfD65ad7Bf16A49f0eB80Ae81E3F8Ee12f", + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "0x" + ] + }, + "implementation": { + "contract": "contracts/0.8.9/oracle/AccountingOracle.sol", + "address": "0x2341c9BE0E639f262f8170f9ef1efeCC92cCF617", + "constructorArgs": [ + "0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8", + "0x3508A952176b3c15387C97BE809eaffB1982176a", + "0x5B70b650B7E14136eb141b5Bf46a52f962885752", + 12, + 1742213400 + ] + } + }, + "apmRegistryFactory": { + "contract": "@aragon/os/contracts/factory/APMRegistryFactory.sol", + "address": "0x1C839726F7cEb0b96ABD56F4D9Bc4627Fb216AC8", + "constructorArgs": [ + "0xaa6028c8077EFB8FA8D59Bd7b0929223Fe076D57", + "0x2D7EF7C6BEDA2a18E4c32151A758B8b081f5C2d7", + "0x41734bEBDe003976DF1B5Cf1D727Ede0222df783", + "0x656a075aa26ed21253C3184B29F6a3EB1CA0fa4c", + "0x6d4995cA535179d4126cC153C386bc9C13B92ba3", + "0x0000000000000000000000000000000000000000" + ] + }, + "app:aragon-agent": { + "implementation": { + "contract": "@aragon/apps-agent/contracts/Agent.sol", + "address": "0x16906517570FC844056fe28F10DFdAAA355086c2", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-agent", + "fullName": "aragon-agent.lidopm.eth", + "id": "0x701a4fd1f5174d12a0f1d9ad2c88d0ad11ab6aad0ac72b7d9ce621815f8016a9" + }, + "proxy": { + "address": "0x0534aA41907c9631fae990960bCC72d75fA7cfeD", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0x701a4fd1f5174d12a0f1d9ad2c88d0ad11ab6aad0ac72b7d9ce621815f8016a9", + "0x8129fc1c" + ] + } + }, + "app:aragon-finance": { + "implementation": { + "contract": "@aragon/apps-finance/contracts/Finance.sol", + "address": "0x7fF12A0F52E10908082B35DB950FB6D8C1F627B1", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-finance", + "fullName": "aragon-finance.lidopm.eth", + "id": "0x5c9918c99c4081ca9459c178381be71d9da40e49e151687da55099c49a4237f1" + }, + "proxy": { + "address": "0x254Ae22bEEba64127F0e59fe8593082F3cd13f6b", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0x5c9918c99c4081ca9459c178381be71d9da40e49e151687da55099c49a4237f1", + "0x1798de810000000000000000000000000534aa41907c9631fae990960bcc72d75fa7cfed0000000000000000000000000000000000000000000000000000000000278d00" + ] + } + }, + "app:aragon-token-manager": { + "implementation": { + "contract": "@aragon/apps-lido/apps/token-manager/contracts/TokenManager.sol", + "address": "0x16A3BedF659b40a15C607134a9853eFc0B1D9297", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-token-manager", + "fullName": "aragon-token-manager.lidopm.eth", + "id": "0xcd567bdf93dd0f6acc3bc7f2155f83244d56a65abbfbefb763e015420102c67b" + }, + "proxy": { + "address": "0x8ab4a56721Ad8e68c6Ad86F9D9929782A78E39E5", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0xcd567bdf93dd0f6acc3bc7f2155f83244d56a65abbfbefb763e015420102c67b", + "0x" + ] + } + }, + "app:aragon-voting": { + "implementation": { + "contract": "@aragon/apps-lido/apps/voting/contracts/Voting.sol", + "address": "0xb75B2756329c1ceeaEd265A0cD7a5B548D2Bd9a2", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-voting", + "fullName": "aragon-voting.lidopm.eth", + "id": "0x0abcd104777321a82b010357f20887d61247493d89d2e987ff57bcecbde00e1e" + }, + "proxy": { + "address": "0x49B3512c44891bef83F8967d075121Bd1b07a01B", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0x0abcd104777321a82b010357f20887d61247493d89d2e987ff57bcecbde00e1e", + "0x13e09453000000000000000000000000ef2573966d009ccea0fc74451dee2193564198dc00000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000384000000000000000000000000000000000000000000000000000000000000012c" + ] + } + }, + "app:lido": { + "implementation": { + "contract": "contracts/0.4.24/Lido.sol", + "address": "0x65da873a408e893A9c7b0bfB84646A3Ab55948A7", + "constructorArgs": [] + }, + "aragonApp": { + "name": "lido", + "fullName": "lido.lidopm.eth", + "id": "0x3ca7c3e38968823ccb4c78ea688df41356f182ae1d159e4ee608d30d68cef320" + }, + "proxy": { + "address": "0x3508A952176b3c15387C97BE809eaffB1982176a", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0x3ca7c3e38968823ccb4c78ea688df41356f182ae1d159e4ee608d30d68cef320", + "0x" + ] + } + }, + "app:node-operators-registry": { + "implementation": { + "contract": "contracts/0.4.24/nos/NodeOperatorsRegistry.sol", + "address": "0x95F00b016bB31b7182D96D25074684518246E42a", + "constructorArgs": [] + }, + "aragonApp": { + "name": "node-operators-registry", + "fullName": "node-operators-registry.lidopm.eth", + "id": "0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d" + }, + "proxy": { + "address": "0x5cDbE1590c083b5A2A64427fAA63A7cfDB91FbB5", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d", + "0x" + ] + } + }, + "app:oracle": { + "implementation": { + "contract": "contracts/0.4.24/oracle/LegacyOracle.sol", + "address": "0xCd80E8dd43c8A5Ee73ea2f6F90672DFe7dBc7F3e", + "constructorArgs": [] + }, + "aragonApp": { + "name": "oracle", + "fullName": "oracle.lidopm.eth", + "id": "0x8b47ba2a8454ec799cd91646e7ec47168e91fd139b23f017455f3e5898aaba93" + }, + "proxy": { + "address": "0x5B70b650B7E14136eb141b5Bf46a52f962885752", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0x8b47ba2a8454ec799cd91646e7ec47168e91fd139b23f017455f3e5898aaba93", + "0x" + ] + } + }, + "app:sandbox": { + "aragonApp": { + "name": "sandbox", + "fullName": "sandbox.lidopm.eth" + }, + "proxy": { + "address": "0x682E94d2630846a503BDeE8b6810DF71C9806891", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, + "app:simple-dvt": { + "aragonApp": { + "name": "simple-dvt", + "fullName": "simple-dvt.lidopm.eth", + "id": "0xe1635b63b5f7b5e545f2a637558a4029dea7905361a2f0fc28c66e9136cf86a4" + }, + "proxy": { + "address": "0x0B5236BECA68004DB89434462DfC3BB074d2c830", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0xe1635b63b5f7b5e545f2a637558a4029dea7905361a2f0fc28c66e9136cf86a4", + "0x" + ] + } + }, + "aragon-acl": { + "implementation": { + "contract": "@aragon/os/contracts/acl/ACL.sol", + "address": "0xaA3DC2Bd465020A348c18b13EaeC3790A93702AB", + "constructorArgs": [] + }, + "proxy": { + "address": "0x78780e70Eae33e2935814a327f7dB6c01136cc62", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0xe3262375f45a6e2026b7e7b18c2b807434f2508fe1a2a3dfb493c7df8f4aad6a", + "0x00" + ], + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + }, + "aragonApp": { + "name": "aragon-acl", + "id": "0xe3262375f45a6e2026b7e7b18c2b807434f2508fe1a2a3dfb493c7df8f4aad6a" + } + }, + "aragon-apm-registry": { + "implementation": { + "contract": "@aragon/os/contracts/apm/APMRegistry.sol", + "address": "0x2D7EF7C6BEDA2a18E4c32151A758B8b081f5C2d7", + "constructorArgs": [] + }, + "proxy": { + "address": "0x948ffB5fDA2961C60ED3Eb84c7a31aae42EbEdCC" + } + }, + "aragon-evm-script-registry": { + "proxy": { + "address": "0xe4D32427b1F9b12ab89B142eD3714dCAABB3f38c", + "constructorArgs": [ + "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "0xddbcfd564f642ab5627cf68b9b7d374fb4f8a36e941a75d89c87998cef03bd61", + "0x00" + ], + "contract": "@aragon/os/contracts/apps/AppProxyPinned.sol" + }, + "aragonApp": { + "name": "aragon-evm-script-registry", + "id": "0xddbcfd564f642ab5627cf68b9b7d374fb4f8a36e941a75d89c87998cef03bd61" + }, + "implementation": { + "address": "0x700316238B6398bcADB267Af0478af65129C78E6", + "contract": "@aragon/os/contracts/evmscript/EVMScriptRegistry.sol", + "constructorArgs": [] + } + }, + "aragon-kernel": { + "implementation": { + "contract": "@aragon/os/contracts/kernel/Kernel.sol", + "address": "0xEEf274E065964Ec22Bd44ddEbE7557c6638b368C", + "constructorArgs": [ + true + ] + }, + "proxy": { + "address": "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d", + "contract": "@aragon/os/contracts/kernel/KernelProxy.sol", + "constructorArgs": [ + "0xEEf274E065964Ec22Bd44ddEbE7557c6638b368C" + ] + } + }, + "aragon-repo-base": { + "contract": "@aragon/os/contracts/apm/Repo.sol", + "address": "0x41734bEBDe003976DF1B5Cf1D727Ede0222df783", + "constructorArgs": [] + }, + "aragonEnsLabelName": "aragonpm", + "aragonID": { + "address": "0x5fe84e29EE7f4Ad9Ed8e56E328A7ABf3205b2458", + "contract": "@aragon/id/contracts/FIFSResolvingRegistrar.sol", + "constructorArgs": [ + "0x6d4995cA535179d4126cC153C386bc9C13B92ba3", + "0x1f9fA4CC5497F3d6Ba3F313cc26EC224dDfC6e5b", + "0x7e74a86b6e146964fb965db04dc2590516da77f720bb6759337bf5632415fd86" + ] + }, + "burner": { + "deployParameters": { + "totalCoverSharesBurnt": "0", + "totalNonCoverSharesBurnt": "0" + }, + "contract": "contracts/0.8.9/Burner.sol", + "address": "0x4e9A9ea2F154bA34BE919CD16a4A953DCd888165", + "constructorArgs": [ + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "0x0534aA41907c9631fae990960bCC72d75fA7cfeD", + "0x3508A952176b3c15387C97BE809eaffB1982176a", + "0", + "0" + ] + }, + "callsScript": { + "address": "0xfB3cB48d81eC8c7f2013a8dc9fA46D2D48112c3A", + "contract": "@aragon/os/contracts/evmscript/executors/CallsScript.sol", + "constructorArgs": [] + }, + "chainId": 560048, + "chainSpec": { + "slotsPerEpoch": 32, + "secondsPerSlot": 12, + "genesisTime": 1742213400, + "depositContract": "0x00000000219ab540356cBB839Cbe05303d7705Fa" + }, + "createAppReposTx": "0xda42173c8a2bd75956437d03e275d32d583650cf4673693716d20c72ac94c137", + "daoAragonId": "lido-dao", + "daoFactory": { + "address": "0xaa6028c8077EFB8FA8D59Bd7b0929223Fe076D57", + "contract": "@aragon/os/contracts/factory/DAOFactory.sol", + "constructorArgs": [ + "0xEEf274E065964Ec22Bd44ddEbE7557c6638b368C", + "0xaA3DC2Bd465020A348c18b13EaeC3790A93702AB", + "0x793Dc0ffaC94dc921d3ac958396646509773F92e" + ] + }, + "daoInitialSettings": { + "voting": { + "minSupportRequired": "500000000000000000", + "minAcceptanceQuorum": "50000000000000000", + "voteDuration": 900, + "objectionPhaseDuration": 300 + }, + "fee": { + "totalPercent": 10, + "treasuryPercent": 50, + "nodeOperatorsPercent": 50 + }, + "token": { + "name": "TEST Lido DAO Token", + "symbol": "TLDO" + } + }, + "deployer": "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "depositSecurityModule": { + "deployParameters": { + "maxOperatorsPerUnvetting": 200, + "pauseIntentValidityPeriodBlocks": 6646, + "usePredefinedAddressInstead": null + }, + "contract": "contracts/0.8.9/DepositSecurityModule.sol", + "address": "0x2F0303F20E0795E6CCd17BD5efE791A586f28E03", + "constructorArgs": [ + "0x3508A952176b3c15387C97BE809eaffB1982176a", + "0x00000000219ab540356cBB839Cbe05303d7705Fa", + "0xCc820558B39ee15C7C45B59390B503b83fb499A8", + 6646, + 200 + ] + }, + "dummyEmptyContract": { + "contract": "contracts/0.8.9/utils/DummyEmptyContract.sol", + "address": "0x3Ff49B57A7cc523c26567AF97F51C09f572A200A", + "constructorArgs": [] + }, + "eip712StETH": { + "contract": "contracts/0.8.9/EIP712StETH.sol", + "address": "0x2A1d51BF3aAA7A7D027C8f561e5f579876a17B0a", + "constructorArgs": [ + "0x3508A952176b3c15387C97BE809eaffB1982176a" + ] + }, + "ens": { + "address": "0x6d4995cA535179d4126cC153C386bc9C13B92ba3", + "constructorArgs": [ + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102" + ], + "contract": "@aragon/os/contracts/lib/ens/ENS.sol" + }, + "ensFactory": { + "contract": "@aragon/os/contracts/factory/ENSFactory.sol", + "address": "0xF0fa84861BFE12428aC57bffA84370936d7bcAa4", + "constructorArgs": [] + }, + "ensNode": { + "nodeName": "aragonpm.eth", + "nodeIs": "0x9065c3e7f7b7ef1ef4e53d2d0b8e0cef02874ab020c1ece79d5f0d3d0111c0ba" + }, + "ensSubdomainRegistrar": { + "implementation": { + "contract": "@aragon/os/contracts/ens/ENSSubdomainRegistrar.sol", + "address": "0x656a075aa26ed21253C3184B29F6a3EB1CA0fa4c", + "constructorArgs": [] + } + }, + "evmScriptRegistryFactory": { + "contract": "@aragon/os/contracts/factory/EVMScriptRegistryFactory.sol", + "address": "0x793Dc0ffaC94dc921d3ac958396646509773F92e", + "constructorArgs": [] + }, + "executionLayerRewardsVault": { + "contract": "contracts/0.8.9/LidoExecutionLayerRewardsVault.sol", + "address": "0x9b108015fe433F173696Af3Aa0CF7CDb3E104258", + "constructorArgs": [ + "0x3508A952176b3c15387C97BE809eaffB1982176a", + "0x0534aA41907c9631fae990960bCC72d75fA7cfeD" + ] + }, + "gateSeal": { + "address": "0x73d76Bd3D589B2b2185c402da82cdAfbc18b958D", + "factoryAddress": "0xA402349F560D45310D301E92B1AA4DeCABe147B3", + "sealDuration": 1209600, + "expiryTimestamp": 1784217696, + "sealingCommittee": "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102" + }, + "gateSealTW": { + "factoryAddress": "0xA402349F560D45310D301E92B1AA4DeCABe147B3", + "sealDuration": 1209600, + "expiryTimestamp": 1784217696, + "sealingCommittee": "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "address": "0x368f2fcb593170823cc844F1B29e75E3d26879A1" + }, + "hashConsensusForAccountingOracle": { + "deployParameters": { + "fastLaneLengthSlots": 10, + "epochsPerFrame": 12 + }, + "contract": "contracts/0.8.9/oracle/HashConsensus.sol", + "address": "0x32EC59a78abaca3f91527aeB2008925D5AaC1eFC", + "constructorArgs": [ + 32, + 12, + 1742213400, + 12, + 10, + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "0xcb883B1bD0a41512b42D2dB267F2A2cd919FB216" + ] + }, + "hashConsensusForValidatorsExitBusOracle": { + "deployParameters": { + "fastLaneLengthSlots": 10, + "epochsPerFrame": 4 + }, + "contract": "contracts/0.8.9/oracle/HashConsensus.sol", + "address": "0x30308CD8844fb2DB3ec4D056F1d475a802DCA07c", + "constructorArgs": [ + 32, + 12, + 1742213400, + 4, + 10, + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "0x8664d394C2B3278F26A1B44B967aEf99707eeAB2" + ] + }, + "ldo": { + "address": "0xEf2573966D009CcEA0Fc74451dee2193564198dc", + "contract": "@aragon/minime/contracts/MiniMeToken.sol", + "constructorArgs": [ + "0x8B608E59aC132075248Ee090A6713D0074CF5f95", + "0x0000000000000000000000000000000000000000", + 0, + "TEST Lido DAO Token", + 18, + "TLDO", + true + ] + }, + "legacyOracle": { + "deployParameters": { + "lastCompletedEpochId": 0 + } + }, + "lidoApm": { + "deployArguments": [ + "0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae", + "0x90a9580abeb24937fc658e497221c81ce8553b560304f9525821f32b17dbdaec" + ], + "deployTx": "0x78e28fcf8019e86c72952f142ee4d93cb1faf35be67c0a93cda6be1ea7ca40fa", + "address": "0x15EBf349e1ee9Cd949049fD9352D0c94De046d7b" + }, + "lidoApmEnsName": "lidopm.eth", + "lidoApmEnsRegDurationSec": 94608000, + "lidoLocator": { + "proxy": { + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "address": "0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8", + "constructorArgs": [ + "0x3Ff49B57A7cc523c26567AF97F51C09f572A200A", + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "0x" + ] + }, + "implementation": { + "contract": "contracts/0.8.9/LidoLocator.sol", + "address": "0x47975A61067a4CE41BeB730cf6c57378E55b849A", + "constructorArgs": [ + [ + "0xcb883B1bD0a41512b42D2dB267F2A2cd919FB216", + "0x2F0303F20E0795E6CCd17BD5efE791A586f28E03", + "0x9b108015fe433F173696Af3Aa0CF7CDb3E104258", + "0x5B70b650B7E14136eb141b5Bf46a52f962885752", + "0x3508A952176b3c15387C97BE809eaffB1982176a", + "0x26AED10459e1096d242ABf251Ff55f8DEaf52348", + "0x5B70b650B7E14136eb141b5Bf46a52f962885752", + "0x4e9A9ea2F154bA34BE919CD16a4A953DCd888165", + "0xCc820558B39ee15C7C45B59390B503b83fb499A8", + "0x0534aA41907c9631fae990960bCC72d75fA7cfeD", + "0x8664d394C2B3278F26A1B44B967aEf99707eeAB2", + "0xfe56573178f1bcdf53F01A6E9977670dcBBD9186", + "0x4473dCDDbf77679A643BdB654dbd86D67F8d32f2", + "0x2a833402e3F46fFC1ecAb3598c599147a78731a9", + "0xa5F5A9360275390fF9728262a29384399f38d2f0", + "0x6679090D92b08a2a686eF8614feECD8cDFE209db" + ] + ] + } + }, + "lidoTemplate": { + "contract": "contracts/0.4.24/template/LidoTemplate.sol", + "address": "0x61A5C5CB0679887f7b0310cE13712Ad787511426", + "constructorArgs": [ + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "0xaa6028c8077EFB8FA8D59Bd7b0929223Fe076D57", + "0x6d4995cA535179d4126cC153C386bc9C13B92ba3", + "0x8B608E59aC132075248Ee090A6713D0074CF5f95", + "0x5fe84e29EE7f4Ad9Ed8e56E328A7ABf3205b2458", + "0x1C839726F7cEb0b96ABD56F4D9Bc4627Fb216AC8" + ], + "deployBlock": 718 + }, + "lidoTemplateCreateStdAppReposTx": "0xde73bd479afd4d6e5e0ced2a28966018a772c14633dbf147258680d9e971e94f", + "lidoTemplateNewDaoTx": "0xdd5b8ac931c01359e0948b4c202cf4ebac0fe6c5d6628025d1e09a2012cf4329", + "minFirstAllocationStrategy": { + "contract": "contracts/common/lib/MinFirstAllocationStrategy.sol", + "address": "0x6d1a9bBFF97f7565e9532FEB7b499982848E5e07", + "constructorArgs": [] + }, + "miniMeTokenFactory": { + "address": "0x8B608E59aC132075248Ee090A6713D0074CF5f95", + "contract": "@aragon/minime/contracts/MiniMeToken.sol", + "constructorArgs": [] + }, + "networkId": 560048, + "nodeOperatorsRegistry": { + "deployParameters": { + "stakingModuleTypeId": "curated-onchain-v1", + "stuckPenaltyDelay": 172800 + } + }, + "oracleDaemonConfig": { + "deployParameters": { + "NORMALIZED_CL_REWARD_PER_EPOCH": 64, + "NORMALIZED_CL_REWARD_MISTAKE_RATE_BP": 1000, + "REBASE_CHECK_NEAREST_EPOCH_DISTANCE": 1, + "REBASE_CHECK_DISTANT_EPOCH_DISTANCE": 23, + "VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS": 7200, + "VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS": 28800, + "NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP": 100, + "PREDICTION_DURATION_IN_SLOTS": 50400, + "FINALIZATION_MAX_NEGATIVE_REBASE_EPOCH_SHIFT": 1350 + }, + "contract": "contracts/0.8.9/OracleDaemonConfig.sol", + "address": "0x2a833402e3F46fFC1ecAb3598c599147a78731a9", + "constructorArgs": [ + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + [] + ] + }, + "oracleReportSanityChecker": { + "deployParameters": { + "exitedValidatorsPerDayLimit": 9000, + "appearedValidatorsPerDayLimit": 43200, + "annualBalanceIncreaseBPLimit": 1000, + "simulatedShareRateDeviationBPLimit": 50, + "maxValidatorExitRequestsPerReport": 600, + "maxItemsPerExtraDataTransaction": 8, + "maxNodeOperatorsPerExtraDataItem": 24, + "requestTimestampMargin": 128, + "maxPositiveTokenRebase": 750000, + "initialSlashingAmountPWei": 1000, + "inactivityPenaltiesAmountPWei": 101, + "clBalanceOraclesErrorUpperBPLimit": 50 + }, + "contract": "contracts/0.8.9/sanity_checks/OracleReportSanityChecker.sol", + "address": "0x26AED10459e1096d242ABf251Ff55f8DEaf52348", + "constructorArgs": [ + "0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8", + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + [ + 9000, + 43200, + 1000, + 50, + 600, + 8, + 24, + 128, + 750000, + 1000, + 101, + 50 + ] + ] + }, + "scratchDeployGasUsed": "177752789", + "simpleDvt": { + "deployParameters": { + "stakingModuleTypeId": "curated-onchain-v1", + "stuckPenaltyDelay": 172800 + } + }, + "stakingRouter": { + "proxy": { + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "address": "0xCc820558B39ee15C7C45B59390B503b83fb499A8", + "constructorArgs": [ + "0x7637A8Afd3B464E4481c67d51Cfe234f64903fd3", + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "0x" + ] + }, + "implementation": { + "contract": "contracts/0.8.9/StakingRouter.sol", + "address": "0xd5F04A81ac472B2cB32073CE9dDABa6FaF022827", + "constructorArgs": [ + "0x00000000219ab540356cBB839Cbe05303d7705Fa" + ] + } + }, + "triggerableWithdrawalsGateway": { + "implementation": { + "contract": "contracts/0.8.9/TriggerableWithdrawalsGateway.sol", + "address": "0x6679090D92b08a2a686eF8614feECD8cDFE209db", + "constructorArgs": [ + "0x0534aA41907c9631fae990960bCC72d75fA7cfeD", + "0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8", + 11200, + 1, + 48 + ] + } + }, + "validatorExitDelayVerifier": { + "implementation": { + "contract": "contracts/0.8.25/ValidatorExitDelayVerifier.sol", + "address": "0xa5F5A9360275390fF9728262a29384399f38d2f0", + "constructorArgs": [ + "0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8", + { + "gIFirstValidatorPrev": "0x0000000000000000000000000000000000000000000000000096000000000028", + "gIFirstValidatorCurr": "0x0000000000000000000000000000000000000000000000000096000000000028", + "gIFirstHistoricalSummaryPrev": "0x000000000000000000000000000000000000000000000000000000b600000018", + "gIFirstHistoricalSummaryCurr": "0x000000000000000000000000000000000000000000000000000000b600000018", + "gIFirstBlockRootInSummaryPrev": "0x000000000000000000000000000000000000000000000000000000000040000d", + "gIFirstBlockRootInSummaryCurr": "0x000000000000000000000000000000000000000000000000000000000040000d" + }, + 1, + 1, + 0, + 8192, + 32, + 12, + 1742213400, + 98304 + ] + } + }, + "validatorsExitBusOracle": { + "deployParameters": { + "consensusVersion": 2 + }, + "proxy": { + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "address": "0x8664d394C2B3278F26A1B44B967aEf99707eeAB2", + "constructorArgs": [ + "0x0e71BeD56B76E8ED96af5Bd5CDceE6F7f72201B1", + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "0x" + ] + }, + "implementation": { + "contract": "contracts/0.8.9/oracle/ValidatorsExitBusOracle.sol", + "address": "0x7E6d9C9C44417bf2EaF69685981646e9752D623A", + "constructorArgs": [ + 12, + 1742213400, + "0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8" + ] + } + }, + "vestingParams": { + "unvestedTokensAmount": "0", + "holders": { + "0xc3C65cB7aa6D36F051f875708b8E17f9a0B210eD": "940000000000000000000000", + "0x0534aA41907c9631fae990960bCC72d75fA7cfeD": "60000000000000000000000" + }, + "start": 0, + "cliff": 0, + "end": 0, + "revokable": false + }, + "withdrawalQueueERC721": { + "deployParameters": { + "name": "Lido: stETH Withdrawal NFT", + "symbol": "unstETH", + "baseUri": null + }, + "proxy": { + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "address": "0xfe56573178f1bcdf53F01A6E9977670dcBBD9186", + "constructorArgs": [ + "0xD0a60e52837e045F4567193Cf8921191C486eCD5", + "0x83BCE68B4e8b7071b2a664a26e6D3Bc17eEe3102", + "0x" + ] + }, + "implementation": { + "contract": "contracts/0.8.9/WithdrawalQueueERC721.sol", + "address": "0xD0a60e52837e045F4567193Cf8921191C486eCD5", + "constructorArgs": [ + "0x7E99eE3C66636DE415D2d7C880938F2f40f94De4", + "Lido: stETH Withdrawal NFT", + "unstETH" + ] + } + }, + "withdrawalVault": { + "implementation": { + "contract": "contracts/0.8.9/WithdrawalVault.sol", + "address": "0xfe7A58960Af333eAdeAeC39149F9d6A71dc3E668", + "constructorArgs": [ + "0x3508A952176b3c15387C97BE809eaffB1982176a", + "0x0534aA41907c9631fae990960bCC72d75fA7cfeD", + "0x6679090D92b08a2a686eF8614feECD8cDFE209db" + ] + }, + "proxy": { + "contract": "contracts/0.8.4/WithdrawalsManagerProxy.sol", + "address": "0x4473dCDDbf77679A643BdB654dbd86D67F8d32f2", + "constructorArgs": [ + "0x49B3512c44891bef83F8967d075121Bd1b07a01B", + "0x0f262D9A5Ada76C31cE638bA7AcAA8BA55827483" + ] + }, + "address": "0x4473dCDDbf77679A643BdB654dbd86D67F8d32f2" + }, + "wstETH": { + "contract": "contracts/0.6.12/WstETH.sol", + "address": "0x7E99eE3C66636DE415D2d7C880938F2f40f94De4", + "constructorArgs": [ + "0x3508A952176b3c15387C97BE809eaffB1982176a" + ] + } +} \ No newline at end of file diff --git a/configs/deployed-mainnet.json b/configs/deployed-mainnet.json index 4a3ed5a..e3428fc 100644 --- a/configs/deployed-mainnet.json +++ b/configs/deployed-mainnet.json @@ -15,7 +15,7 @@ }, "implementation": { "contract": "contracts/0.8.9/oracle/AccountingOracle.sol", - "address": "0x0e65898527E77210fB0133D00dd4C0E86Dc29bC7", + "address": "0xE9906E543274cebcd335d2C560094089e9547e8d", "constructorArgs": [ "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb", "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", @@ -114,7 +114,7 @@ }, "implementation": { "contract": "contracts/0.4.24/nos/NodeOperatorsRegistry.sol", - "address": "0x1770044a38402e3CfCa2Fcfa0C84a093c9B42135", + "address": "0x6828b023e737f96B168aCd0b5c6351971a4F81aE", "constructorArgs": [] }, "aragonApp": { @@ -278,6 +278,20 @@ "contract": "contracts/0.8.9/LidoExecutionLayerRewardsVault.sol", "deployTx": "0xd72cf25e4a5fe3677b6f9b2ae13771e02ad66f8d2419f333bb8bde3147bd4294" }, + "gateSeal": { + "address": "0x8A854C4E750CDf24f138f34A9061b2f556066912", + "factoryAddress": "0x6c82877cac5a7a739f16ca0a89c0a328b8764a24", + "sealDuration": 1209600, + "expiryTimestamp": 1788908579, + "sealingCommittee": "0x8772E3a2D86B9347A2688f9bc1808A6d8917760C" + }, + "gateSealTW": { + "factoryAddress": "0x6c82877cac5a7a739f16ca0a89c0a328b8764a24", + "sealDuration": 1209600, + "expiryTimestamp": 1788908579, + "sealingCommittee": "0x8772E3a2D86B9347A2688f9bc1808A6d8917760C", + "address": "0xA6BC802fAa064414AA62117B4a53D27fFfF741F1" + }, "hashConsensusForAccountingOracle": { "address": "0xD624B08C83bAECF0807Dd2c6880C3154a5F0B288", "contract": "contracts/0.8.9/oracle/HashConsensus.sol", @@ -334,7 +348,7 @@ }, "implementation": { "contract": "contracts/0.8.9/LidoLocator.sol", - "address": "0x3ABc4764f0237923d52056CFba7E9AEBf87113D3", + "address": "0x2C298963FB763f74765829722a1ebe0784f4F5Cf", "constructorArgs": [ [ "0x852deD011285fe67063a08005c71a85690503Cee", @@ -350,7 +364,9 @@ "0x0De4Ea0184c2ad0BacA7183356Aea5B8d5Bf5c6e", "0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1", "0xB9D7934878B5FB9610B3fE8A5e441e8fad7E293f", - "0xbf05A929c3D7885a6aeAd833a992dA6E5ac23b09" + "0xbf05A929c3D7885a6aeAd833a992dA6E5ac23b09", + "0xbDb567672c867DB533119C2dcD4FB9d8b44EC82f", + "0xDC00116a0D3E064427dA2600449cfD2566B3037B" ] ] } @@ -414,6 +430,7 @@ "maxPositiveTokenRebase": 750000 } }, + "scratchDeployGasUsed": "52987994", "stakingRouter": { "proxy": { "address": "0xFdDf38947aFB03C621C71b06C9C70bce73f12999", @@ -427,10 +444,48 @@ }, "implementation": { "contract": "contracts/0.8.9/StakingRouter.sol", - "address": "0x89eDa99C0551d4320b56F82DDE8dF2f8D2eF81aA", + "address": "0x226f9265CBC37231882b7409658C18bB7738173A", "constructorArgs": ["0x00000000219ab540356cBB839Cbe05303d7705Fa"] } }, + "triggerableWithdrawalsGateway": { + "implementation": { + "contract": "contracts/0.8.9/TriggerableWithdrawalsGateway.sol", + "address": "0xDC00116a0D3E064427dA2600449cfD2566B3037B", + "constructorArgs": [ + "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", + "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb", + 11200, + 1, + 48 + ] + } + }, + "validatorExitDelayVerifier": { + "implementation": { + "contract": "contracts/0.8.25/ValidatorExitDelayVerifier.sol", + "address": "0xbDb567672c867DB533119C2dcD4FB9d8b44EC82f", + "constructorArgs": [ + "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb", + { + "gIFirstValidatorPrev": "0x0000000000000000000000000000000000000000000000000096000000000028", + "gIFirstValidatorCurr": "0x0000000000000000000000000000000000000000000000000096000000000028", + "gIFirstHistoricalSummaryPrev": "0x000000000000000000000000000000000000000000000000000000b600000018", + "gIFirstHistoricalSummaryCurr": "0x000000000000000000000000000000000000000000000000000000b600000018", + "gIFirstBlockRootInSummaryPrev": "0x000000000000000000000000000000000000000000000000000000000040000d", + "gIFirstBlockRootInSummaryCurr": "0x000000000000000000000000000000000000000000000000000000000040000d" + }, + 11649024, + 11649024, + 6209536, + 8192, + 32, + 12, + 1606824023, + 98304 + ] + } + }, "validatorsExitBusOracle": { "proxy": { "address": "0x0De4Ea0184c2ad0BacA7183356Aea5B8d5Bf5c6e", @@ -443,13 +498,9 @@ ] }, "implementation": { - "address": "0xA89Ea51FddE660f67d1850e03C9c9862d33Bc42c", "contract": "contracts/0.8.9/oracle/ValidatorsExitBusOracle.sol", - "deployTx": "0x5ab545276f78a72a432c3e971c96384973abfab6394e08cb077a006c25aef7a7", - "constructorArgs": [12, 1606824023, "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb"], - "deployParameters": { - "consensusVersion": 1 - } + "address": "0x905A211eD6830Cfc95643f0bE2ff64E7f3bf9b94", + "constructorArgs": [12, 1606824023, "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb"] } }, "vestingParams": { @@ -548,10 +599,13 @@ "address": "0xB9D7934878B5FB9610B3fE8A5e441e8fad7E293f" }, "implementation": { - "address": "0xCC52f17756C04bBa7E377716d7062fC36D7f69Fd", "contract": "contracts/0.8.9/WithdrawalVault.sol", - "deployTx": "0xd9eb2eca684770e4d2b192709b6071875f75072a0ce794a582824ee907a704f3", - "constructorArgs": ["0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c"] + "address": "0x7D2BAa6094E1C4B60Da4cbAF4A77C3f4694fD53D", + "constructorArgs": [ + "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", + "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", + "0xDC00116a0D3E064427dA2600449cfD2566B3037B" + ] } }, "wstETH": { @@ -559,5 +613,15 @@ "contract": "contracts/0.6.12/WstETH.sol", "deployTx": "0xaf2c1a501d2b290ef1e84ddcfc7beb3406f8ece2c46dee14e212e8233654ff05", "constructorArgs": ["0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84"] + }, + "dg:dualGovernance": { + "proxy": { + "address": "0xC1db28B3301331277e307FDCfF8DE28242A4486E" + } + }, + "dg:emergencyProtectedTimelock": { + "proxy": { + "address": "0xCE0425301C85c5Ea2A0873A2dEe44d78E02D2316" + } } -} +} \ No newline at end of file diff --git a/configs/extra-deployed-hoodi.json b/configs/extra-deployed-hoodi.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/configs/extra-deployed-hoodi.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/contracts/index.ts b/contracts/index.ts index b7efcb9..07425d3 100644 --- a/contracts/index.ts +++ b/contracts/index.ts @@ -24,6 +24,7 @@ export * from './split-main'; export * from './staking-module'; export * from './staking-router'; export * from './token-manager'; +export * from './twg'; export * from './unlimited-stake'; export * from './voting'; export * from './withdrawal-request'; diff --git a/contracts/twg.ts b/contracts/twg.ts new file mode 100644 index 0000000..286ef11 --- /dev/null +++ b/contracts/twg.ts @@ -0,0 +1,7 @@ +import { Contract } from 'ethers'; +import { wallet } from '@providers'; +import { getDeployedAddress } from '@configs'; +import abi from 'abi/TriggerableWithdrawalsGateway.json'; + +export const twgAddress = getDeployedAddress('triggerableWithdrawalsGateway.implementation'); +export const twgContract = new Contract(twgAddress, abi, wallet); diff --git a/package.json b/package.json index 54b02b8..5cd8b8d 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,8 @@ "scripts": { "testnet": "./testnet.sh", "start": "./run.sh", + "test": "vitest", + "test:run": "vitest run", "lint": "eslint **/*.ts", "format": "eslint **/*.ts --fix", "check-types": "tsc --noEmit" @@ -23,7 +25,8 @@ "prettier": "^3.0.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.1.2", - "typescript": "^5.0.2" + "typescript": "^5.0.2", + "vitest": "^4.0.7" }, "dependencies": { "@chainsafe/bls-keygen": "^0.4.0", diff --git a/programs/common/deadline-commands.ts b/programs/common/deadline-commands.ts new file mode 100644 index 0000000..ef08022 --- /dev/null +++ b/programs/common/deadline-commands.ts @@ -0,0 +1,121 @@ +import { Command } from 'commander'; +import { Contract } from 'ethers'; +import { logger } from '@utils'; + +interface DeadlineCommandConfig { + /** Module name for logs and descriptions (e.g., "NOR", "sDVT") */ + moduleName: string; + /** Command name for usage examples (e.g., "nor", "sdvt") */ + commandName: string; +} + +export const addDeadlineCommands = (command: Command, contract: Contract, config: DeadlineCommandConfig) => { + command + .command('set-deadline') + .description( + `Set exit deadline threshold for validators in ${config.moduleName} module. Note: validators exited before now will no longer be able to report as late again`, + ) + .option('--threshold ', 'Exit deadline threshold in seconds (e.g., 345600 for 4 days)') + .option('--reporting-window ', 'Late reporting window in seconds (e.g., 86400 for 1 day)', '86400') + .action(async (options) => { + const { threshold, reportingWindow } = options; + + if (!threshold) { + logger.error('--threshold parameter is required'); + logger.log(''); + logger.log('Example usage:'); + logger.log(` lido-cli ${config.commandName} set-deadline --threshold 345600 # 4 days`); + logger.log( + ` lido-cli ${config.commandName} set-deadline --threshold 345600 --reporting-window 86400 # 4 days threshold, 1 day window`, + ); + return; + } + + const thresholdSeconds = parseInt(threshold, 10); + const reportingWindowSeconds = parseInt(reportingWindow, 10); + + if (isNaN(thresholdSeconds)) { + logger.error('Threshold must be a valid number (seconds)'); + return; + } + + if (isNaN(reportingWindowSeconds)) { + logger.error('Reporting window must be a valid number (seconds)'); + return; + } + + if (thresholdSeconds < 0) { + logger.error('Threshold must be a positive number'); + return; + } + + if (reportingWindowSeconds < 0) { + logger.error('Reporting window must be a positive number'); + return; + } + + try { + logger.log(`Setting exit deadline threshold in ${config.moduleName} contract...`); + logger.log('Contract address:', contract.target); + logger.log('New threshold:', thresholdSeconds, 'seconds'); + logger.log('Reporting window:', reportingWindowSeconds, 'seconds'); + + const txResult = await contract.setExitDeadlineThreshold(thresholdSeconds, reportingWindowSeconds); + + logger.log('Transaction hash:', txResult.hash); + logger.log('Waiting for transaction confirmation...'); + + const receipt = await txResult.wait(); + + if (receipt.status === 1) { + logger.log('Exit deadline threshold updated successfully!'); + logger.log('Transaction confirmed in block:', receipt.blockNumber); + } else { + logger.error('Transaction failed'); + } + } catch (error) { + logger.error('Failed to set exit deadline threshold:', error); + } + }); + + command + .command('get-deadline') + .description(`Get current exit deadline threshold for a Node Operator in ${config.moduleName} module`) + .option('--node-operator-id ', 'Node Operator ID to query') + .action(async (options) => { + const { nodeOperatorId } = options; + + if (!nodeOperatorId) { + logger.error('--node-operator-id parameter is required'); + logger.log(''); + logger.log('Example usage:'); + logger.log(` lido-cli ${config.commandName} get-deadline --node-operator-id 15`); + return; + } + + const operatorId = parseInt(nodeOperatorId, 10); + + if (isNaN(operatorId)) { + logger.error('Node Operator ID must be a valid number'); + return; + } + + if (operatorId < 0) { + logger.error('Node Operator ID must be a non-negative number'); + return; + } + + try { + logger.log(`Retrieving exit deadline threshold from ${config.moduleName} contract...`); + logger.log('Contract address:', contract.target); + logger.log('Node Operator ID:', operatorId); + + const threshold = await contract.exitDeadlineThreshold(operatorId); + + logger.log(''); + logger.log(`threshold: ${threshold}`); + } catch (error) { + logger.error('Failed to retrieve exit deadline threshold:', error); + } + }); +}; diff --git a/programs/common/index.ts b/programs/common/index.ts index 44ca5cd..98a14ba 100644 --- a/programs/common/index.ts +++ b/programs/common/index.ts @@ -3,6 +3,7 @@ export * from './aragon-app'; export * from './base-oracle'; export * from './consensus'; export * from './curated-module'; +export * from './deadline-commands'; export * from './logs'; export * from './parsing'; export * from './pause-until'; diff --git a/programs/exit-bus-oracle.ts b/programs/exit-bus-oracle.ts index 4d3b7cf..21d7d3e 100644 --- a/programs/exit-bus-oracle.ts +++ b/programs/exit-bus-oracle.ts @@ -7,8 +7,10 @@ import { fetchBlock, KAPIKey, ValidatorContainer, + provider, } from '@providers'; import { exportToCSV, getValidatorsMap, groupByModuleId, logger } from '@utils'; +import { keccak256, AbiCoder, parseEther, ethers } from 'ethers'; import { addAccessControlSubCommands, @@ -217,3 +219,439 @@ oracle logger.table(operatorsWithUnsettledRequests); }); }); + +oracle + .command('submit-hash') + .description('Submit an Exit Request Hash') + .option('--hash ', 'Pre-calculated keccak256 hash to submit directly') + .option('--calldata ', 'Calldata in hex format to calculate hash from') + .option('--format ', 'Data format specifier', '1') + .action(async (options) => { + const { hash, calldata, format } = options; + + if (!hash && !calldata) { + logger.error('Either --hash or --calldata must be provided'); + return; + } + + if (hash && calldata) { + logger.error('Cannot specify both --hash and --calldata'); + return; + } + + let hashToSubmit: string; + + if (hash) { + hashToSubmit = hash; + logger.log('Using pre-calculated hash:', hashToSubmit); + } else { + if (!calldata.startsWith('0x')) { + logger.error('Calldata must be in hex format starting with 0x'); + return; + } + + const abiCoder = AbiCoder.defaultAbiCoder(); + const encoded = abiCoder.encode(['bytes', 'uint256'], [calldata, format]); + hashToSubmit = keccak256(encoded); + + logger.log('Calculated hash from calldata:', hashToSubmit); + logger.log('Calldata:', calldata); + logger.log('Format:', format); + logger.log('Encoded data:', encoded); + } + + try { + logger.log('Submitting hash to VEB contract...'); + logger.log('Hash to submit:', hashToSubmit); + logger.log('Contract address:', exitBusOracleContract.target); + + const tx = await exitBusOracleContract.submitExitRequestsHash(hashToSubmit); + logger.log('Transaction hash:', tx.hash); + + logger.log('Waiting for transaction confirmation...'); + const receipt = await tx.wait(); + + if (receipt.status === 1) { + logger.log('Hash submitted successfully!'); + logger.log('Transaction confirmed in block:', receipt.blockNumber); + } else { + logger.error('Transaction failed'); + } + } catch (error) { + logger.error('Failed to submit hash:', error); + } + }); + +oracle + .command('submit-data') + .description('Submit Exit Request Data') + .option( + '--data ', + 'Exit requests data in format: moduleId,nodeOpId,valIndex,pubkey;moduleId,nodeOpId,valIndex,pubkey', + ) + .option('--calldata ', 'Exit requests calldata in hex format') + .option('--format ', 'Data format specifier', '1') + .action(async (options) => { + const { data, calldata, format } = options; + + if (!data && !calldata) { + logger.error('Either --data or --calldata must be provided'); + logger.log('Examples:'); + logger.log(' # Using CSV format:'); + logger.log(' ./run.sh vebo submit-data --data "1,15,12345,0x...;2,22,54321,0x..."'); + logger.log(' # Using hex calldata:'); + logger.log(' ./run.sh vebo submit-data --calldata 0x... --format 1'); + return; + } + + if (data && calldata) { + logger.error('Cannot specify both --data and --calldata'); + return; + } + + try { + let encodedData: string; + + if (data) { + // Mode 1: Parse CSV format data + const requests = data + .split(';') + .filter((req: string) => req.trim()) + .map((request: string) => { + const parts = request.trim().split(','); + if (parts.length !== 4) { + throw new Error(`Invalid request format: ${request}. Expected: moduleId,nodeOpId,valIndex,pubkey`); + } + + const [moduleId, nodeOpId, valIndex, pubkey] = parts; + + if (!moduleId || !nodeOpId || !valIndex || !pubkey) { + throw new Error(`Invalid request format: ${request}. All fields are required`); + } + + if (!pubkey.startsWith('0x') || pubkey.length !== 98) { + throw new Error(`Invalid pubkey format: ${pubkey}. Expected 0x-prefixed 48-byte hex string`); + } + + return { + moduleId: parseInt(moduleId, 10), + nodeOpId: parseInt(nodeOpId, 10), + valIndex: parseInt(valIndex, 10), + pubkey: pubkey.toLowerCase(), + }; + }); + + if (requests.length === 0) { + logger.error('No valid exit requests found in data'); + return; + } + + logger.log(`Parsed ${requests.length} exit request(s):`); + requests.forEach((req: { moduleId: number; nodeOpId: number; valIndex: number; pubkey: string }, i: number) => { + logger.log( + ` ${i + 1}. Module ${req.moduleId}, Operator ${req.nodeOpId}, Index ${req.valIndex}, Pubkey ${req.pubkey}`, + ); + }); + + const encodeExitRequestHex = ({ + moduleId, + nodeOpId, + valIndex, + pubkey, + }: { + moduleId: number; + nodeOpId: number; + valIndex: number; + pubkey: string; + }) => { + const pubkeyHex = pubkey.slice(2); + + const moduleIdHex = moduleId.toString(16).padStart(6, '0'); // 3 bytes + const nodeOpIdHex = nodeOpId.toString(16).padStart(10, '0'); // 5 bytes + const valIndexHex = valIndex.toString(16).padStart(16, '0'); // 8 bytes + + return moduleIdHex + nodeOpIdHex + valIndexHex + pubkeyHex; + }; + + encodedData = '0x' + requests.map(encodeExitRequestHex).join(''); + } else { + // Mode 2: Use provided calldata directly + if (!calldata.startsWith('0x')) { + logger.error('Calldata must be in hex format starting with 0x'); + return; + } + + encodedData = calldata; + + // Calculate number of requests based on data length + // Each request is 64 bytes (128 hex chars), plus 2 chars for '0x' + const dataLength = (calldata.length - 2) / 2; // Convert hex string to byte length + const requestCount = dataLength / 64; + + if (dataLength % 64 !== 0) { + logger.error( + `Invalid calldata length. Expected multiple of 64 bytes (128 hex chars), got ${dataLength} bytes`, + ); + return; + } + + logger.log(`Using provided calldata with ${requestCount} exit request(s)`); + logger.log('Calldata:', calldata); + } + + logger.log('Encoded data:', encodedData); + logger.log('Data format:', format); + + const exitRequest = { + dataFormat: parseInt(format, 10), + data: encodedData, + }; + + logger.log('Submitting exit requests data to VEB contract...'); + logger.log('Contract address:', exitBusOracleContract.target); + + const tx = await exitBusOracleContract.submitExitRequestsData(exitRequest); + logger.log('Transaction hash:', tx.hash); + + logger.log('Waiting for transaction confirmation...'); + const receipt = await tx.wait(); + + if (receipt.status === 1) { + logger.log('Exit requests data submitted successfully!'); + logger.log('Transaction confirmed in block:', receipt.blockNumber); + } else { + logger.error('Transaction failed'); + } + } catch (error) { + logger.error('Failed to submit exit requests data:', error); + } + }); + +oracle + .command('trigger-exit') + .description('Trigger a validator exit') + .option('--tx ', 'Transaction hash containing the reveal data') + .option('--indexes ', 'Comma-separated list of validator indexes to exit (e.g., 0,1,2,3)') + .option('--calldata ', 'Exit requests calldata in hex format') + .option('--format ', 'Data format specifier', '1') + .option('--value ', 'ETH value to send with transaction (e.g., 0.001)', '0.001') + .action(async (options) => { + const { tx, indexes, calldata, format, value } = options; + + if (!tx && !calldata) { + logger.error('Either --tx or --calldata must be provided'); + logger.log('Examples:'); + logger.log(' # Using transaction hash:'); + logger.log(' ./run.sh vebo trigger-exit --tx 0x1234... --indexes 0,1,2,3 --value 0.001'); + logger.log(' # Using calldata:'); + logger.log(' ./run.sh vebo trigger-exit --calldata 0x1234... --format 1 --value 0.001'); + return; + } + + if (tx && calldata) { + logger.error('Cannot specify both --tx and --calldata'); + return; + } + + if (tx && !indexes) { + logger.error('--indexes parameter is required when using --tx'); + return; + } + + try { + let exitRequestData: { data: string; dataFormat: number }; + let exitDataIndexes: number[]; + + if (tx) { + // Mode 1: Fetch transaction data and use specific indexes + logger.log('Fetching transaction data for:', tx); + + const transaction = await provider.getTransaction(tx); + if (!transaction) { + logger.error('Transaction not found:', tx); + return; + } + + // Parse transaction data - this should be a submitExitRequestsData call + if (!transaction.data) { + logger.error('Transaction has no data'); + return; + } + + // Decode the transaction data to extract exit request data + const abiCoder = AbiCoder.defaultAbiCoder(); + try { + // Remove function selector (first 4 bytes) + const callDataWithoutSelector = '0x' + transaction.data.slice(10); + + // Decode as (exitRequestData, version) where exitRequestData is (dataFormat, data) + const decoded = abiCoder.decode(['(uint256,bytes)', 'uint256'], callDataWithoutSelector); + + exitRequestData = { + dataFormat: Number(decoded[0][0]), + data: decoded[0][1], + }; + + logger.log('Extracted exit request data from transaction'); + logger.log('Data format:', exitRequestData.dataFormat); + logger.log('Data length:', exitRequestData.data.length); + } catch (decodeError) { + logger.error( + 'Failed to decode transaction data:', + decodeError instanceof Error ? decodeError.message : decodeError, + ); + return; + } + + exitDataIndexes = indexes.split(',').map((idx: string) => parseInt(idx.trim(), 10)); + if (exitDataIndexes.some(isNaN)) { + logger.error('Invalid indexes format. Use comma-separated numbers like: 0,1,2,3'); + return; + } + + logger.log('Validator indexes to exit:', exitDataIndexes); + } else { + // Mode 2: Use provided calldata directly + if (!calldata.startsWith('0x')) { + logger.error('Calldata must be in hex format starting with 0x'); + return; + } + + exitRequestData = { + dataFormat: parseInt(format, 10), + data: calldata, + }; + + // For calldata mode, we'll exit all validators in the data + // Calculate number of validators based on data length + // Each validator record is 64 bytes (3+5+8+48 bytes = 64 bytes) + const dataWithoutPrefix = calldata.slice(2); + const validatorCount = Math.floor(dataWithoutPrefix.length / (64 * 2)); // 2 hex chars per byte + exitDataIndexes = Array.from({ length: validatorCount }, (_, i) => i); + + logger.log('Using provided calldata'); + logger.log('Data format:', exitRequestData.dataFormat); + logger.log('Calculated validator count:', validatorCount); + logger.log('Will exit all validators:', exitDataIndexes); + } + + // Validate indexes array is sorted and unique + const sortedIndexes = [...exitDataIndexes].sort((a, b) => a - b); + if (!exitDataIndexes.every((val, i) => val === sortedIndexes[i])) { + logger.error('Indexes must be sorted in ascending order and unique'); + return; + } + + const ethValue = parseEther(value); + logger.log('ETH value to send:', value, 'ETH'); + + logger.log('Triggering exits...'); + logger.log('Exit request data format:', exitRequestData.dataFormat); + logger.log('Exit request data:', exitRequestData.data.slice(0, 66) + '...'); + logger.log('Validator indexes:', exitDataIndexes); + logger.log('Contract address:', exitBusOracleContract.target); + + const txResult = await exitBusOracleContract.triggerExits( + exitRequestData, + exitDataIndexes, + ethers.ZeroAddress, // refund recipient (zero address means sender) + { value: ethValue }, + ); + + logger.log('Transaction hash:', txResult.hash); + logger.log('Waiting for transaction confirmation...'); + + const receipt = await txResult.wait(); + + if (receipt.status === 1) { + logger.log('Validator exits triggered successfully!'); + logger.log('Transaction confirmed in block:', receipt.blockNumber); + } else { + logger.error('Transaction failed'); + } + } catch (error) { + logger.error('Failed to trigger validator exits:', error); + } + }); + +oracle + .command('set-limits') + .description('Set exit request limits on VEB contract') + .option('--max-exit-requests-limit ', 'Maximum exit requests limit') + .option('--exits-per-frame ', 'Number of exits per frame') + .option('--frame-duration ', 'Frame duration in seconds') + .action(async (options) => { + const { maxExitRequestsLimit, exitsPerFrame, frameDuration } = options; + + if (!maxExitRequestsLimit || !exitsPerFrame || !frameDuration) { + logger.error('All parameters are required: --max-exit-requests-limit, --exits-per-frame, --frame-duration'); + logger.log('Example usage:'); + logger.log(' ./run.sh vebo set-limits --max-exit-requests-limit 11200 --exits-per-frame 1 --frame-duration 48'); + return; + } + + try { + const maxLimit = parseInt(maxExitRequestsLimit, 10); + const exitsCount = parseInt(exitsPerFrame, 10); + const durationSec = parseInt(frameDuration, 10); + + if (isNaN(maxLimit) || isNaN(exitsCount) || isNaN(durationSec)) { + logger.error('All parameters must be valid numbers'); + return; + } + + if (maxLimit <= 0 || exitsCount <= 0 || durationSec <= 0) { + logger.error('All parameters must be positive numbers'); + return; + } + + logger.log('Setting exit request limits on VEB contract...'); + logger.log('Parameters:'); + logger.log(` Max Exit Requests Limit: ${maxLimit}`); + logger.log(` Exits Per Frame: ${exitsCount}`); + logger.log(` Frame Duration: ${durationSec} seconds`); + logger.log('Contract address:', exitBusOracleContract.target); + + const tx = await exitBusOracleContract.setExitRequestLimit(maxLimit, exitsCount, durationSec); + logger.log('Transaction hash:', tx.hash); + + logger.log('Waiting for transaction confirmation...'); + const receipt = await tx.wait(); + + if (receipt.status === 1) { + logger.log('Exit request limits set successfully!'); + logger.log('Transaction confirmed in block:', receipt.blockNumber); + } else { + logger.error('Transaction failed'); + } + } catch (error) { + logger.error('Failed to set exit request limits:', error); + } + }); + +oracle + .command('get-limits') + .description('Get current exit request limits from VEB contract') + .action(async () => { + try { + logger.log('Retrieving current exit limits from VEB contract...'); + logger.log('Contract address:', exitBusOracleContract.target); + + const limitsInfo = await exitBusOracleContract.getExitRequestLimitFullInfo(); + + const [maxExitRequestsLimit, exitsPerFrame, frameDurationInSec, prevExitRequestsLimit, currentExitRequestsLimit] = + limitsInfo; + + logger.log(''); + logger.log('Current Exit Request Limits:'); + logger.log(`max-exit-requests-limit: ${maxExitRequestsLimit}`); + logger.log(`exits-per-frame: ${exitsPerFrame}`); + logger.log(`frame-duration: ${frameDurationInSec}`); + logger.log(''); + logger.log('Additional Info:'); + logger.log(`prev-exit-requests-limit: ${prevExitRequestsLimit}`); + logger.log(`current-exit-requests-limit: ${currentExitRequestsLimit}`); + } catch (error) { + logger.error('Failed to retrieve exit request limits:', error); + } + }); diff --git a/programs/index.ts b/programs/index.ts index ea5a3a8..ea57d6e 100644 --- a/programs/index.ts +++ b/programs/index.ts @@ -28,6 +28,7 @@ export * from './sanity-checker'; export * from './scripts'; export * from './simple-dvt'; export * from './staking-router'; +export * from './twg'; export * from './tx'; export * from './unlimited-stake'; export * from './validators'; diff --git a/programs/nor.ts b/programs/nor.ts index e7abc2e..388394b 100644 --- a/programs/nor.ts +++ b/programs/nor.ts @@ -1,6 +1,12 @@ import { program } from '@command'; import { norContract } from '@contracts'; -import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; +import { + addAragonAppSubCommands, + addCuratedModuleSubCommands, + addDeadlineCommands, + addLogsCommands, + addParsingCommands, +} from './common'; const nor = program .command('nor') @@ -10,3 +16,4 @@ addAragonAppSubCommands(nor, norContract); addParsingCommands(nor, norContract); addLogsCommands(nor, norContract); addCuratedModuleSubCommands(nor, norContract); +addDeadlineCommands(nor, norContract, { moduleName: 'NOR', commandName: 'nor' }); diff --git a/programs/simple-dvt.ts b/programs/simple-dvt.ts index 0adae93..cad7047 100644 --- a/programs/simple-dvt.ts +++ b/programs/simple-dvt.ts @@ -1,6 +1,12 @@ import { program } from '@command'; import { simpleDVTContract } from '@contracts'; -import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; +import { + addAragonAppSubCommands, + addCuratedModuleSubCommands, + addDeadlineCommands, + addLogsCommands, + addParsingCommands, +} from './common'; import { getLatestBlockRange } from '@utils'; import { check0xSplit, checkGnosisSafe, checkSignatures, checkWrapperContract } from './staking-module'; @@ -12,6 +18,7 @@ addAragonAppSubCommands(simpleDVT, simpleDVTContract); addParsingCommands(simpleDVT, simpleDVTContract); addLogsCommands(simpleDVT, simpleDVTContract); addCuratedModuleSubCommands(simpleDVT, simpleDVTContract); +addDeadlineCommands(simpleDVT, simpleDVTContract, { moduleName: 'sDVT', commandName: 'sdvt' }); simpleDVT .command('check-reward-address') diff --git a/programs/twg.ts b/programs/twg.ts new file mode 100644 index 0000000..974341f --- /dev/null +++ b/programs/twg.ts @@ -0,0 +1,92 @@ +import { program } from '@command'; +import { twgContract } from '@contracts'; +import { logger } from '@utils'; + +const twg = program.command('twg').description('interact with Triggerable Withdrawals Gateway contract'); + +twg + .command('set-limits') + .description('Change exit limits on TWG contract') + .option('--max-exit-requests-limit ', 'Maximum exit requests limit') + .option('--exits-per-frame ', 'Number of exits per frame') + .option('--frame-duration ', 'Frame duration in seconds') + .action(async (options) => { + const { maxExitRequestsLimit, exitsPerFrame, frameDuration } = options; + + if (!maxExitRequestsLimit || !exitsPerFrame || !frameDuration) { + logger.error('All parameters are required:'); + logger.log(' --max-exit-requests-limit '); + logger.log(' --exits-per-frame '); + logger.log(' --frame-duration '); + logger.log(''); + logger.log('Example usage:'); + logger.log(' lido-cli twg set-limits --max-exit-requests-limit 11200 --exits-per-frame 1 --frame-duration 48'); + return; + } + + const maxLimit = parseInt(maxExitRequestsLimit, 10); + const exitsPerFrameNum = parseInt(exitsPerFrame, 10); + const frameDurationNum = parseInt(frameDuration, 10); + + if (isNaN(maxLimit) || isNaN(exitsPerFrameNum) || isNaN(frameDurationNum)) { + logger.error('All parameters must be valid numbers'); + return; + } + + if (maxLimit <= 0 || exitsPerFrameNum <= 0 || frameDurationNum <= 0) { + logger.error('All parameters must be positive numbers'); + return; + } + + try { + logger.log('Setting exit limits on TWG contract...'); + logger.log('Contract address:', twgContract.target); + logger.log('Parameters:'); + logger.log(' Max exit requests limit:', maxLimit); + logger.log(' Exits per frame:', exitsPerFrameNum); + logger.log(' Frame duration (seconds):', frameDurationNum); + + const txResult = await twgContract.setExitRequestLimit(maxLimit, exitsPerFrameNum, frameDurationNum); + + logger.log('Transaction hash:', txResult.hash); + logger.log('Waiting for transaction confirmation...'); + + const receipt = await txResult.wait(); + + if (receipt.status === 1) { + logger.log('Exit limits updated successfully!'); + logger.log('Transaction confirmed in block:', receipt.blockNumber); + } else { + logger.error('Transaction failed'); + } + } catch (error) { + logger.error('Failed to set exit limits:', error); + } + }); + +twg + .command('get-limits') + .description('Get current exit request limits from TWG contract') + .action(async () => { + try { + logger.log('Retrieving current exit limits from TWG contract...'); + logger.log('Contract address:', twgContract.target); + + const limitsInfo = await twgContract.getExitRequestLimitFullInfo(); + + const [maxExitRequestsLimit, exitsPerFrame, frameDurationInSec, prevExitRequestsLimit, currentExitRequestsLimit] = + limitsInfo; + + logger.log(''); + logger.log('Current Exit Request Limits:'); + logger.log(`max-exit-requests-limit: ${maxExitRequestsLimit}`); + logger.log(`exits-per-frame: ${exitsPerFrame}`); + logger.log(`frame-duration: ${frameDurationInSec}`); + logger.log(''); + logger.log('Additional Info:'); + logger.log(`prev-exit-requests-limit: ${prevExitRequestsLimit}`); + logger.log(`current-exit-requests-limit: ${currentExitRequestsLimit}`); + } catch (error) { + logger.error('Failed to retrieve exit request limits:', error); + } + }); diff --git a/providers/cl-provider.ts b/providers/cl-provider.ts index a3b7d1e..78e2d34 100644 --- a/providers/cl-provider.ts +++ b/providers/cl-provider.ts @@ -1,6 +1,7 @@ import { envs } from '@configs'; import { stringify } from '@utils'; import fetch, { RequestInit } from 'node-fetch'; +// @ts-expect-error - JSONStream types are not properly defined import JSONStream from 'JSONStream'; import { Genesis, Fork, SignedBeaconBlock, SignedBeaconBlockHeaderContainer, ValidatorContainer } from './cl-types'; diff --git a/tests/setup.ts b/tests/setup.ts new file mode 100644 index 0000000..9ead898 --- /dev/null +++ b/tests/setup.ts @@ -0,0 +1,55 @@ +import { beforeAll, afterAll, beforeEach } from 'vitest'; +import { AnvilRunner, CliRunner } from './utils'; + +export const MAINNET_TEST_CONFIG = { + DEPLOYED: 'deployed-mainnet.json', + EL_CHAIN_ID: '1', + EL_NETWORK_NAME: 'mainnet', + EL_API_PROVIDER: 'http://127.0.0.1:8545', + CHAIN_ID: '1', + NETWORK: 'mainnet', + LIDO_CLI_NON_INTERACTIVE: 'true', + PRIVATE_KEY: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', +} as const; + +export function applyTestConfig(config: typeof MAINNET_TEST_CONFIG = MAINNET_TEST_CONFIG): void { + console.log('🔧 Applying test configuration (overriding .env)...'); + console.log(` DEPLOYED: ${config.DEPLOYED}`); + console.log(` NETWORK: ${config.NETWORK}`); + console.log(` CHAIN_ID: ${config.CHAIN_ID}`); + + Object.entries(config).forEach(([key, value]) => { + if (value !== undefined) { + process.env[key] = value; + } + }); + + console.log('✅ Test configuration applied successfully'); +} + +applyTestConfig(); + +export let anvilRunner: AnvilRunner; +export let cliRunner: CliRunner; + +beforeAll(async () => { + console.log('Starting test suite...'); + + anvilRunner = new AnvilRunner(); + cliRunner = new CliRunner(); + + await anvilRunner.start(); + await new Promise((resolve) => setTimeout(resolve, 3000)); + await anvilRunner.setupPermissions(); +}); + +beforeEach(async () => { + await anvilRunner.refillTestAccount(); +}); + +afterAll(async () => { + if (anvilRunner) { + await anvilRunner.stop(); + } + console.log('Test suite completed.'); +}); diff --git a/tests/tw-commands.test.ts b/tests/tw-commands.test.ts new file mode 100644 index 0000000..258d13d --- /dev/null +++ b/tests/tw-commands.test.ts @@ -0,0 +1,159 @@ +import { describe, test, expect } from 'vitest'; +import { cliRunner } from './setup'; + +describe('TW Commands Integration Tests', () => { + describe('VEBO Commands', () => { + test('Submit hash and data using CSV format', async () => { + const expectedCalldata = + '0x000001000000000f00000000000030391234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'; + const testData = + '1,15,12345,0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'; + + // First submit the hash for the expected calldata + const hashResult = await cliRunner.runCommand('vebo', [ + 'submit-hash', + '--calldata', + expectedCalldata, + '--format', + '1', + ]); + + expect(cliRunner.isTestSuccessful(hashResult)).toBe(true); + expect(hashResult.stdout).toContain('Hash submitted successfully!'); + expect(hashResult.stdout).toContain('Transaction confirmed in block:'); + expect(hashResult.stdout).toContain('Format: 1'); + + // Then submit the matching CSV data + const dataResult = await cliRunner.runCommand('vebo', ['submit-data', '--data', testData]); + + expect(cliRunner.isTestSuccessful(dataResult)).toBe(true); + expect(dataResult.stdout).toContain('Parsed 1 exit request(s):'); + expect(dataResult.stdout).toContain('Module 1, Operator 15, Index 12345'); + expect(dataResult.stdout).toContain('Exit requests data submitted successfully!'); + expect(dataResult.stdout).toContain('Data format: 1'); + }); + + test('Submit hash and data using hex calldata format', async () => { + const calldata = + '0x000002000000001400000000000054d1abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890'; + + // First submit the hash for this calldata + const hashResult = await cliRunner.runCommand('vebo', ['submit-hash', '--calldata', calldata, '--format', '1']); + + expect(cliRunner.isTestSuccessful(hashResult)).toBe(true); + expect(hashResult.stdout).toContain('Hash submitted successfully!'); + + // Then submit the actual data using the same calldata + const dataResult = await cliRunner.runCommand('vebo', ['submit-data', '--calldata', calldata, '--format', '1']); + + expect(cliRunner.isTestSuccessful(dataResult)).toBe(true); + + expect(dataResult.stdout).toContain('Using provided calldata with 1 exit request(s)'); + expect(dataResult.stdout).toContain('Exit requests data submitted successfully!'); + expect(dataResult.stdout).toContain('Data format: 1'); + expect(dataResult.stdout).toContain('Transaction confirmed in block:'); + }); + + test('Trigger exit with submitted data', async () => { + const result = await cliRunner.runCommand('vebo', [ + 'trigger-exit', + '--calldata', + '0x000001000000000f00000000000030391234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', + '--format', + '1', + '--value', + '0.001', + ]); + + expect(cliRunner.isTestSuccessful(result)).toBe(true); + + expect(result.stdout).toContain('ETH value to send: 0.001 ETH'); + expect(result.stdout).toContain('Validator exits triggered successfully!'); + expect(result.stdout).toContain('Data format: 1'); + expect(result.stdout).toContain('Will exit all validators: [ 0 ]'); + }); + + test('Set exit request limits', async () => { + const result = await cliRunner.runCommand('vebo', [ + 'set-limits', + '--max-exit-requests-limit', + '11200', + '--exits-per-frame', + '1', + '--frame-duration', + '48', + ]); + + expect(cliRunner.isTestSuccessful(result)).toBe(true); + + expect(result.stdout).toContain('Max Exit Requests Limit: 11200'); + expect(result.stdout).toContain('Exits Per Frame: 1'); + expect(result.stdout).toContain('Frame Duration: 48 seconds'); + expect(result.stdout).toContain('Exit request limits set successfully!'); + }); + + test('Get exit request limits', async () => { + const result = await cliRunner.runCommand('vebo', ['get-limits']); + + expect(cliRunner.isTestSuccessful(result)).toBe(true); + + expect(result.stdout).toContain('max-exit-requests-limit: 11200'); + expect(result.stdout).toContain('exits-per-frame: 1'); + expect(result.stdout).toContain('frame-duration: 48'); + expect(result.stdout).toContain('Current Exit Request Limits:'); + }); + }); + + describe('TWG Commands', () => { + test('Set TWG exit request limits', async () => { + const result = await cliRunner.runCommand('twg', [ + 'set-limits', + '--max-exit-requests-limit', + '11200', + '--exits-per-frame', + '1', + '--frame-duration', + '48', + ]); + + expect(cliRunner.isTestSuccessful(result)).toBe(true); + + expect(result.stdout).toContain('Max exit requests limit: 11200'); + expect(result.stdout).toContain('Exits per frame: 1'); + expect(result.stdout).toContain('Frame duration (seconds): 48'); + expect(result.stdout).toContain('Exit limits updated successfully!'); + }); + + test('Get TWG exit request limits', async () => { + const result = await cliRunner.runCommand('twg', ['get-limits']); + + expect(cliRunner.isTestSuccessful(result)).toBe(true); + + expect(result.stdout).toContain('max-exit-requests-limit: 11200'); + expect(result.stdout).toContain('exits-per-frame: 1'); + expect(result.stdout).toContain('frame-duration: 48'); + }); + }); + + describe('NOR Commands', () => { + test('Get NOR exit deadline threshold', async () => { + const result = await cliRunner.runCommand('nor', ['get-deadline', '--node-operator-id', '0']); + + expect(cliRunner.isTestSuccessful(result)).toBe(true); + + expect(result.stdout).toContain('Node Operator ID: 0'); + expect(result.stdout).toContain('threshold: 345600'); + }); + }); + + describe('sDVT Commands', () => { + test('Get sDVT exit deadline threshold', async () => { + const result = await cliRunner.runCommand('sdvt', ['get-deadline', '--node-operator-id', '0']); + + expect(cliRunner.isTestSuccessful(result)).toBe(true); + + expect(result.stdout).toContain('Node Operator ID: 0'); + expect(result.stdout).toContain('threshold: 345600'); + }); + }); +}); diff --git a/tests/utils/anvil-utils.ts b/tests/utils/anvil-utils.ts new file mode 100644 index 0000000..b414912 --- /dev/null +++ b/tests/utils/anvil-utils.ts @@ -0,0 +1,202 @@ +import { spawn, ChildProcess } from 'child_process'; +import fetch from 'node-fetch'; + +const ANVIL_CONFIG = { + RPC_URL: 'https://ethereum-rpc.publicnode.com', + PORT: 8545, + HOST: '0.0.0.0', + ACCOUNTS: 10, + BALANCE: '100000', + CHAIN_ID: '1', + BASE_FEE: '0', + GAS_PRICE: '1', + GAS_LIMIT: '30000000', +} as const; + +export const ANVIL_RPC_URL = `http://localhost:${ANVIL_CONFIG.PORT}`; + +const ROLES = { + SUBMITTER_ROLE: '0x22ebb4dbafb72948800c1e1afa1688772a1a4cfc54d5ebfcec8163b1139c082e', + EXIT_REQUEST_LIMIT_MANAGER_ROLE: '0x9c616dd118785b2e2fccf45a4ff151a335ff7b6a84cd1c4d7fd9f97f39ea9342', + TW_EXIT_LIMIT_MANAGER_ROLE: '0x03c30da9b9e4d4789ac88a294d39a63058ca4a498804c2aa823e381df59d0cf4', +} as const; + +const TEST_ACCOUNT = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'; + +export class AnvilRunner { + private anvilInstance: ChildProcess | null = null; + + async start(): Promise { + console.log('Starting Anvil fork from Ethereum mainnet...'); + console.log(`RPC URL: ${ANVIL_CONFIG.RPC_URL}`); + console.log(`Local port: ${ANVIL_CONFIG.PORT}`); + + await this._checkAnvilAvailable(); + + this.anvilInstance = spawn('anvil', [ + '--fork-url', + ANVIL_CONFIG.RPC_URL, + '--port', + ANVIL_CONFIG.PORT.toString(), + '--host', + ANVIL_CONFIG.HOST, + '--accounts', + ANVIL_CONFIG.ACCOUNTS.toString(), + '--balance', + ANVIL_CONFIG.BALANCE, + '--chain-id', + ANVIL_CONFIG.CHAIN_ID, + '--base-fee', + ANVIL_CONFIG.BASE_FEE, + '--gas-price', + ANVIL_CONFIG.GAS_PRICE, + '--gas-limit', + ANVIL_CONFIG.GAS_LIMIT, + ]); + + this.anvilInstance.on('error', (error) => { + console.error('Failed to start Anvil:', error.message); + throw error; + }); + + this.anvilInstance.stderr?.on('data', (data) => { + const stderrOutput = data.toString(); + console.error('Anvil stderr:', stderrOutput); + + const errorPatterns = [ + 'Error:', + 'Failed to', + 'Unable to', + 'Connection refused', + 'RPC server error', + 'Transaction failed', + 'Execution reverted', + 'Out of gas', + 'Invalid transaction', + ]; + const hasError = errorPatterns.some((pattern) => stderrOutput.toLowerCase().includes(pattern.toLowerCase())); + + if (hasError) { + console.error('🚨 Anvil error detected, failing test:', stderrOutput); + throw new Error(`Anvil error: ${stderrOutput.trim()}`); + } + }); + + console.log(`Anvil started with PID: ${this.anvilInstance.pid}`); + await this._waitForAnvil(); + } + + async stop(): Promise { + if (this.anvilInstance) { + console.log('Stopping Anvil...'); + this.anvilInstance.kill('SIGTERM'); + this.anvilInstance = null; + } + } + + async setupPermissions(): Promise { + console.log('Setting up test permissions...'); + + // @ts-expect-error TS1323: Dynamic import needed to load contracts after test config is applied + const contractsModule = await import('@contracts'); + const { exitBusOracleAddress, twgAddress, aragonAgentAddress } = contractsModule; + + const contracts = { + VEBO: exitBusOracleAddress, + TWG: twgAddress, + }; + + const adminAccount = aragonAgentAddress; + + await this._makeJsonRpcCall('anvil_impersonateAccount', [adminAccount]); + await this._makeJsonRpcCall('anvil_setBalance', [adminAccount, '0x56BC75E2D630E0000']); + await this._makeJsonRpcCall('anvil_setBalance', [TEST_ACCOUNT, '0xD3C21BCECCEDA1000000']); + + const roleGrants = [ + { contract: contracts.VEBO, role: ROLES.SUBMITTER_ROLE, name: 'submitter' }, + { contract: contracts.VEBO, role: ROLES.EXIT_REQUEST_LIMIT_MANAGER_ROLE, name: 'exit request limit manager' }, + { contract: contracts.TWG, role: ROLES.TW_EXIT_LIMIT_MANAGER_ROLE, name: 'TWG exit request limit manager' }, + ]; + + for (const { contract, role, name } of roleGrants) { + console.log(`Granting ${name} role to test account...`); + await this._runCastCommand([ + 'send', + contract, + 'grantRole(bytes32,address)', + role, + TEST_ACCOUNT, + '--rpc-url', + ANVIL_RPC_URL, + '--from', + adminAccount, + '--unlocked', + '--gas-limit', + '200000', + ]); + } + + console.log('Test permissions setup completed'); + } + + async refillTestAccount(): Promise { + await this._makeJsonRpcCall('anvil_setBalance', [TEST_ACCOUNT, '0x152D02C7E14AF6800000']); + } + + private async _checkAnvilAvailable(): Promise { + try { + const testAnvil = spawn('anvil', ['--version']); + await new Promise((resolve, reject) => { + testAnvil.on('error', reject); + testAnvil.on('close', resolve); + }); + } catch { + throw new Error('Anvil not found. Please install Foundry: https://getfoundry.sh/'); + } + } + + private async _waitForAnvil(maxAttempts = 30): Promise { + console.log('Waiting for Anvil to be ready...'); + + for (let i = 0; i < maxAttempts; i++) { + try { + await this._makeJsonRpcCall('eth_blockNumber'); + console.log(`Anvil is ready on port ${ANVIL_CONFIG.PORT}`); + return; + } catch { + if (i === maxAttempts - 1) { + throw new Error('Anvil failed to start within expected time'); + } + console.log(`Waiting for Anvil... attempt ${i + 1}/${maxAttempts}`); + await new Promise((resolve) => setTimeout(resolve, 500)); + } + } + } + + private async _makeJsonRpcCall(method: string, params: any[] = []): Promise { + const response = await fetch(ANVIL_RPC_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ jsonrpc: '2.0', method, params, id: 1 }), + }); + + if (!response.ok) throw new Error(`RPC call failed: ${response.statusText}`); + + const result = await response.json(); + if (result.error) throw new Error(`RPC error: ${result.error.message}`); + + return result.result; + } + + private async _runCastCommand(args: string[]): Promise<{ exitCode: number; stdout: string; stderr: string }> { + return new Promise((resolve) => { + const child = spawn('cast', args); + let stdout = ''; + let stderr = ''; + + child.stdout?.on('data', (data) => (stdout += data.toString())); + child.stderr?.on('data', (data) => (stderr += data.toString())); + child.on('close', (code) => resolve({ exitCode: code || 0, stdout, stderr })); + }); + } +} diff --git a/tests/utils/cli-utils.ts b/tests/utils/cli-utils.ts new file mode 100644 index 0000000..1c511f0 --- /dev/null +++ b/tests/utils/cli-utils.ts @@ -0,0 +1,76 @@ +import { spawn } from 'child_process'; +import path from 'path'; +import { ANVIL_RPC_URL } from './anvil-utils'; + +export class CliRunner { + async runCommand( + command: string, + args: string[] = [], + ): Promise<{ exitCode: number; stdout: string; stderr: string }> { + return new Promise((resolve) => { + const child = spawn(path.join(process.cwd(), 'run.sh'), [command, ...args], { + cwd: process.cwd(), + env: { + ...process.env, + RPC_URL: ANVIL_RPC_URL, + NETWORK: 'mainnet', + CHAIN_ID: '1', + EL_CHAIN_ID: '1', + EL_NETWORK_NAME: 'mainnet', + EL_API_PROVIDER: ANVIL_RPC_URL, + }, + }); + + let stdout = ''; + let stderr = ''; + + child.stdout?.on('data', (data) => (stdout += data.toString())); + child.stderr?.on('data', (data) => (stderr += data.toString())); + child.on('close', (code) => { + const result = { exitCode: code || 0, stdout, stderr }; + + console.log(`${command} output:`, result.stdout); + if (result.stderr.trim()) { + console.log(`${command} stderr:`, result.stderr); + } + + resolve(result); + }); + }); + } + + isTestSuccessful(result: { exitCode: number; stdout: string; stderr: string }): boolean { + if (result.stderr.trim()) { + console.error('🚨 CLI command failed - stderr not empty:', result.stderr); + return false; + } + + if (result.exitCode !== 0) { + console.error('🚨 CLI command failed with exit code:', result.exitCode); + return false; + } + + const errorPatterns = [ + 'RPC request failed', + 'execution reverted', + 'Transaction failed', + 'Failed to submit', + 'Error:', + 'Insufficient funds', + 'insufficient funds', + 'Failed to', + 'Unable to', + 'Connection refused', + 'RPC server error', + 'Out of gas', + 'Invalid transaction', + ]; + const hasError = errorPatterns.some((pattern) => result.stdout.toLowerCase().includes(pattern.toLowerCase())); + + if (hasError) { + console.error('🚨 CLI command error detected in stdout:', result.stdout); + } + + return !hasError; + } +} diff --git a/tests/utils/index.ts b/tests/utils/index.ts new file mode 100644 index 0000000..5a708fa --- /dev/null +++ b/tests/utils/index.ts @@ -0,0 +1,2 @@ +export { AnvilRunner, ANVIL_RPC_URL } from './anvil-utils'; +export { CliRunner } from './cli-utils'; diff --git a/tsconfig.json b/tsconfig.json index edba9e5..7154e24 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,6 +21,7 @@ "@utils": ["utils"] } }, + "exclude": ["vitest.config.ts"], "ts-node": { "swc": true, "require": ["tsconfig-paths/register"] diff --git a/utils/authorized-call.ts b/utils/authorized-call.ts index 7938425..627e0e7 100644 --- a/utils/authorized-call.ts +++ b/utils/authorized-call.ts @@ -4,7 +4,7 @@ import { aragonAgentAddress, votingAddress } from '@contracts'; import { encodeCallScript } from './scripts'; import { forwardVoteFromTm } from './voting'; import { contractCallTxWithConfirm } from './call-tx'; -import { agentForward } from 'scripts/agent'; +import { agentForward } from '@scripts'; import { getProvider, getSignerAddress } from './contract'; import { logger } from './logger'; diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..a54aa08 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,33 @@ +/// +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + testTimeout: 300000, // 5 minutes for integration tests with Anvil + hookTimeout: 60000, // 1 minute for setup/teardown hooks + globals: true, + environment: 'node', + include: ['**/*.test.{js,ts}'], + exclude: ['node_modules/**', 'dist/**'], + // Keep tests sequential since they share the same Anvil instance + pool: 'forks', + poolOptions: { + forks: { + singleFork: true, // Run tests sequentially in single fork + }, + }, + setupFiles: ['./tests/setup.ts'], + }, + resolve: { + alias: { + '@command': new URL('./command', import.meta.url).pathname, + '@consensus': new URL('./consensus', import.meta.url).pathname, + '@configs': new URL('./configs', import.meta.url).pathname, + '@contracts': new URL('./contracts', import.meta.url).pathname, + '@providers': new URL('./providers', import.meta.url).pathname, + '@scripts': new URL('./scripts', import.meta.url).pathname, + '@utils': new URL('./utils', import.meta.url).pathname, + abi: new URL('./abi', import.meta.url).pathname, + }, + }, +}); diff --git a/yarn.lock b/yarn.lock index 158e845..dc21ec3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -129,6 +129,136 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@esbuild/aix-ppc64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz#80fcbe36130e58b7670511e888b8e88a259ed76c" + integrity sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA== + +"@esbuild/android-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz#8aa4965f8d0a7982dc21734bf6601323a66da752" + integrity sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg== + +"@esbuild/android-arm@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz#300712101f7f50f1d2627a162e6e09b109b6767a" + integrity sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg== + +"@esbuild/android-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz#87dfb27161202bdc958ef48bb61b09c758faee16" + integrity sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg== + +"@esbuild/darwin-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz#79197898ec1ff745d21c071e1c7cc3c802f0c1fd" + integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg== + +"@esbuild/darwin-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz#146400a8562133f45c4d2eadcf37ddd09718079e" + integrity sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA== + +"@esbuild/freebsd-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz#1c5f9ba7206e158fd2b24c59fa2d2c8bb47ca0fe" + integrity sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg== + +"@esbuild/freebsd-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz#ea631f4a36beaac4b9279fa0fcc6ca29eaeeb2b3" + integrity sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ== + +"@esbuild/linux-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz#e1066bce58394f1b1141deec8557a5f0a22f5977" + integrity sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ== + +"@esbuild/linux-arm@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz#452cd66b20932d08bdc53a8b61c0e30baf4348b9" + integrity sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw== + +"@esbuild/linux-ia32@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz#b24f8acc45bcf54192c7f2f3be1b53e6551eafe0" + integrity sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA== + +"@esbuild/linux-loong64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz#f9cfffa7fc8322571fbc4c8b3268caf15bd81ad0" + integrity sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng== + +"@esbuild/linux-mips64el@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz#575a14bd74644ffab891adc7d7e60d275296f2cd" + integrity sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw== + +"@esbuild/linux-ppc64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz#75b99c70a95fbd5f7739d7692befe60601591869" + integrity sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA== + +"@esbuild/linux-riscv64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz#2e3259440321a44e79ddf7535c325057da875cd6" + integrity sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w== + +"@esbuild/linux-s390x@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz#17676cabbfe5928da5b2a0d6df5d58cd08db2663" + integrity sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg== + +"@esbuild/linux-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz#0583775685ca82066d04c3507f09524d3cd7a306" + integrity sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw== + +"@esbuild/netbsd-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz#f04c4049cb2e252fe96b16fed90f70746b13f4a4" + integrity sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg== + +"@esbuild/netbsd-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz#77da0d0a0d826d7c921eea3d40292548b258a076" + integrity sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ== + +"@esbuild/openbsd-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz#6296f5867aedef28a81b22ab2009c786a952dccd" + integrity sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A== + +"@esbuild/openbsd-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz#f8d23303360e27b16cf065b23bbff43c14142679" + integrity sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw== + +"@esbuild/openharmony-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz#49e0b768744a3924be0d7fd97dd6ce9b2923d88d" + integrity sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg== + +"@esbuild/sunos-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz#a6ed7d6778d67e528c81fb165b23f4911b9b13d6" + integrity sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w== + +"@esbuild/win32-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz#9ac14c378e1b653af17d08e7d3ce34caef587323" + integrity sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg== + +"@esbuild/win32-ia32@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz#918942dcbbb35cc14fca39afb91b5e6a3d127267" + integrity sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ== + +"@esbuild/win32-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz#9bdad8176be7811ad148d1f8772359041f46c6c5" + integrity sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.1" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" @@ -233,6 +363,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -284,6 +419,116 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== +"@rollup/rollup-android-arm-eabi@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz#0f44a2f8668ed87b040b6fe659358ac9239da4db" + integrity sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ== + +"@rollup/rollup-android-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz#25b9a01deef6518a948431564c987bcb205274f5" + integrity sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA== + +"@rollup/rollup-darwin-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz#8a102869c88f3780c7d5e6776afd3f19084ecd7f" + integrity sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA== + +"@rollup/rollup-darwin-x64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz#8e526417cd6f54daf1d0c04cf361160216581956" + integrity sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA== + +"@rollup/rollup-freebsd-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz#0e7027054493f3409b1f219a3eac5efd128ef899" + integrity sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA== + +"@rollup/rollup-freebsd-x64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz#72b204a920139e9ec3d331bd9cfd9a0c248ccb10" + integrity sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz#ab1b522ebe5b7e06c99504cc38f6cd8b808ba41c" + integrity sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ== + +"@rollup/rollup-linux-arm-musleabihf@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz#f8cc30b638f1ee7e3d18eac24af47ea29d9beb00" + integrity sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ== + +"@rollup/rollup-linux-arm64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz#7af37a9e85f25db59dc8214172907b7e146c12cc" + integrity sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg== + +"@rollup/rollup-linux-arm64-musl@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz#a623eb0d3617c03b7a73716eb85c6e37b776f7e0" + integrity sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q== + +"@rollup/rollup-linux-loong64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz#76ea038b549c5c6c5f0d062942627c4066642ee2" + integrity sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA== + +"@rollup/rollup-linux-ppc64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz#d9a4c3f0a3492bc78f6fdfe8131ac61c7359ccd5" + integrity sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw== + +"@rollup/rollup-linux-riscv64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz#87ab033eebd1a9a1dd7b60509f6333ec1f82d994" + integrity sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw== + +"@rollup/rollup-linux-riscv64-musl@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz#bda3eb67e1c993c1ba12bc9c2f694e7703958d9f" + integrity sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg== + +"@rollup/rollup-linux-s390x-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz#f7bc10fbe096ab44694233dc42a2291ed5453d4b" + integrity sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ== + +"@rollup/rollup-linux-x64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz#a151cb1234cc9b2cf5e8cfc02aa91436b8f9e278" + integrity sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q== + +"@rollup/rollup-linux-x64-musl@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz#7859e196501cc3b3062d45d2776cfb4d2f3a9350" + integrity sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg== + +"@rollup/rollup-openharmony-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz#85d0df7233734df31e547c1e647d2a5300b3bf30" + integrity sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw== + +"@rollup/rollup-win32-arm64-msvc@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz#e62357d00458db17277b88adbf690bb855cac937" + integrity sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w== + +"@rollup/rollup-win32-ia32-msvc@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz#fc7cd40f44834a703c1f1c3fe8bcc27ce476cd50" + integrity sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg== + +"@rollup/rollup-win32-x64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz#1a22acfc93c64a64a48c42672e857ee51774d0d3" + integrity sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ== + +"@rollup/rollup-win32-x64-msvc@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz#1657f56326bbe0ac80eedc9f9c18fc1ddd24e107" + integrity sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg== + "@scure/base@~1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" @@ -297,6 +542,11 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" +"@standard-schema/spec@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c" + integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA== + "@swc/core-darwin-arm64@1.11.9": version "1.11.9" resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.9.tgz#6506cf6704adae19fcc4f607dc435f1f9bd3b5ac" @@ -398,6 +648,14 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@types/chai@^5.2.2": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" + integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== + dependencies: + "@types/deep-eql" "*" + assertion-error "^2.0.1" + "@types/cli-progress@^3.11.5": version "3.11.6" resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.6.tgz#94b334ebe4190f710e51c1bf9b4fedb681fa9e45" @@ -405,6 +663,16 @@ dependencies: "@types/node" "*" +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/estree@1.0.8", "@types/estree@^1.0.0": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" @@ -540,6 +808,64 @@ "@typescript-eslint/types" "8.26.1" eslint-visitor-keys "^4.2.0" +"@vitest/expect@4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.0.7.tgz#2bb08ee49946144536934478a699f54c4961c8c3" + integrity sha512-jGRG6HghnJDjljdjYIoVzX17S6uCVCBRFnsgdLGJ6CaxfPh8kzUKe/2n533y4O/aeZ/sIr7q7GbuEbeGDsWv4Q== + dependencies: + "@standard-schema/spec" "^1.0.0" + "@types/chai" "^5.2.2" + "@vitest/spy" "4.0.7" + "@vitest/utils" "4.0.7" + chai "^6.0.1" + tinyrainbow "^3.0.3" + +"@vitest/mocker@4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.0.7.tgz#44ff3863bd78ef5d4d5d62e0b600e9d6a9491f4b" + integrity sha512-OsDwLS7WnpuNslOV6bJkXVYVV/6RSc4eeVxV7h9wxQPNxnjRvTTrIikfwCbMyl8XJmW6oOccBj2Q07YwZtQcCw== + dependencies: + "@vitest/spy" "4.0.7" + estree-walker "^3.0.3" + magic-string "^0.30.19" + +"@vitest/pretty-format@4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.0.7.tgz#1fba6a3c894966678f49ef5d788b0e53e0f03995" + integrity sha512-YY//yxqTmk29+/pK+Wi1UB4DUH3lSVgIm+M10rAJ74pOSMgT7rydMSc+vFuq9LjZLhFvVEXir8EcqMke3SVM6Q== + dependencies: + tinyrainbow "^3.0.3" + +"@vitest/runner@4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.0.7.tgz#0a9a8f9c1283883f0828b343a4ee3f9a3f318171" + integrity sha512-orU1lsu4PxLEcDWfjVCNGIedOSF/YtZ+XMrd1PZb90E68khWCNzD8y1dtxtgd0hyBIQk8XggteKN/38VQLvzuw== + dependencies: + "@vitest/utils" "4.0.7" + pathe "^2.0.3" + +"@vitest/snapshot@4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.0.7.tgz#6aa1f94215b43579c631366390de29c2288843ca" + integrity sha512-xJL+Nkw0OjaUXXQf13B8iKK5pI9QVtN9uOtzNHYuG/o/B7fIEg0DQ+xOe0/RcqwDEI15rud1k7y5xznBKGUXAA== + dependencies: + "@vitest/pretty-format" "4.0.7" + magic-string "^0.30.19" + pathe "^2.0.3" + +"@vitest/spy@4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.0.7.tgz#41572d90fad66e249a4b4439d7980286f0fbc1c3" + integrity sha512-FW4X8hzIEn4z+HublB4hBF/FhCVaXfIHm8sUfvlznrcy1MQG7VooBgZPMtVCGZtHi0yl3KESaXTqsKh16d8cFg== + +"@vitest/utils@4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.0.7.tgz#7fac85b2451ff7c91bde4b00c78224f44323978d" + integrity sha512-HNrg9CM/Z4ZWB6RuExhuC6FPmLipiShKVMnT9JlQvfhwR47JatWLChA6mtZqVHqypE6p/z6ofcjbyWpM7YLxPQ== + dependencies: + "@vitest/pretty-format" "4.0.7" + tinyrainbow "^3.0.3" + JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -607,6 +933,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -644,6 +975,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +chai@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.0.tgz#181bca6a219cddb99c3eeefb82483800ffa550ce" + integrity sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA== + chalk@^4, chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -718,6 +1054,13 @@ debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "^2.1.3" +debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -743,6 +1086,43 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +es-module-lexer@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== + +esbuild@^0.25.0: + version "0.25.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.12.tgz#97a1d041f4ab00c2fce2f838d2b9969a2d2a97a5" + integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.12" + "@esbuild/android-arm" "0.25.12" + "@esbuild/android-arm64" "0.25.12" + "@esbuild/android-x64" "0.25.12" + "@esbuild/darwin-arm64" "0.25.12" + "@esbuild/darwin-x64" "0.25.12" + "@esbuild/freebsd-arm64" "0.25.12" + "@esbuild/freebsd-x64" "0.25.12" + "@esbuild/linux-arm" "0.25.12" + "@esbuild/linux-arm64" "0.25.12" + "@esbuild/linux-ia32" "0.25.12" + "@esbuild/linux-loong64" "0.25.12" + "@esbuild/linux-mips64el" "0.25.12" + "@esbuild/linux-ppc64" "0.25.12" + "@esbuild/linux-riscv64" "0.25.12" + "@esbuild/linux-s390x" "0.25.12" + "@esbuild/linux-x64" "0.25.12" + "@esbuild/netbsd-arm64" "0.25.12" + "@esbuild/netbsd-x64" "0.25.12" + "@esbuild/openbsd-arm64" "0.25.12" + "@esbuild/openbsd-x64" "0.25.12" + "@esbuild/openharmony-arm64" "0.25.12" + "@esbuild/sunos-x64" "0.25.12" + "@esbuild/win32-arm64" "0.25.12" + "@esbuild/win32-ia32" "0.25.12" + "@esbuild/win32-x64" "0.25.12" + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -843,6 +1223,13 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -861,6 +1248,11 @@ ethers@^6.2.2: tslib "2.7.0" ws "8.17.1" +expect-type@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.2.tgz#c030a329fb61184126c8447585bc75a7ec6fbff3" + integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -899,6 +1291,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -943,6 +1340,11 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1086,6 +1488,13 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +magic-string@^0.30.19: + version "0.30.21" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -1140,6 +1549,11 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -1195,11 +1609,35 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -1245,6 +1683,37 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rollup@^4.43.0: + version "4.52.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.52.5.tgz#96982cdcaedcdd51b12359981f240f94304ec235" + integrity sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.52.5" + "@rollup/rollup-android-arm64" "4.52.5" + "@rollup/rollup-darwin-arm64" "4.52.5" + "@rollup/rollup-darwin-x64" "4.52.5" + "@rollup/rollup-freebsd-arm64" "4.52.5" + "@rollup/rollup-freebsd-x64" "4.52.5" + "@rollup/rollup-linux-arm-gnueabihf" "4.52.5" + "@rollup/rollup-linux-arm-musleabihf" "4.52.5" + "@rollup/rollup-linux-arm64-gnu" "4.52.5" + "@rollup/rollup-linux-arm64-musl" "4.52.5" + "@rollup/rollup-linux-loong64-gnu" "4.52.5" + "@rollup/rollup-linux-ppc64-gnu" "4.52.5" + "@rollup/rollup-linux-riscv64-gnu" "4.52.5" + "@rollup/rollup-linux-riscv64-musl" "4.52.5" + "@rollup/rollup-linux-s390x-gnu" "4.52.5" + "@rollup/rollup-linux-x64-gnu" "4.52.5" + "@rollup/rollup-linux-x64-musl" "4.52.5" + "@rollup/rollup-openharmony-arm64" "4.52.5" + "@rollup/rollup-win32-arm64-msvc" "4.52.5" + "@rollup/rollup-win32-ia32-msvc" "4.52.5" + "@rollup/rollup-win32-x64-gnu" "4.52.5" + "@rollup/rollup-win32-x64-msvc" "4.52.5" + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -1269,11 +1738,31 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.9.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== + string-argv@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" @@ -1325,6 +1814,29 @@ synckit@^0.9.1: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +tinyrainbow@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-3.0.3.tgz#984a5b1c1b25854a9b6bccbe77964d0593d1ea42" + integrity sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1414,6 +1926,46 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +"vite@^6.0.0 || ^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-7.2.0.tgz#a362bc909af8b01736e56d287ce5a5d88598ad1a" + integrity sha512-C/Naxf8H0pBx1PA4BdpT+c/5wdqI9ILMdwjSMILw7tVIh3JsxzZqdeTLmmdaoh5MYUEOyBnM9K3o0DzoZ/fe+w== + dependencies: + esbuild "^0.25.0" + fdir "^6.5.0" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.15" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-4.0.7.tgz#02b767742cb962927278ce4a1a1acaa0bcd3eff0" + integrity sha512-xQroKAadK503CrmbzCISvQUjeuvEZzv6U0wlnlVFOi5i3gnzfH4onyQ29f3lzpe0FresAiTAd3aqK0Bi/jLI8w== + dependencies: + "@vitest/expect" "4.0.7" + "@vitest/mocker" "4.0.7" + "@vitest/pretty-format" "4.0.7" + "@vitest/runner" "4.0.7" + "@vitest/snapshot" "4.0.7" + "@vitest/spy" "4.0.7" + "@vitest/utils" "4.0.7" + debug "^4.4.3" + es-module-lexer "^1.7.0" + expect-type "^1.2.2" + magic-string "^0.30.19" + pathe "^2.0.3" + picomatch "^4.0.3" + std-env "^3.9.0" + tinybench "^2.9.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.15" + tinyrainbow "^3.0.3" + vite "^6.0.0 || ^7.0.0" + why-is-node-running "^2.3.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -1434,6 +1986,14 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"