From 2ba9a149ca4a73f467385d3d9318a5ce322deaec Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Mon, 13 Nov 2023 11:04:57 +0300 Subject: [PATCH 01/14] feat: holesky modules --- configs/deployed-goerli.json | 564 +++++++++-------- configs/deployed-holesky.json | 901 +++++++++++++++------------ configs/deployed-mainnet.json | 835 +++++++++++++------------ configs/deployed.ts | 9 + contracts/deposit-contract.ts | 2 +- contracts/index.ts | 2 + contracts/locator.ts | 2 +- contracts/oracles.ts | 14 +- contracts/sandbox.ts | 7 + contracts/simple-dvt.ts | 7 + contracts/staking-router.ts | 2 +- contracts/withdrawal-request.ts | 2 +- programs/common/curated-module.ts | 169 +++++ programs/common/index.ts | 1 + programs/index.ts | 2 + programs/nor.ts | 168 +---- programs/sandbox.ts | 9 + programs/simple-dvt.ts | 9 + programs/staking-module/operators.ts | 22 +- programs/voting.ts | 2 + utils/parse-method-call.ts | 12 +- 21 files changed, 1492 insertions(+), 1249 deletions(-) create mode 100644 contracts/sandbox.ts create mode 100644 contracts/simple-dvt.ts create mode 100644 programs/common/curated-module.ts create mode 100644 programs/sandbox.ts create mode 100644 programs/simple-dvt.ts diff --git a/configs/deployed-goerli.json b/configs/deployed-goerli.json index 110d9d8..63af5aa 100644 --- a/configs/deployed-goerli.json +++ b/configs/deployed-goerli.json @@ -1,78 +1,167 @@ { - "deployCommit": "990dda79d8b19358b6b7ab4a38d0be4af6e732ea", - "networkId": 5, - "daoAragonId": "lido-testnet-prater", - "ensAddress": "0x043e6DBC5CAd60874727d21ecC2aAeBf50A0de80", - "daoFactoryAddress": "0x0B6769F500b293e3adacD97c3961189565069902", + "accountingOracle": { + "deployParameters": { + "consensusVersion": 1 + }, + "contract": "AccountingOracle", + "implementation": "0xC94ad2eb129146235f71cc35f7FbFec7fe404DF9", + "address": "0x76f358A842defa0E179a8970767CFf668Fc134d6", + "constructorArgs": [ + "0x1eDf09b5023DC86737b59dE68a8130De878984f5", + "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", + "0x24d8451BC07e7aF4Ba94F69aCDD9ad3c6579D9FB", + 12, + 1616508000 + ] + }, "apmRegistryFactoryAddress": "0x70B3284fD016a570146cE48fC54D7A81bCd94BBa", - "miniMeTokenFactoryAddress": "0x92E2750729e04c9a5CF21A830Bd00cbd5139D992", - "aragonIDAddress": "0x673cB86B60B9768Eebb05517fbF5a7F9f1Ab62C4", - "multisigAddress": "0x8303B3A462F4Cb4d2468DDcBD4c9f212914A3a7F", - "daoTemplateConstructorArgs": [ - "0x8303B3A462F4Cb4d2468DDcBD4c9f212914A3a7F", - "0x0B6769F500b293e3adacD97c3961189565069902", - "0x043e6DBC5CAd60874727d21ecC2aAeBf50A0de80", - "0x92E2750729e04c9a5CF21A830Bd00cbd5139D992", - "0x673cB86B60B9768Eebb05517fbF5a7F9f1Ab62C4", - "0x70B3284fD016a570146cE48fC54D7A81bCd94BBa" - ], - "daoTemplateDeployTx": "0xda8746bca23c7a4f7c58e1a3370cb1ffa1e250ace90fd4684dbb1842ee6ac921", - "compositePostRebaseBeaconReceiverDeployTx": "0x1c301d51d66e20403915bf5f44359470a1f847560d8d22c9d2c99aaffbae50d7", - "executionLayerRewardsVaultDeployTx": "0x3bce97664f6003ddf4e3cf7178527dbff6098b1a6fc9ba7c337cb6aca4ea91fb", - "selfOwnedStETHBurnerDeployTx": "0x02428a5edd7fc5c4cadbf126a345a401cf2a46ea98116894828d90255e4b27e4", - "daoTemplateAddress": "0x9A4a36B5fe517f98BD6529d4317B0b723F600AaD", + "app:aragon-agent": { + "implementation": { + "contract": "@aragon/apps-agent/contracts/Agent.sol", + "address": "0xf6Fe63e6Ff034D60f9F2a403A046e1c456b11Ab4", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-agent", + "fullName": "aragon-agent.lidopm-testnet-prater.eth", + "id": "0xd4af5c5d5775bec8d4569a4d2462e0afcb7286b4129ee1ce70cdd44c59f0d961" + }, + "proxy": { + "address": "0x4333218072D5d7008546737786663c38B4D561A4", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, + "app:aragon-finance": { + "implementation": { + "contract": "@aragon/apps-finance/contracts/Finance.sol", + "address": "0xf6Fe63e6Ff034D60f9F2a403A046e1c456b11Ab4", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-finance", + "fullName": "aragon-finance.lidopm-testnet-prater.eth", + "id": "0xb0f95ac3c63389bb668187b7363eabb9d22c52359fc70f5247004f369afbe860" + }, + "proxy": { + "address": "0x75c7b1D23f1cad7Fb4D60281d7069E46440BC179", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, + "app:aragon-token-manager": { + "implementation": { + "contract": "@aragon/apps-lido/apps/token-manager/contracts/TokenManager.sol", + "address": "0xAb304946E8Ed172037aC9aBF9da58a6a7C8d443B", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-token-manager", + "fullName": "aragon-token-manager.lidopm-testnet-prater.eth", + "id": "0x0cee0e187359b8e41a11706fbe2704f89554ac7156f1c18152d5cbbd085bb91c" + }, + "proxy": { + "address": "0xDfe76d11b365f5e0023343A367f0b311701B3bc1", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, + "app:aragon-voting": { + "implementation": { + "contract": "@aragon/apps-lido/apps/voting/contracts/Voting.sol", + "address": "0x3DB95165e8efaF08a97A35F297FbCBd57a97aFe4", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-voting", + "fullName": "aragon-voting.lidopm-testnet-prater.eth", + "id": "0xee7f2abf043afe722001aaa900627a6e29adcbcce63a561fbd97e0a0c6429b94", + "contentURI": "0x697066733a516d5962774366374d6e6932797a31553358334769485667396f35316a6b53586731533877433257547755684859" + }, + "proxy": { + "address": "0xbc0B67b4553f4CF52a913DE9A6eD0057E2E758Db", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, "app:lido": { - "baseAddress": "0xEE227CC91A769881b1e81350224AEeF7587eBe76", - "ipfsCid": "QmbmPW5r9HMdyUARNJjjE7MNqBUGrXashwoWvqRZhc1t5b", - "contentURI": "0x697066733a516d626d5057357239484d64795541524e4a6a6a45374d4e714255477258617368776f577671525a686331743562", - "name": "lido", - "fullName": "lido.lidopm-testnet-prater.eth", - "id": "0x79ac01111b462384f1b7fba84a17b9ec1f5d2fddcfcb99487d71b443832556ea", - "proxyAddress": "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", - "contract": "Lido", - "implementation": "0x26c41Ef17780cAdde73A2d00902e5e18856201b4", - "constructorArgs": [], - "implementationDeployCommit": "85a41c45d5d45b1a35118ad6023e6c7ead1072d2" + "implementation": { + "contract": "contracts/0.4.24/Lido.sol", + "address": "0x26c41Ef17780cAdde73A2d00902e5e18856201b4", + "constructorArgs": [] + }, + "aragonApp": { + "name": "lido", + "fullName": "lido.lidopm-testnet-prater.eth", + "id": "0x79ac01111b462384f1b7fba84a17b9ec1f5d2fddcfcb99487d71b443832556ea", + "ipfsCid": "QmbmPW5r9HMdyUARNJjjE7MNqBUGrXashwoWvqRZhc1t5b", + "contentURI": "0x697066733a516d626d5057357239484d64795541524e4a6a6a45374d4e714255477258617368776f577671525a686331743562" + }, + "proxy": { + "address": "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, + "app:node-operators-registry": { + "proxy": { + "address": "0x9D4AF1Ee19Dad8857db3a45B0374c81c8A1C6320" + }, + "implementation": { + "address": "0x4672275F75e8756a53cD87F08F67f51309675D57", + "contract": "contracts/0.4.24/nos/NodeOperatorsRegistry.sol", + "constructorArgs": [] + }, + "aragonApp": { + "ipfsCid": "QmQExJkoyg7xWXJjLaYC75UAmsGY1STY41YTG3wEK7q8dd", + "contentURI": "0x697066733a516d5145784a6b6f7967377857584a6a4c615943373555416d7347593153545934315954473377454b3771386464", + "name": "node-operators-registry", + "fullName": "node-operators-registry.lidopm-testnet-prater.eth", + "id": "0x57384c8fcaf2c1c2144974769a6ea4e5cf69090d47f5327f8fc93827f8c0001a" + } }, "app:oracle": { - "baseAddress": "0xcF9d64942DC9096520a8962a2d4496e680c6403b", - "ipfsCid": "QmfACH9oSHFWgV81Dh8RSVcgaVBdhkZuHhZY2iZv5syBJK", - "contentURI": "0x697066733a516d66414348396f5348465767563831446838525356636761564264686b5a7548685a5932695a76357379424a4b", - "name": "oracle", - "fullName": "oracle.lidopm-testnet-prater.eth", - "id": "0xb2977cfc13b000b6807b9ae3cf4d938f4cc8ba98e1d68ad911c58924d6aa4f11", - "proxyAddress": "0x24d8451BC07e7aF4Ba94F69aCDD9ad3c6579D9FB" + "proxy": { + "address": "0x24d8451BC07e7aF4Ba94F69aCDD9ad3c6579D9FB" + }, + "implementation": { + "address": "0xcF9d64942DC9096520a8962a2d4496e680c6403b", + "contract": "contracts/0.4.24/oracle/LegacyOracle.sol" + }, + "aragonApp": { + "ipfsCid": "QmfACH9oSHFWgV81Dh8RSVcgaVBdhkZuHhZY2iZv5syBJK", + "contentURI": "0x697066733a516d66414348396f5348465767563831446838525356636761564264686b5a7548685a5932695a76357379424a4b", + "name": "oracle", + "fullName": "oracle.lidopm-testnet-prater.eth", + "id": "0xb2977cfc13b000b6807b9ae3cf4d938f4cc8ba98e1d68ad911c58924d6aa4f11" + } }, - "app:node-operators-registry": { - "baseAddress": "0xCAfe9Ac6a4bE2eAfCFf949693C0da9eebF985C3B", - "ipfsCid": "QmQExJkoyg7xWXJjLaYC75UAmsGY1STY41YTG3wEK7q8dd", - "contentURI": "0x697066733a516d5145784a6b6f7967377857584a6a4c615943373555416d7347593153545934315954473377454b3771386464", - "name": "node-operators-registry", - "fullName": "node-operators-registry.lidopm-testnet-prater.eth", - "id": "0x57384c8fcaf2c1c2144974769a6ea4e5cf69090d47f5327f8fc93827f8c0001a", - "proxyAddress": "0x9D4AF1Ee19Dad8857db3a45B0374c81c8A1C6320", - "contract": "NodeOperatorsRegistry", - "implementation": "0x4672275F75e8756a53cD87F08F67f51309675D57", - "constructorArgs": [], - "implementationDeployCommit": "85a41c45d5d45b1a35118ad6023e6c7ead1072d2" + "aragonIDAddress": "0x673cB86B60B9768Eebb05517fbF5a7F9f1Ab62C4", + "burner": { + "deployParameters": { + "totalCoverSharesBurnt": "0", + "totalNonCoverSharesBurnt": "0" + }, + "address": "0xC1Bc16782BE0ce7A81421874A4d3E9B2B32391f2", + "constructorArgs": [ + "0x4333218072D5d7008546737786663c38B4D561A4", + "0x4333218072D5d7008546737786663c38B4D561A4", + "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", + "0", + "0" + ], + "contract": "Burner" }, - "lidoApmEnsName": "lidopm-testnet-prater.eth", - "lidoApmDeployTx": "0x5177a441fbf121e4064979f53756cc2ee807c68684edae33f50868a40ebae013", - "lidoApmAddress": "0x64361389f8Bb7A1ff64e0Ad97FfAa432399D45E7", - "depositContract": { - "address": "0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b" + "chainSpec": { + "depositContractAddress": "0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b", + "slotsPerEpoch": 32, + "secondsPerSlot": 12, + "genesisTime": 1616508000 }, + "createAppReposTx": "0x76225ccd0d6f03c1e6707125fae7a04096f24a37e3e5c59a3847323dca343f62", + "daoAddress": "0x1dD91b354Ebd706aB3Ac7c727455C7BAA164945A", + "daoAragonId": "lido-testnet-prater", + "daoFactoryAddress": "0x0B6769F500b293e3adacD97c3961189565069902", "daoInitialSettings": { "token": { "name": "Test Lido DAO Token", "symbol": "TESTLDO" }, - "beaconSpec": { - "depositContractAddress": "0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b", - "slotsPerEpoch": 32, - "secondsPerSlot": 12, - "genesisTime": 1616508000 - }, "voting": { "minSupportRequired": "500000000000000000", "minAcceptanceQuorum": "50000000000000000", @@ -85,94 +174,44 @@ "nodeOperatorsPercent": 50 } }, - "createAppReposTx": "0x76225ccd0d6f03c1e6707125fae7a04096f24a37e3e5c59a3847323dca343f62", - "newDaoTx": "0xcc5a0e1b690bac8edb5638f79fcf765f703e218147fbb1d767e502560d4a7c89", - "daoAddress": "0x1dD91b354Ebd706aB3Ac7c727455C7BAA164945A", "daoTokenAddress": "0x56340274fB5a72af1A3C6609061c451De7961Bd4", - "app:aragon-agent": { - "name": "aragon-agent", - "fullName": "aragon-agent.lidopm-testnet-prater.eth", - "id": "0xd4af5c5d5775bec8d4569a4d2462e0afcb7286b4129ee1ce70cdd44c59f0d961", - "proxyAddress": "0x4333218072D5d7008546737786663c38B4D561A4" - }, - "app:aragon-finance": { - "name": "aragon-finance", - "fullName": "aragon-finance.lidopm-testnet-prater.eth", - "id": "0xb0f95ac3c63389bb668187b7363eabb9d22c52359fc70f5247004f369afbe860", - "proxyAddress": "0x75c7b1D23f1cad7Fb4D60281d7069E46440BC179" - }, - "app:aragon-token-manager": { - "name": "aragon-token-manager", - "fullName": "aragon-token-manager.lidopm-testnet-prater.eth", - "id": "0x0cee0e187359b8e41a11706fbe2704f89554ac7156f1c18152d5cbbd085bb91c", - "proxyAddress": "0xDfe76d11b365f5e0023343A367f0b311701B3bc1" - }, - "app:aragon-voting": { - "name": "aragon-voting", - "fullName": "aragon-voting.lidopm-testnet-prater.eth", - "id": "0xee7f2abf043afe722001aaa900627a6e29adcbcce63a561fbd97e0a0c6429b94", - "proxyAddress": "0xbc0B67b4553f4CF52a913DE9A6eD0057E2E758Db", - "baseAddress": "0x3DB95165e8efaF08a97A35F297FbCBd57a97aFe4", - "contentURI": "0x697066733a516d5962774366374d6e6932797a31553358334769485667396f35316a6b53586731533877433257547755684859" - }, - "vestingParams": { - "unvestedTokensAmount": "230000000000000000000000", - "holders": { - "0xa5F1d7D49F581136Cf6e58B32cBE9a2039C48bA1": "530000000000000000000000", - "0x00444797Ba158A7BdB8302e72da98dCbCCef0Fbc": "15000000000000000000000", - "0x9F188809b2ba2e29653693C4069c212a95C1B8c4": "15000000000000000000000", - "0xeC2d2E81721A477798e938924266f92c4E5Fc54e": "15000000000000000000000", - "0x401FD888B5E41113B7c0C47725A742bbc3A083EF": "15000000000000000000000", - "0x36c648351274bb4455ba6aAabF3F976824a93aF4": "15000000000000000000000", - "0xB6d0A3120c0e13749c211F48fccD9458Dfc99BD0": "15000000000000000000000", - "0x75936b355942D89d9B59798dacD70d70Ded93B78": "15000000000000000000000", - "0x39ceC2b3ba293CC15f15a3876dB8D356a1670789": "15000000000000000000000", - "0xC37F899BB002D93fdcbD9D91d42889AC0e29B704": "15000000000000000000000", - "0xc69f1606e0615F788Cb99982848528f39f188486": "15000000000000000000000", - "0xd355521db7f30F74059dFa7aE0A5C6543dFA8215": "15000000000000000000000", - "0xAA566f0eB53F26db5E15aC5B42685361B4e0d9F4": "15000000000000000000000", - "0xCd3975FC68Aa71eDebfef7442cF8e91ce407DEEE": "15000000000000000000000", - "0xfd0dd5c3b72528e8f581a8544309706d1c2d9206": "15000000000000000000000", - "0x161EE6a03D52ee176a514C88Cf07dcAcF248155f": "15000000000000000000000", - "0x11D7D72876cfC3d7CFC3d1a2C9c35EA4591694a7": "15000000000000000000000" - }, - "start": 1617139000, - "cliff": 1617139500, - "end": 1617139900, - "revokable": false - }, - "wstethContractAddress": "0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f", - "wstethContractConstructorArgs": [ - "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F" - ], - "executionLayerRewardsVaultAddress": "0x94750381bE1AbA0504C666ee1DB118F68f0780D4", - "depositorPreviousAddress": "0xEd23AD3EA5Fb9d10e7371Caef1b141AD1C23A80c", - "dummyImplementation": { - "address": "0x6A03b1BbB79460169a205eFBCBc77ebE1011bCf8" - }, - "burner": { - "parameters": { - "totalCoverSharesBurnt": "0", - "totalNonCoverSharesBurnt": "0" + "deployCommit": "990dda79d8b19358b6b7ab4a38d0be4af6e732ea", + "deployer": "0x8303B3A462F4Cb4d2468DDcBD4c9f212914A3a7F", + "depositSecurityModule": { + "deployParameters": { + "maxDepositsPerBlock": 0, + "minDepositBlockDistance": 1200, + "pauseIntentValidityPeriodBlocks": 10 }, - "address": "0xC1Bc16782BE0ce7A81421874A4d3E9B2B32391f2", + "contract": "DepositSecurityModule", + "address": "0xe57025E250275cA56f92d76660DEcfc490C7E79A", "constructorArgs": [ - "0x4333218072D5d7008546737786663c38B4D561A4", - "0x4333218072D5d7008546737786663c38B4D561A4", "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", + "0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b", + "0xa3Dbd317E53D363176359E10948BA0b1c0A4c820", "0", - "0" - ], - "contract": "Burner", - "implementationDeployCommit": "85a41c45d5d45b1a35118ad6023e6c7ead1072d2" + "4b0", + "a" + ] }, - "legacyOracle": { - "parameters": { - "lastCompletedEpochId": 0 - } + "dummyEmptyContract": { + "address": "0x6A03b1BbB79460169a205eFBCBc77ebE1011bCf8", + "contract": "contracts/0.8.9/test_helpers/DummyEmptyContract.sol", + "constructorArgs": [] + }, + "eip712StETH": { + "contract": "EIP712StETH", + "address": "0xB4300103FfD326f77FfB3CA54248099Fb29C3b9e", + "constructorArgs": ["0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F"] + }, + "ensAddress": "0x043e6DBC5CAd60874727d21ecC2aAeBf50A0de80", + "executionLayerRewardsVault": { + "address": "0x94750381bE1AbA0504C666ee1DB118F68f0780D4", + "deployTx": "0x3bce97664f6003ddf4e3cf7178527dbff6098b1a6fc9ba7c337cb6aca4ea91fb", + "contract": "LidoExecutionLayerRewardsVault" }, - "hashConsensusForAccounting": { - "parameters": { + "hashConsensusForAccountingOracle": { + "deployParameters": { "fastLaneLengthSlots": 10, "epochsPerFrame": 40 }, @@ -188,23 +227,8 @@ "0x76f358A842defa0E179a8970767CFf668Fc134d6" ] }, - "accountingOracle": { - "parameters": { - "consensusVersion": 1 - }, - "contract": "AccountingOracle", - "implementation": "0xC94ad2eb129146235f71cc35f7FbFec7fe404DF9", - "address": "0x76f358A842defa0E179a8970767CFf668Fc134d6", - "constructorArgs": [ - "0x1eDf09b5023DC86737b59dE68a8130De878984f5", - "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", - "0x24d8451BC07e7aF4Ba94F69aCDD9ad3c6579D9FB", - 12, - 1616508000 - ] - }, - "hashConsensusForValidatorsExitBus": { - "parameters": { + "hashConsensusForValidatorsExitBusOracle": { + "deployParameters": { "fastLaneLengthSlots": 10, "epochsPerFrame": 20 }, @@ -220,39 +244,68 @@ "0xb75A55EFab5A8f5224Ae93B34B25741EDd3da98b" ] }, - "validatorsExitBusOracle": { - "parameters": { - "consensusVersion": 1 - }, - "contract": "ValidatorsExitBusOracle", - "implementation": "0xe9754585e100085d20d39298aCA713d43f2ec5aF", - "address": "0xb75A55EFab5A8f5224Ae93B34B25741EDd3da98b", + "lidoApm": { + "deployTx": "0x5177a441fbf121e4064979f53756cc2ee807c68684edae33f50868a40ebae013", + "address": "0x64361389f8Bb7A1ff64e0Ad97FfAa432399D45E7" + }, + "lidoApmEnsName": "lidopm-testnet-prater.eth", + "lidoLocator": { + "contract": "LidoLocator", + "implementation": "0xBA413498500a21bC07E74605CC45932c2d45aCb8", + "address": "0x1eDf09b5023DC86737b59dE68a8130De878984f5", "constructorArgs": [ - 12, - 1616508000, - "0x1eDf09b5023DC86737b59dE68a8130De878984f5" + [ + "0x76f358A842defa0E179a8970767CFf668Fc134d6", + "0xe57025E250275cA56f92d76660DEcfc490C7E79A", + "0x94750381bE1AbA0504C666ee1DB118F68f0780D4", + "0x24d8451BC07e7aF4Ba94F69aCDD9ad3c6579D9FB", + "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", + "0xbf74600040F91D3560d5757280727FB00c64Fd2E", + "0x24d8451BC07e7aF4Ba94F69aCDD9ad3c6579D9FB", + "0xC1Bc16782BE0ce7A81421874A4d3E9B2B32391f2", + "0xa3Dbd317E53D363176359E10948BA0b1c0A4c820", + "0x4333218072D5d7008546737786663c38B4D561A4", + "0xb75A55EFab5A8f5224Ae93B34B25741EDd3da98b", + "0xCF117961421cA9e546cD7f50bC73abCdB3039533", + "0xdc62f9e8C34be08501Cdef4EBDE0a280f576D762", + "0xE9CC5bD91543cdc9788454EE5063E2CD76B5206d" + ] ] }, - "depositSecurityModule": { - "parameters": { - "maxDepositsPerBlock": 0, - "minDepositBlockDistance": 1200, - "pauseIntentValidityPeriodBlocks": 10 - }, - "contract": "DepositSecurityModule", - "address": "0xe57025E250275cA56f92d76660DEcfc490C7E79A", + "lidoTemplate": { + "address": "0x9A4a36B5fe517f98BD6529d4317B0b723F600AaD", + "deployTx": "0xda8746bca23c7a4f7c58e1a3370cb1ffa1e250ace90fd4684dbb1842ee6ac921", "constructorArgs": [ - "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", - "0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b", - "0xa3Dbd317E53D363176359E10948BA0b1c0A4c820", - "0", - "4b0", - "a" + "0x8303B3A462F4Cb4d2468DDcBD4c9f212914A3a7F", + "0x0B6769F500b293e3adacD97c3961189565069902", + "0x043e6DBC5CAd60874727d21ecC2aAeBf50A0de80", + "0x92E2750729e04c9a5CF21A830Bd00cbd5139D992", + "0x673cB86B60B9768Eebb05517fbF5a7F9f1Ab62C4", + "0x70B3284fD016a570146cE48fC54D7A81bCd94BBa" ] }, + "miniMeTokenFactoryAddress": "0x92E2750729e04c9a5CF21A830Bd00cbd5139D992", + "networkId": 5, + "newDaoTx": "0xcc5a0e1b690bac8edb5638f79fcf765f703e218147fbb1d767e502560d4a7c89", + "oracleDaemonConfig": { + "deployParameters": { + "NORMALIZED_CL_REWARD_PER_EPOCH": 64, + "NORMALIZED_CL_REWARD_MISTAKE_RATE_BP": 1000, + "REBASE_CHECK_NEAREST_EPOCH_DISTANCE": 4, + "REBASE_CHECK_DISTANT_EPOCH_DISTANCE": 10, + "VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS": 7200, + "VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS": 21600, + "PREDICTION_DURATION_IN_SLOTS": 50400, + "FINALIZATION_MAX_NEGATIVE_REBASE_EPOCH_SHIFT": 1350, + "NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP": 100 + }, + "contract": "OracleDaemonConfig", + "address": "0xE9CC5bD91543cdc9788454EE5063E2CD76B5206d", + "constructorArgs": ["0xa5F1d7D49F581136Cf6e58B32cBE9a2039C48bA1", []] + }, "oracleReportSanityChecker": { "deployCommit": "85a41c45d5d45b1a35118ad6023e6c7ead1072d2", - "parameters": { + "deployParameters": { "churnValidatorsPerDayLimit": 15000, "oneOffCLBalanceDecreaseBPLimit": 500, "annualBalanceIncreaseBPLimit": 1000, @@ -268,110 +321,71 @@ "constructorArgs": [ "0x1eDf09b5023DC86737b59dE68a8130De878984f5", "0x4333218072D5d7008546737786663c38B4D561A4", - [ - 15000, - 500, - 1000, - 10, - 500, - 500, - 100, - 384, - 750000 - ], - [ - [], - [], - [], - [], - [], - [], - [], - [], - [], - [] - ] + [15000, 500, 1000, 10, 500, 500, 100, 384, 750000], + [[], [], [], [], [], [], [], [], [], []] ] }, + "stakingRouter": { + "contract": "StakingRouter", + "implementation": "0x200c147cd3F344Ad09bAeCadA0a945106df337B4", + "address": "0xa3Dbd317E53D363176359E10948BA0b1c0A4c820", + "constructorArgs": ["0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b"] + }, + "validatorsExitBusOracle": { + "deployParameters": { + "consensusVersion": 1 + }, + "contract": "ValidatorsExitBusOracle", + "implementation": "0xe9754585e100085d20d39298aCA713d43f2ec5aF", + "address": "0xb75A55EFab5A8f5224Ae93B34B25741EDd3da98b", + "constructorArgs": [12, 1616508000, "0x1eDf09b5023DC86737b59dE68a8130De878984f5"] + }, + "vestingParams": { + "unvestedTokensAmount": "230000000000000000000000", + "holders": { + "0xa5F1d7D49F581136Cf6e58B32cBE9a2039C48bA1": "530000000000000000000000", + "0x00444797Ba158A7BdB8302e72da98dCbCCef0Fbc": "15000000000000000000000", + "0x9F188809b2ba2e29653693C4069c212a95C1B8c4": "15000000000000000000000", + "0xeC2d2E81721A477798e938924266f92c4E5Fc54e": "15000000000000000000000", + "0x401FD888B5E41113B7c0C47725A742bbc3A083EF": "15000000000000000000000", + "0x36c648351274bb4455ba6aAabF3F976824a93aF4": "15000000000000000000000", + "0xB6d0A3120c0e13749c211F48fccD9458Dfc99BD0": "15000000000000000000000", + "0x75936b355942D89d9B59798dacD70d70Ded93B78": "15000000000000000000000", + "0x39ceC2b3ba293CC15f15a3876dB8D356a1670789": "15000000000000000000000", + "0xC37F899BB002D93fdcbD9D91d42889AC0e29B704": "15000000000000000000000", + "0xc69f1606e0615F788Cb99982848528f39f188486": "15000000000000000000000", + "0xd355521db7f30F74059dFa7aE0A5C6543dFA8215": "15000000000000000000000", + "0xAA566f0eB53F26db5E15aC5B42685361B4e0d9F4": "15000000000000000000000", + "0xCd3975FC68Aa71eDebfef7442cF8e91ce407DEEE": "15000000000000000000000", + "0xfd0dd5c3b72528e8f581a8544309706d1c2d9206": "15000000000000000000000", + "0x161EE6a03D52ee176a514C88Cf07dcAcF248155f": "15000000000000000000000", + "0x11D7D72876cfC3d7CFC3d1a2C9c35EA4591694a7": "15000000000000000000000" + }, + "start": 1617139000, + "cliff": 1617139500, + "end": 1617139900, + "revokable": false + }, "withdrawalQueueERC721": { "implementationDeployCommit": "85a41c45d5d45b1a35118ad6023e6c7ead1072d2", - "parameters": { + "deployParameters": { "name": "stETH Withdrawal NFT", "symbol": "unstETH" }, "contract": "WithdrawalQueueERC721", "implementation": "0x077B60752864B3e5291863cf8890603f9ab335d3", "address": "0xCF117961421cA9e546cD7f50bC73abCdB3039533", - "constructorArgs": [ - "0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f", - "stETH Withdrawal NFT", - "unstETH" - ] - }, - "oracleDaemonConfig": { - "parameters": { - "NORMALIZED_CL_REWARD_PER_EPOCH": 64, - "NORMALIZED_CL_REWARD_MISTAKE_RATE_BP": 1000, - "REBASE_CHECK_NEAREST_EPOCH_DISTANCE": 4, - "REBASE_CHECK_DISTANT_EPOCH_DISTANCE": 10, - "VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS": 7200, - "VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS": 21600, - "PREDICTION_DURATION_IN_SLOTS": 50400, - "FINALIZATION_MAX_NEGATIVE_REBASE_EPOCH_SHIFT": 1350, - "NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP": 100 - }, - "contract": "OracleDaemonConfig", - "address": "0xE9CC5bD91543cdc9788454EE5063E2CD76B5206d", - "constructorArgs": [ - "0xa5F1d7D49F581136Cf6e58B32cBE9a2039C48bA1", - [] - ] - }, - "lidoLocator": { - "contract": "LidoLocator", - "implementation": "0xBA413498500a21bC07E74605CC45932c2d45aCb8", - "address": "0x1eDf09b5023DC86737b59dE68a8130De878984f5", - "constructorArgs": [ - [ - "0x76f358A842defa0E179a8970767CFf668Fc134d6", - "0xe57025E250275cA56f92d76660DEcfc490C7E79A", - "0x94750381bE1AbA0504C666ee1DB118F68f0780D4", - "0x24d8451BC07e7aF4Ba94F69aCDD9ad3c6579D9FB", - "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", - "0xbf74600040F91D3560d5757280727FB00c64Fd2E", - "0x24d8451BC07e7aF4Ba94F69aCDD9ad3c6579D9FB", - "0xC1Bc16782BE0ce7A81421874A4d3E9B2B32391f2", - "0xa3Dbd317E53D363176359E10948BA0b1c0A4c820", - "0x4333218072D5d7008546737786663c38B4D561A4", - "0xb75A55EFab5A8f5224Ae93B34B25741EDd3da98b", - "0xCF117961421cA9e546cD7f50bC73abCdB3039533", - "0xdc62f9e8C34be08501Cdef4EBDE0a280f576D762", - "0xE9CC5bD91543cdc9788454EE5063E2CD76B5206d" - ] - ] - }, - "eip712StETH": { - "contract": "EIP712StETH", - "address": "0xB4300103FfD326f77FfB3CA54248099Fb29C3b9e", - "constructorArgs": [ - "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F" - ] + "constructorArgs": ["0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f", "stETH Withdrawal NFT", "unstETH"] }, "withdrawalVault": { "address": "0xdc62f9e8C34be08501Cdef4EBDE0a280f576D762", "contract": "WithdrawalVault", "implementation": "0x297Eb629655C8c488Eb26442cF4dfC8A7Cc32fFb", - "constructorArgs": [ - "0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", - "0x4333218072D5d7008546737786663c38B4D561A4" - ] + "constructorArgs": ["0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F", "0x4333218072D5d7008546737786663c38B4D561A4"] }, - "stakingRouter": { - "contract": "StakingRouter", - "implementation": "0x200c147cd3F344Ad09bAeCadA0a945106df337B4", - "address": "0xa3Dbd317E53D363176359E10948BA0b1c0A4c820", - "constructorArgs": [ - "0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b" - ] + "wstETH": { + "address": "0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f", + "constructorArgs": ["0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F"], + "contract": "WstETH" } -} \ No newline at end of file +} diff --git a/configs/deployed-holesky.json b/configs/deployed-holesky.json index 8893afd..c864cb0 100644 --- a/configs/deployed-holesky.json +++ b/configs/deployed-holesky.json @@ -1,92 +1,6 @@ { - "multisigAddress": "0x22896Bfc68814BFD855b1a167255eE497006e730", - "owner": "0x22896Bfc68814BFD855b1a167255eE497006e730", - "gateSeal": { - "factoryAddress": "0x1134F7077055b0B3559BE52AfeF9aA22A0E1eEC2", - "sealDuration": 518400, - "expiryTimestamp": 1714521600, - "sealingCommittee": "0xCD1f9954330AF39a74Fd6e7B25781B4c24ee373f", - "address": "0x7f6FA688d4C12a2d51936680b241f3B0F0F9ca60" - }, - "lidoApmEnsName": "lidopm.eth", - "lidoApmEnsRegDurationSec": 94608000, - "daoAragonId": "lido-dao", - "chainSpec": { - "slotsPerEpoch": 32, - "secondsPerSlot": 12, - "genesisTime": 1695902400, - "depositContract": "0x4242424242424242424242424242424242424242" - }, - "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" - } - }, - "vestingParams": { - "unvestedTokensAmount": "0", - "holders": { - "0xCD1f9954330AF39a74Fd6e7B25781B4c24ee373f": "880000000000000000000000", - "0xaa6bfBCD634EE744CB8FE522b29ADD23124593D3": "60000000000000000000000", - "0xBA59A84C6440E8cccfdb5448877E26F1A431Fc8B": "60000000000000000000000" - }, - "start": 0, - "cliff": 0, - "end": 0, - "revokable": false - }, - "burner": { - "parameters": { - "totalCoverSharesBurnt": "0", - "totalNonCoverSharesBurnt": "0" - }, - "contract": "contracts/0.8.9/Burner.sol", - "address": "0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA", - "constructorArgs": [ - "0x22896Bfc68814BFD855b1a167255eE497006e730", - "0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", - "0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", - "0", - "0" - ] - }, - "legacyOracle": { - "parameters": { - "lastCompletedEpochId": 0 - } - }, - "hashConsensusForAccounting": { - "parameters": { - "fastLaneLengthSlots": 10, - "epochsPerFrame": 12 - }, - "contract": "contracts/0.8.9/oracle/HashConsensus.sol", - "address": "0xa067FC95c22D51c3bC35fd4BE37414Ee8cc890d2", - "constructorArgs": [ - 32, - 12, - 1695902400, - 12, - 10, - "0x22896Bfc68814BFD855b1a167255eE497006e730", - "0x4E97A3972ce8511D87F334dA17a2C332542a5246" - ] - }, "accountingOracle": { - "parameters": { - "maxExitedValidatorsPerDay": 240, - "maxExtraDataListItemsCount": 15, + "deployParameters": { "consensusVersion": 1 }, "proxy": { @@ -108,217 +22,9 @@ 12, 1695902400 ] - }, - "address": "0x4E97A3972ce8511D87F334dA17a2C332542a5246" - }, - "hashConsensusForValidatorsExitBus": { - "parameters": { - "fastLaneLengthSlots": 10, - "epochsPerFrame": 4 - }, - "contract": "contracts/0.8.9/oracle/HashConsensus.sol", - "address": "0xe77Cf1A027d7C10Ee6bb7Ede5E922a181FF40E8f", - "constructorArgs": [ - 32, - 12, - 1695902400, - 4, - 10, - "0x22896Bfc68814BFD855b1a167255eE497006e730", - "0xffDDF7025410412deaa05E3E1cE68FE53208afcb" - ] - }, - "validatorsExitBusOracle": { - "parameters": { - "consensusVersion": 1 - }, - "proxy": { - "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", - "address": "0xffDDF7025410412deaa05E3E1cE68FE53208afcb", - "constructorArgs": [ - "0x210f60EC8A4D020b3e22f15fee2d2364e9b22357", - "0x22896Bfc68814BFD855b1a167255eE497006e730", - "0x" - ] - }, - "implementation": { - "contract": "contracts/0.8.9/oracle/ValidatorsExitBusOracle.sol", - "address": "0x210f60EC8A4D020b3e22f15fee2d2364e9b22357", - "constructorArgs": [ - 12, - 1695902400, - "0x28FAB2059C713A7F9D8c86Db49f9bb0e96Af1ef8" - ] - }, - "address": "0xffDDF7025410412deaa05E3E1cE68FE53208afcb" - }, - "depositSecurityModule": { - "parameters": { - "maxDepositsPerBlock": 150, - "minDepositBlockDistance": 5, - "pauseIntentValidityPeriodBlocks": 6646 - }, - "contract": "contracts/0.8.9/DepositSecurityModule.sol", - "address": "0x045dd46212A178428c088573A7d102B9d89a022A", - "constructorArgs": [ - "0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", - "0x4242424242424242424242424242424242424242", - "0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229", - 150, - 5, - 6646 - ] - }, - "oracleReportSanityChecker": { - "parameters": { - "churnValidatorsPerDayLimit": 1500, - "oneOffCLBalanceDecreaseBPLimit": 500, - "annualBalanceIncreaseBPLimit": 1000, - "simulatedShareRateDeviationBPLimit": 250, - "maxValidatorExitRequestsPerReport": 2000, - "maxAccountingExtraDataListItemsCount": 100, - "maxNodeOperatorsPerExtraDataItemCount": 100, - "requestTimestampMargin": 128, - "maxPositiveTokenRebase": 5000000 - }, - "contract": "contracts/0.8.9/sanity_checks/OracleReportSanityChecker.sol", - "address": "0xF0d576c7d934bBeCc68FE15F1c5DAF98ea2B78bb", - "constructorArgs": [ - "0x28FAB2059C713A7F9D8c86Db49f9bb0e96Af1ef8", - "0x22896Bfc68814BFD855b1a167255eE497006e730", - [ - 1500, - 500, - 1000, - 250, - 2000, - 100, - 100, - 128, - 5000000 - ], - [ - [], - [], - [], - [], - [], - [], - [], - [], - [], - [] - ] - ] - }, - "nodeOperatorsRegistry": { - "parameters": { - "stakingModuleTypeId": "curated-onchain-v1", - "stuckPenaltyDelay": 172800 - } - }, - "withdrawalQueueERC721": { - "parameters": { - "name": "stETH Withdrawal NFT", - "symbol": "unstETH" - }, - "proxy": { - "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", - "address": "0xc7cc160b58F8Bb0baC94b80847E2CF2800565C50", - "constructorArgs": [ - "0xFF72B5cdc701E9eE677966B2702c766c38F412a4", - "0x22896Bfc68814BFD855b1a167255eE497006e730", - "0x" - ] - }, - "implementation": { - "contract": "contracts/0.8.9/WithdrawalQueueERC721.sol", - "address": "0xFF72B5cdc701E9eE677966B2702c766c38F412a4", - "constructorArgs": [ - "0x8d09a4502Cc8Cf1547aD300E066060D043f6982D", - "stETH Withdrawal NFT", - "unstETH" - ] - }, - "address": "0xc7cc160b58F8Bb0baC94b80847E2CF2800565C50" - }, - "networkId": 17000, - "chainId": 17000, - "aragonEnsLabelName": "aragonpm", - "ensAddress": "0x4327d1Fc6E5fa0326CCAE737F67C066c50BcC258", - "ensFactoryAddress": "0xADba3e3122F2Da8F7B07723a3e1F1cEDe3fe8d7d", - "ensFactoryConstructorArgs": [], - "aragon-kernel": { - "implementation": { - "contract": "@aragon/os/contracts/kernel/Kernel.sol", - "address": "0x34c0cbf9836FD945423bD3d2d72880da9d068E5F", - "constructorArgs": [ - true - ] - }, - "proxy": { - "address": "0x3b03f75Ec541Ca11a223bB58621A3146246E1644", - "contract": "@aragon/os/contracts/kernel/KernelProxy.sol", - "constructorArgs": [ - "0x34c0cbf9836FD945423bD3d2d72880da9d068E5F" - ] - } - }, - "aragon-acl": { - "implementation": { - "contract": "@aragon/os/contracts/acl/ACL.sol", - "address": "0xF1A087E055EA1C11ec3B540795Bd1A544e6dcbe9", - "constructorArgs": [] - }, - "proxy": { - "address": "0xfd1E42595CeC3E83239bf8dFc535250e7F48E0bC", - "constructorArgs": [ - "0x3b03f75Ec541Ca11a223bB58621A3146246E1644", - "0xe3262375f45a6e2026b7e7b18c2b807434f2508fe1a2a3dfb493c7df8f4aad6a", - "0x00" - ], - "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" - }, - "aragonApp": { - "name": "aragon-acl", - "id": "0xe3262375f45a6e2026b7e7b18c2b807434f2508fe1a2a3dfb493c7df8f4aad6a" } }, - "kernelBaseAddress": "0x34c0cbf9836FD945423bD3d2d72880da9d068E5F", - "aclBaseAddress": "0xF1A087E055EA1C11ec3B540795Bd1A544e6dcbe9", - "evmScriptRegistryFactoryAddress": "0x11E7591F83360d0Bc238c8AB9e50B6D2B7566aDc", - "evmScriptRegistryFactoryConstructorArgs": [], - "daoFactoryAddress": "0xB33f9AE6C34D8cC59A48fd9973C64488f00fa64F", - "daoFactoryConstructorArgs": [ - "0x34c0cbf9836FD945423bD3d2d72880da9d068E5F", - "0xF1A087E055EA1C11ec3B540795Bd1A544e6dcbe9", - "0x11E7591F83360d0Bc238c8AB9e50B6D2B7566aDc" - ], - "apmRegistryBaseAddress": "0x3EcF7190312F50043DB0494bA0389135Fc3833F3", "apmRepoBaseAddress": "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", - "ensSubdomainRegistrarBaseAddress": "0x7B133ACab5Cec7B90FB13CCf68d6568f8A051EcE", - "apmRegistryFactoryAddress": "0x54eF0022cc769344D0cBCeF12e051281cCBb9fad", - "apmRegistryFactoryConstructorArgs": [ - "0xB33f9AE6C34D8cC59A48fd9973C64488f00fa64F", - "0x3EcF7190312F50043DB0494bA0389135Fc3833F3", - "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", - "0x7B133ACab5Cec7B90FB13CCf68d6568f8A051EcE", - "0x4327d1Fc6E5fa0326CCAE737F67C066c50BcC258", - "0x0000000000000000000000000000000000000000" - ], - "aragonApmRegistryAddress": "0xB576A85c310CC7Af5C106ab26d2942fA3a5ea94A", - "aragonEnsNodeName": "aragonpm.eth", - "aragonEnsNode": "0x9065c3e7f7b7ef1ef4e53d2d0b8e0cef02874ab020c1ece79d5f0d3d0111c0ba", - "miniMeTokenFactoryAddress": "0x15ef666c9620C0f606Ba35De2aF668fe987E26ae", - "miniMeTokenFactoryConstructorArgs": [], - "aragonIDAddress": "0xCA01225e211AB0c6EFCD3aCc64D85465e4D8ab53", - "aragonIDConstructorArgs": [ - "0x4327d1Fc6E5fa0326CCAE737F67C066c50BcC258", - "0x2B725cBA5F75c3B61bb5E37454a7090fb11c757E", - "0x7e74a86b6e146964fb965db04dc2590516da77f720bb6759337bf5632415fd86" - ], - "aragonIDEnsNodeName": "aragonid.eth", - "aragonIDEnsNode": "0x7e74a86b6e146964fb965db04dc2590516da77f720bb6759337bf5632415fd86", "app:aragon-agent": { "implementation": { "contract": "@aragon/apps-agent/contracts/Agent.sol", @@ -403,19 +109,6 @@ ] } }, - "lidoTemplate": { - "contract": "contracts/0.4.24/template/LidoTemplate.sol", - "address": "0x0e065Dd0Bc85Ca53cfDAf8D9ed905e692260De2E", - "constructorArgs": [ - "0x22896Bfc68814BFD855b1a167255eE497006e730", - "0xB33f9AE6C34D8cC59A48fd9973C64488f00fa64F", - "0x4327d1Fc6E5fa0326CCAE737F67C066c50BcC258", - "0x15ef666c9620C0f606Ba35De2aF668fe987E26ae", - "0xCA01225e211AB0c6EFCD3aCc64D85465e4D8ab53", - "0x54eF0022cc769344D0cBCeF12e051281cCBb9fad" - ], - "deployBlock": 30581 - }, "app:lido": { "implementation": { "contract": "contracts/0.4.24/Lido.sol", @@ -437,10 +130,31 @@ ] } }, - "app:oracle": { + "app:node-operators-registry": { "implementation": { - "contract": "contracts/0.4.24/oracle/LegacyOracle.sol", - "address": "0xcE4B3D5bd6259F5dD73253c51b17e5a87bb9Ee64", + "contract": "contracts/0.4.24/nos/NodeOperatorsRegistry.sol", + "address": "0xE0270CF2564d81E02284e16539F59C1B5a4718fE", + "constructorArgs": [] + }, + "aragonApp": { + "name": "node-operators-registry", + "fullName": "node-operators-registry.lidopm.eth", + "id": "0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d" + }, + "proxy": { + "address": "0x595F64Ddc3856a3b5Ff4f4CC1d1fb4B46cFd2bAC", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0x3b03f75Ec541Ca11a223bB58621A3146246E1644", + "0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d", + "0x" + ] + } + }, + "app:oracle": { + "implementation": { + "contract": "contracts/0.4.24/oracle/LegacyOracle.sol", + "address": "0xcE4B3D5bd6259F5dD73253c51b17e5a87bb9Ee64", "constructorArgs": [] }, "aragonApp": { @@ -458,53 +172,214 @@ ] } }, - "app:node-operators-registry": { + "app:sandbox": { + "stakingRouterModuleParams": { + "moduleName": "NOR SandBox", + "moduleType": "curated-onchain-v1", + "targetShare": 100, + "moduleFee": 500, + "treasuryFee": 500, + "penaltyDelay": 86400, + "easyTrackAddress": "0x1763b9ED3586B08AE796c7787811a2E1bc16163a", + "easyTrackFactories": { + "IncreaseNodeOperatorStakingLimit": "0xbD37e55748c6f4Ece637AeD3e278e7575346B587" + } + }, + "aragonApp": { + "name": "sandbox", + "fullName": "sandbox.lidopm.eth", + "id": "0x85d2fceef13a6c14c43527594f79fb91a8ef8f15024a43486efac8df2b11e632", + "ipfsCid": "QmX9AFu9NEmvpKcC6tzJyhEC1krv4JZriWgG9QcMnnezQe", + "contentURI": "0x697066733a516d5839414675394e456d76704b634336747a4a79684543316b7276344a5a72695767473951634d6e6e657a5165" + }, + "proxy": { + "address": "0xD6C2ce3BB8bea2832496Ac8b5144819719f343AC", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [ + "0x3b03f75Ec541Ca11a223bB58621A3146246E1644", + "0x85d2fceef13a6c14c43527594f79fb91a8ef8f15024a43486efac8df2b11e632", + "0x" + ] + }, "implementation": { "contract": "contracts/0.4.24/nos/NodeOperatorsRegistry.sol", "address": "0xE0270CF2564d81E02284e16539F59C1B5a4718fE", "constructorArgs": [] + } + }, + "app:simple-dvt": { + "stakingRouterModuleParams": { + "moduleName": "SimpleDVT", + "moduleType": "curated-onchain-v1", + "targetShare": 50, + "moduleFee": 800, + "treasuryFee": 200, + "penaltyDelay": 86400, + "easyTrackTrustedCaller": "0xD76001b33b23452243E2FDa833B6e7B8E3D43198", + "easyTrackAddress": "0x1763b9ED3586B08AE796c7787811a2E1bc16163a", + "easyTrackFactories": { + "AddNodeOperators": "0xeF5233A5bbF243149E35B353A73FFa8931FDA02b", + "ActivateNodeOperators": "0x5b4A9048176D5bA182ceec8e673D8aA6927A40D6", + "DeactivateNodeOperators": "0x88d247cdf4ff4A4AAA8B3DD9dd22D1b89219FB3B", + "SetVettedValidatorsLimits": "0x30Cb36DBb0596aD9Cf5159BD2c4B1456c18e47E8", + "SetNodeOperatorNames": "0x4792BaC0a262200fA7d3b68e7622bFc1c2c3a72d", + "SetNodeOperatorRewardAddresses": "0x6Bfc576018C7f3D2a9180974E5c8e6CFa021f617", + "UpdateTargetValidatorLimits": "0xC91a676A69Eb49be9ECa1954fE6fc861AE07A9A2", + "ChangeNodeOperatorManager": "0xb8C4728bc0826bA5864D02FA53148de7A44C2f7E" + } }, "aragonApp": { - "name": "node-operators-registry", - "fullName": "node-operators-registry.lidopm.eth", - "id": "0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d" + "name": "simple-dvt", + "fullName": "simple-dvt.lidopm.eth", + "id": "0xe1635b63b5f7b5e545f2a637558a4029dea7905361a2f0fc28c66e9136cf86a4" }, "proxy": { - "address": "0x595F64Ddc3856a3b5Ff4f4CC1d1fb4B46cFd2bAC", + "address": "0x11a93807078f8BB880c1BD0ee4C387537de4b4b6", "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", "constructorArgs": [ "0x3b03f75Ec541Ca11a223bB58621A3146246E1644", - "0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d", + "0xe1635b63b5f7b5e545f2a637558a4029dea7905361a2f0fc28c66e9136cf86a4", "0x" ] + }, + "fullName": "simple-dvt.lidopm.eth", + "name": "simple-dvt", + "id": "0xe1635b63b5f7b5e545f2a637558a4029dea7905361a2f0fc28c66e9136cf86a4", + "ipfsCid": "QmaSSujHCGcnFuetAPGwVW5BegaMBvn5SCsgi3LSfvraSo", + "contentURI": "0x697066733a516d615353756a484347636e4675657441504777565735426567614d42766e355343736769334c5366767261536f", + "implementation": "0xE0270CF2564d81E02284e16539F59C1B5a4718fE", + "contract": "NodeOperatorsRegistry" + }, + "aragon-acl": { + "implementation": { + "contract": "@aragon/os/contracts/acl/ACL.sol", + "address": "0xF1A087E055EA1C11ec3B540795Bd1A544e6dcbe9", + "constructorArgs": [] + }, + "proxy": { + "address": "0xfd1E42595CeC3E83239bf8dFc535250e7F48E0bC", + "constructorArgs": [ + "0x3b03f75Ec541Ca11a223bB58621A3146246E1644", + "0xe3262375f45a6e2026b7e7b18c2b807434f2508fe1a2a3dfb493c7df8f4aad6a", + "0x00" + ], + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + }, + "aragonApp": { + "name": "aragon-acl", + "id": "0xe3262375f45a6e2026b7e7b18c2b807434f2508fe1a2a3dfb493c7df8f4aad6a" } }, - "lidoApmDeployArguments": [ - "0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae", - "0x90a9580abeb24937fc658e497221c81ce8553b560304f9525821f32b17dbdaec" - ], - "lidoApmDeployTx": "0x2fac1c172a250736c34d16d3a721d2916abac0de0dea67d79955346a1f4345a2", - "lidoApmAddress": "0x4605Dc9dC4BD0442F850eB8226B94Dd0e27C3Ce7", - "createAppReposTx": "0xd8a9b10e16b5e75b984c90154a9cb51fbb06bf560a3c424e2e7ad81951008502", - "lidoTemplateNewDaoTx": "0x3346246f09f91ffbc260b6c300b11ababce9f5ca54d7880a277860961f343112", - "newDaoTx": "0x3346246f09f91ffbc260b6c300b11ababce9f5ca54d7880a277860961f343112", - "ldo": { - "address": "0x14ae7daeecdf57034f3E9db8564e46Dba8D97344", - "contract": "@aragon/minime/contracts/MiniMeToken.sol", - "constructorArgs": [ - "0x15ef666c9620C0f606Ba35De2aF668fe987E26ae", - "0x0000000000000000000000000000000000000000", - 30590, - "TEST Lido DAO Token", - 18, - "TLDO", - true - ] + "aragon-apm-registry": { + "implementation": { + "contract": "@aragon/os/contracts/apm/APMRegistry.sol", + "address": "0x3EcF7190312F50043DB0494bA0389135Fc3833F3", + "constructorArgs": [ + "0x3b03f75Ec541Ca11a223bB58621A3146246E1644", + "0x9089af016eb74d66811e1c39c1eef86fdcdb84b5665a4884ebf62339c2613991", + "0x00" + ] + }, + "proxy": { + "address": "0xB576A85c310CC7Af5C106ab26d2942fA3a5ea94A", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + }, + "factory": { + "address": "0x54eF0022cc769344D0cBCeF12e051281cCBb9fad", + "contract": "@aragon/os/contracts/factory/APMRegistryFactory.sol", + "constructorArgs": [ + "0xB33f9AE6C34D8cC59A48fd9973C64488f00fa64F", + "0x3EcF7190312F50043DB0494bA0389135Fc3833F3", + "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", + "0x7B133ACab5Cec7B90FB13CCf68d6568f8A051EcE", + "0x4327d1Fc6E5fa0326CCAE737F67C066c50BcC258", + "0x0000000000000000000000000000000000000000" + ] + } }, - "callsScript": { - "address": "0xAa8B4F258a4817bfb0058b861447878168ddf7B0", - "contract": "@aragon/os/contracts/evmscript/executors/CallsScript.sol", - "constructorArgs": [] + "aragon-app-repo-agent": { + "implementation": { + "contract": "@aragon/os/contracts/apm/Repo.sol", + "address": "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", + "constructorArgs": [] + }, + "proxy": { + "address": "0xe7b4567913AaF2bD54A26E742cec22727D8109eA", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [] + } + }, + "aragon-app-repo-finance": { + "implementation": { + "contract": "@aragon/os/contracts/apm/Repo.sol", + "address": "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", + "constructorArgs": [] + }, + "proxy": { + "address": "0x0df65b7c78Dc42a872010d031D3601C284D8fE71", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [] + } + }, + "aragon-app-repo-lido": { + "implementation": { + "contract": "@aragon/os/contracts/apm/Repo.sol", + "address": "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", + "constructorArgs": [] + }, + "proxy": { + "address": "0xA37fb4C41e7D30af5172618a863BBB0f9042c604", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [] + } + }, + "aragon-app-repo-node-operators-registry": { + "implementation": { + "contract": "@aragon/os/contracts/apm/Repo.sol", + "address": "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", + "constructorArgs": [] + }, + "proxy": { + "address": "0x4E8970d148CB38460bE9b6ddaab20aE2A74879AF", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [] + } + }, + "aragon-app-repo-oracle": { + "implementation": { + "contract": "@aragon/os/contracts/apm/Repo.sol", + "address": "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", + "constructorArgs": [] + }, + "proxy": { + "address": "0xB3d74c319C0C792522705fFD3097f873eEc71764", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [] + } + }, + "aragon-app-repo-token-manager": { + "implementation": { + "contract": "@aragon/os/contracts/apm/Repo.sol", + "address": "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", + "constructorArgs": [] + }, + "proxy": { + "address": "0xD327b4Fb87fa01599DaD491Aa63B333c44C74472", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [] + } + }, + "aragon-app-repo-voting": { + "implementation": { + "contract": "@aragon/os/contracts/apm/Repo.sol", + "address": "0x8959360c48D601a6817BAf2449E5D00cC543FA3A", + "constructorArgs": [] + }, + "proxy": { + "address": "0x2997EA0D07D79038D83Cb04b3BB9A2Bc512E3fDA", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol", + "constructorArgs": [] + } }, "aragon-evm-script-registry": { "proxy": { @@ -512,7 +387,7 @@ "constructorArgs": [ "0x3b03f75Ec541Ca11a223bB58621A3146246E1644", "0xddbcfd564f642ab5627cf68b9b7d374fb4f8a36e941a75d89c87998cef03bd61", - "0x00" + "0x8129fc1c" ], "contract": "@aragon/os/contracts/apps/AppProxyPinned.sol" }, @@ -526,12 +401,98 @@ "constructorArgs": [] } }, - "oracleDaemonConfig": { - "contract": "contracts/0.8.9/OracleDaemonConfig.sol", - "address": "0xC01fC1F2787687Bc656EAc0356ba9Db6e6b7afb7", + "aragon-kernel": { + "implementation": { + "contract": "@aragon/os/contracts/kernel/Kernel.sol", + "address": "0x34c0cbf9836FD945423bD3d2d72880da9d068E5F", + "constructorArgs": [true] + }, + "proxy": { + "address": "0x3b03f75Ec541Ca11a223bB58621A3146246E1644", + "contract": "@aragon/os/contracts/kernel/KernelProxy.sol", + "constructorArgs": ["0x34c0cbf9836FD945423bD3d2d72880da9d068E5F"] + } + }, + "aragonEnsLabelName": "aragonpm", + "aragonEnsNode": "0x9065c3e7f7b7ef1ef4e53d2d0b8e0cef02874ab020c1ece79d5f0d3d0111c0ba", + "aragonEnsNodeName": "aragonpm.eth", + "aragonIDAddress": "0xCA01225e211AB0c6EFCD3aCc64D85465e4D8ab53", + "aragonIDConstructorArgs": [ + "0x4327d1Fc6E5fa0326CCAE737F67C066c50BcC258", + "0x2B725cBA5F75c3B61bb5E37454a7090fb11c757E", + "0x7e74a86b6e146964fb965db04dc2590516da77f720bb6759337bf5632415fd86" + ], + "aragonIDEnsNode": "0x7e74a86b6e146964fb965db04dc2590516da77f720bb6759337bf5632415fd86", + "aragonIDEnsNodeName": "aragonid.eth", + "burner": { + "deployParameters": { + "totalCoverSharesBurnt": "0", + "totalNonCoverSharesBurnt": "0" + }, + "contract": "contracts/0.8.9/Burner.sol", + "address": "0x4E46BD7147ccf666E1d73A3A456fC7a68de82eCA", "constructorArgs": [ "0x22896Bfc68814BFD855b1a167255eE497006e730", - [] + "0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", + "0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", + "0", + "0" + ] + }, + "callsScript": { + "address": "0xAa8B4F258a4817bfb0058b861447878168ddf7B0", + "contract": "@aragon/os/contracts/evmscript/executors/CallsScript.sol", + "constructorArgs": [] + }, + "chainId": 17000, + "chainSpec": { + "slotsPerEpoch": 32, + "secondsPerSlot": 12, + "genesisTime": 1695902400, + "depositContract": "0x4242424242424242424242424242424242424242" + }, + "createAppReposTx": "0xd8a9b10e16b5e75b984c90154a9cb51fbb06bf560a3c424e2e7ad81951008502", + "daoAragonId": "lido-dao", + "daoFactoryAddress": "0xB33f9AE6C34D8cC59A48fd9973C64488f00fa64F", + "daoFactoryConstructorArgs": [ + "0x34c0cbf9836FD945423bD3d2d72880da9d068E5F", + "0xF1A087E055EA1C11ec3B540795Bd1A544e6dcbe9", + "0x11E7591F83360d0Bc238c8AB9e50B6D2B7566aDc" + ], + "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" + } + }, + "deployCommit": "eda16728a7c80f1bb55c3b91c668aae190a1efb0", + "deployer": "0x22896Bfc68814BFD855b1a167255eE497006e730", + "depositSecurityModule": { + "deployParameters": { + "maxDepositsPerBlock": 150, + "minDepositBlockDistance": 5, + "pauseIntentValidityPeriodBlocks": 6646 + }, + "contract": "contracts/0.8.9/DepositSecurityModule.sol", + "address": "0x045dd46212A178428c088573A7d102B9d89a022A", + "constructorArgs": [ + "0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", + "0x4242424242424242424242424242424242424242", + "0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229", + 150, + 5, + 6646 ] }, "dummyEmptyContract": { @@ -539,6 +500,89 @@ "address": "0x5F4FEf09Cbd5ad743632Fb869E80294933473f0B", "constructorArgs": [] }, + "eip712StETH": { + "contract": "contracts/0.8.9/EIP712StETH.sol", + "address": "0xE154732c5Eab277fd88a9fF6Bdff7805eD97BCB1", + "constructorArgs": ["0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034"] + }, + "ensAddress": "0x4327d1Fc6E5fa0326CCAE737F67C066c50BcC258", + "ensFactoryAddress": "0xADba3e3122F2Da8F7B07723a3e1F1cEDe3fe8d7d", + "ensFactoryConstructorArgs": [], + "ensSubdomainRegistrarBaseAddress": "0x7B133ACab5Cec7B90FB13CCf68d6568f8A051EcE", + "evmScriptRegistryFactoryAddress": "0x11E7591F83360d0Bc238c8AB9e50B6D2B7566aDc", + "evmScriptRegistryFactoryConstructorArgs": [], + "executionLayerRewardsVault": { + "contract": "contracts/0.8.9/LidoExecutionLayerRewardsVault.sol", + "address": "0xE73a3602b99f1f913e72F8bdcBC235e206794Ac8", + "constructorArgs": ["0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", "0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d"] + }, + "gateSeal": { + "factoryAddress": "0x1134F7077055b0B3559BE52AfeF9aA22A0E1eEC2", + "sealDuration": 518400, + "expiryTimestamp": 1714521600, + "sealingCommittee": "0xCD1f9954330AF39a74Fd6e7B25781B4c24ee373f", + "address": "0x7f6FA688d4C12a2d51936680b241f3B0F0F9ca60" + }, + "hashConsensusForAccountingOracle": { + "deployParameters": { + "fastLaneLengthSlots": 10, + "epochsPerFrame": 12 + }, + "contract": "contracts/0.8.9/oracle/HashConsensus.sol", + "address": "0xa067FC95c22D51c3bC35fd4BE37414Ee8cc890d2", + "constructorArgs": [ + 32, + 12, + 1695902400, + 12, + 10, + "0x22896Bfc68814BFD855b1a167255eE497006e730", + "0x4E97A3972ce8511D87F334dA17a2C332542a5246" + ] + }, + "hashConsensusForValidatorsExitBusOracle": { + "deployParameters": { + "fastLaneLengthSlots": 10, + "epochsPerFrame": 4 + }, + "contract": "contracts/0.8.9/oracle/HashConsensus.sol", + "address": "0xe77Cf1A027d7C10Ee6bb7Ede5E922a181FF40E8f", + "constructorArgs": [ + 32, + 12, + 1695902400, + 4, + 10, + "0x22896Bfc68814BFD855b1a167255eE497006e730", + "0xffDDF7025410412deaa05E3E1cE68FE53208afcb" + ] + }, + "ldo": { + "address": "0x14ae7daeecdf57034f3E9db8564e46Dba8D97344", + "contract": "@aragon/minime/contracts/MiniMeToken.sol", + "constructorArgs": [ + "0x15ef666c9620C0f606Ba35De2aF668fe987E26ae", + "0x0000000000000000000000000000000000000000", + 0, + "TEST Lido DAO Token", + 18, + "TLDO", + true + ] + }, + "legacyOracle": { + "deployParameters": { + "lastCompletedEpochId": 0 + } + }, + "lidoApmAddress": "0x4605Dc9dC4BD0442F850eB8226B94Dd0e27C3Ce7", + "lidoApmDeployArguments": [ + "0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae", + "0x90a9580abeb24937fc658e497221c81ce8553b560304f9525821f32b17dbdaec" + ], + "lidoApmDeployTx": "0x2fac1c172a250736c34d16d3a721d2916abac0de0dea67d79955346a1f4345a2", + "lidoApmEnsName": "lidopm.eth", + "lidoApmEnsRegDurationSec": 94608000, "lidoLocator": { "proxy": { "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", @@ -570,48 +614,68 @@ "0xC01fC1F2787687Bc656EAc0356ba9Db6e6b7afb7" ] ] - }, - "address": "0x28FAB2059C713A7F9D8c86Db49f9bb0e96Af1ef8" + } }, - "eip712StETH": { - "contract": "contracts/0.8.9/EIP712StETH.sol", - "address": "0xE154732c5Eab277fd88a9fF6Bdff7805eD97BCB1", + "lidoTemplate": { + "contract": "contracts/0.4.24/template/LidoTemplate.sol", + "address": "0x0e065Dd0Bc85Ca53cfDAf8D9ed905e692260De2E", "constructorArgs": [ - "0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034" - ] + "0x22896Bfc68814BFD855b1a167255eE497006e730", + "0xB33f9AE6C34D8cC59A48fd9973C64488f00fa64F", + "0x4327d1Fc6E5fa0326CCAE737F67C066c50BcC258", + "0x15ef666c9620C0f606Ba35De2aF668fe987E26ae", + "0xCA01225e211AB0c6EFCD3aCc64D85465e4D8ab53", + "0x54eF0022cc769344D0cBCeF12e051281cCBb9fad" + ], + "deployBlock": 30581 }, - "wstETH": { - "contract": "contracts/0.6.12/WstETH.sol", - "address": "0x8d09a4502Cc8Cf1547aD300E066060D043f6982D", - "constructorArgs": [ - "0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034" - ] + "lidoTemplateCreateStdAppReposTx": "0x3f5b8918667bd3e971606a54a907798720158587df355a54ce07c0d0f9750d3c", + "lidoTemplateNewDaoTx": "0x3346246f09f91ffbc260b6c300b11ababce9f5ca54d7880a277860961f343112", + "miniMeTokenFactoryAddress": "0x15ef666c9620C0f606Ba35De2aF668fe987E26ae", + "miniMeTokenFactoryConstructorArgs": [], + "networkId": 17000, + "newDaoTx": "0x3346246f09f91ffbc260b6c300b11ababce9f5ca54d7880a277860961f343112", + "nodeOperatorsRegistry": { + "deployParameters": { + "stakingModuleTypeId": "curated-onchain-v1", + "stuckPenaltyDelay": 172800 + } }, - "withdrawalVault": { - "implementation": { - "contract": "contracts/0.8.9/WithdrawalVault.sol", - "address": "0xd517d9d04DA9B47dA23df91261bd3bF435BE964A", - "constructorArgs": [ - "0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", - "0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d" - ] - }, - "proxy": { - "contract": "contracts/0.8.4/WithdrawalsManagerProxy.sol", - "address": "0xF0179dEC45a37423EAD4FaD5fCb136197872EAd9", - "constructorArgs": [ - "0xdA7d2573Df555002503F29aA4003e398d28cc00f", - "0xd517d9d04DA9B47dA23df91261bd3bF435BE964A" - ] - }, - "address": "0xF0179dEC45a37423EAD4FaD5fCb136197872EAd9" + "oracleDaemonConfig": { + "contract": "contracts/0.8.9/OracleDaemonConfig.sol", + "address": "0xC01fC1F2787687Bc656EAc0356ba9Db6e6b7afb7", + "constructorArgs": ["0x22896Bfc68814BFD855b1a167255eE497006e730", []], + "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 + } }, - "executionLayerRewardsVault": { - "contract": "contracts/0.8.9/LidoExecutionLayerRewardsVault.sol", - "address": "0xE73a3602b99f1f913e72F8bdcBC235e206794Ac8", + "oracleReportSanityChecker": { + "deployParameters": { + "churnValidatorsPerDayLimit": 1500, + "oneOffCLBalanceDecreaseBPLimit": 500, + "annualBalanceIncreaseBPLimit": 1000, + "simulatedShareRateDeviationBPLimit": 250, + "maxValidatorExitRequestsPerReport": 2000, + "maxAccountingExtraDataListItemsCount": 100, + "maxNodeOperatorsPerExtraDataItemCount": 100, + "requestTimestampMargin": 128, + "maxPositiveTokenRebase": 5000000 + }, + "contract": "contracts/0.8.9/sanity_checks/OracleReportSanityChecker.sol", + "address": "0xF0d576c7d934bBeCc68FE15F1c5DAF98ea2B78bb", "constructorArgs": [ - "0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", - "0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d" + "0x28FAB2059C713A7F9D8c86Db49f9bb0e96Af1ef8", + "0x22896Bfc68814BFD855b1a167255eE497006e730", + [1500, 500, 1000, 250, 2000, 100, 100, 128, 5000000], + [[], [], [], [], [], [], [], [], [], []] ] }, "stakingRouter": { @@ -627,10 +691,75 @@ "implementation": { "contract": "contracts/0.8.9/StakingRouter.sol", "address": "0x32f236423928c2c138F46351D9E5FD26331B1aa4", + "constructorArgs": ["0x4242424242424242424242424242424242424242"] + } + }, + "validatorsExitBusOracle": { + "deployParameters": { + "consensusVersion": 1 + }, + "proxy": { + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "address": "0xffDDF7025410412deaa05E3E1cE68FE53208afcb", "constructorArgs": [ - "0x4242424242424242424242424242424242424242" + "0x210f60EC8A4D020b3e22f15fee2d2364e9b22357", + "0x22896Bfc68814BFD855b1a167255eE497006e730", + "0x" ] }, - "address": "0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229" + "implementation": { + "contract": "contracts/0.8.9/oracle/ValidatorsExitBusOracle.sol", + "address": "0x210f60EC8A4D020b3e22f15fee2d2364e9b22357", + "constructorArgs": [12, 1695902400, "0x28FAB2059C713A7F9D8c86Db49f9bb0e96Af1ef8"] + } + }, + "vestingParams": { + "unvestedTokensAmount": "0", + "holders": { + "0xCD1f9954330AF39a74Fd6e7B25781B4c24ee373f": "880000000000000000000000", + "0xaa6bfBCD634EE744CB8FE522b29ADD23124593D3": "60000000000000000000000", + "0xBA59A84C6440E8cccfdb5448877E26F1A431Fc8B": "60000000000000000000000" + }, + "start": 0, + "cliff": 0, + "end": 0, + "revokable": false + }, + "withdrawalQueueERC721": { + "deployParameters": { + "name": "stETH Withdrawal NFT", + "symbol": "unstETH" + }, + "proxy": { + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "address": "0xc7cc160b58F8Bb0baC94b80847E2CF2800565C50", + "constructorArgs": [ + "0xFF72B5cdc701E9eE677966B2702c766c38F412a4", + "0x22896Bfc68814BFD855b1a167255eE497006e730", + "0x" + ] + }, + "implementation": { + "contract": "contracts/0.8.9/WithdrawalQueueERC721.sol", + "address": "0xFF72B5cdc701E9eE677966B2702c766c38F412a4", + "constructorArgs": ["0x8d09a4502Cc8Cf1547aD300E066060D043f6982D", "stETH Withdrawal NFT", "unstETH"] + } + }, + "withdrawalVault": { + "implementation": { + "contract": "contracts/0.8.9/WithdrawalVault.sol", + "address": "0xd517d9d04DA9B47dA23df91261bd3bF435BE964A", + "constructorArgs": ["0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", "0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d"] + }, + "proxy": { + "contract": "contracts/0.8.4/WithdrawalsManagerProxy.sol", + "address": "0xF0179dEC45a37423EAD4FaD5fCb136197872EAd9", + "constructorArgs": ["0xdA7d2573Df555002503F29aA4003e398d28cc00f", "0xd517d9d04DA9B47dA23df91261bd3bF435BE964A"] + } + }, + "wstETH": { + "contract": "contracts/0.6.12/WstETH.sol", + "address": "0x8d09a4502Cc8Cf1547aD300E066060D043f6982D", + "constructorArgs": ["0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034"] } -} \ No newline at end of file +} diff --git a/configs/deployed-mainnet.json b/configs/deployed-mainnet.json index 424a747..d1d32ef 100644 --- a/configs/deployed-mainnet.json +++ b/configs/deployed-mainnet.json @@ -1,34 +1,196 @@ { - "deployCommit": "35d8c862406f82c64091760aec8feab0e114aac1", - "deployerEOA": "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - "networkId": 1, - "ipfsAPI": "https://ipfs.infura.io:5001/api/v0", - "lidoApmEnsName": "lidopm.eth", - "lidoApmEnsRegDurationSec": 94608000, - "daoAragonId": "lido-dao", - "ensAddress": "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", - "daoFactoryAddress": "0x7378ad1ba8f3c8e64bbb2a04473edd35846360f1", + "accountingOracle": { + "deployParameters": { + "consensusVersion": 1 + }, + "proxy": { + "address": "0x852deD011285fe67063a08005c71a85690503Cee", + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "deployTx": "0x3def88f27741216b131de2861cf89af2ca2ac4242b384ee33dca8cc70c51c8dd", + "constructorArgs": [ + "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", + "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", + "0x" + ] + }, + "implementation": { + "address": "0xF3c5E0A67f32CF1dc07a8817590efa102079a1aF", + "contract": "contracts/0.8.9/oracle/AccountingOracle.sol", + "deployTx": "0x3e27627d3ed236aff8901df187196e9682187dfd0d259c5d5811a6e923436083", + "constructorArgs": [ + "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb", + "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", + "0x442af784A788A5bd6F42A01Ebe9F287a871243fb", + 12, + 1606824023 + ] + } + }, "apmRegistryFactoryAddress": "0xa0BC4B67F5FacDE4E50EAFF48691Cfc43F4E280A", - "miniMeTokenFactoryAddress": "0x909d05f384d0663ed4be59863815ab43b4f347ec", + "app:aragon-agent": { + "implementation": { + "contract": "@aragon/apps-agent/contracts/Agent.sol", + "address": "0x3A93C17FC82CC33420d1809dDA9Fb715cc89dd37", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-agent", + "fullName": "aragon-agent.lidopm.eth", + "id": "0x701a4fd1f5174d12a0f1d9ad2c88d0ad11ab6aad0ac72b7d9ce621815f8016a9" + }, + "proxy": { + "address": "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, + "app:aragon-finance": { + "implementation": { + "contract": "@aragon/apps-finance/contracts/Finance.sol", + "address": "0x836835289A2E81B66AE5d95b7c8dBC0480dCf9da", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-finance", + "fullName": "aragon-finance.lidopm.eth", + "id": "0x5c9918c99c4081ca9459c178381be71d9da40e49e151687da55099c49a4237f1" + }, + "proxy": { + "address": "0xB9E5CBB9CA5b0d659238807E84D0176930753d86", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, + "app:aragon-token-manager": { + "implementation": { + "contract": "@aragon/apps-lido/apps/token-manager/contracts/TokenManager.sol", + "address": "0xde3A93028F2283cc28756B3674BD657eaFB992f4", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-token-manager", + "fullName": "aragon-token-manager.lidopm.eth", + "id": "0xcd567bdf93dd0f6acc3bc7f2155f83244d56a65abbfbefb763e015420102c67b" + }, + "proxy": { + "address": "0xf73a1260d222f447210581DDf212D915c09a3249", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, + "app:aragon-voting": { + "implementation": { + "contract": "@aragon/apps-lido/apps/voting/contracts/Voting.sol", + "address": "0x72fb5253AD16307B9E773d2A78CaC58E309d5Ba4", + "constructorArgs": [] + }, + "aragonApp": { + "name": "aragon-voting", + "fullName": "aragon-voting.lidopm.eth", + "id": "0x0abcd104777321a82b010357f20887d61247493d89d2e987ff57bcecbde00e1e" + }, + "proxy": { + "address": "0x2e59A20f205bB85a89C53f1936454680651E618e", + "contract": "@aragon/os/contracts/apps/AppProxyUpgradeable.sol" + } + }, + "app:lido": { + "proxy": { + "address": "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84" + }, + "implementation": { + "address": "0x17144556fd3424EDC8Fc8A4C940B2D04936d17eb", + "contract": "contracts/0.4.24/Lido.sol", + "deployTx": "0xb4b5e02643c9802fd0f7c73c4854c4f1b83497aca13f8297ba67207b71c4dcd9", + "constructorArgs": [] + }, + "aragonApp": { + "fullName": "lido.lidopm.eth", + "name": "lido", + "id": "0x3ca7c3e38968823ccb4c78ea688df41356f182ae1d159e4ee608d30d68cef320", + "ipfsCid": "QmQkJMtvu4tyJvWrPXJfjLfyTWn959iayyNjp7YqNzX7pS", + "contentURI": "0x697066733a516d516b4a4d7476753474794a76577250584a666a4c667954576e393539696179794e6a703759714e7a58377053" + } + }, + "app:node-operators-registry": { + "proxy": { + "address": "0x55032650b14df07b85bF18A3a3eC8E0Af2e028d5" + }, + "implementation": { + "address": "0x8538930c385C0438A357d2c25CB3eAD95Ab6D8ed", + "contract": "contracts/0.4.24/nos/NodeOperatorsRegistry.sol", + "deployTx": "0xbec5b6ffb8fbc775a183e25cd285367993d7201752e1638a07abec8962bab750", + "constructorArgs": [], + "deployParameters": { + "stakingModuleTypeId": "curated-onchain-v1", + "stuckPenaltyDelay": "432000" + } + }, + "aragonApp": { + "fullName": "node-operators-registry.lidopm.eth", + "name": "node-operators-registry", + "id": "0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d", + "ipfsCid": "Qma7PXHmEj4js2gjM9vtHPtqvuK82iS5EYPiJmzKLzU58G", + "contentURI": "0x697066733a516d61375058486d456a346a7332676a4d3976744850747176754b3832695335455950694a6d7a4b4c7a55353847" + } + }, + "app:oracle": { + "proxy": { + "address": "0x442af784A788A5bd6F42A01Ebe9F287a871243fb" + }, + "implementation": { + "address": "0xa29b819654cE6224A222bb5f586920105E2D7E0E", + "contract": "contracts/0.4.24/oracle/LegacyOracle.sol", + "deployTx": "0xe666e3ce409bb4c18e1016af0b9ed3495b20361a69f2856bccb9e67599795b6f", + "constructorArgs": [] + }, + "aragonApp": { + "fullName": "oracle.lidopm.eth", + "name": "oracle", + "id": "0x8b47ba2a8454ec799cd91646e7ec47168e91fd139b23f017455f3e5898aaba93", + "ipfsCid": "QmUMPfiEKq5Mxm8y2GYQPLujGaJiWz1tvep5W7EdAGgCR8", + "contentURI": "0x697066733a516d656138394d5533504852503763513157616b3672327355654d554146324c39727132624c6d5963644b764c57" + } + }, + "aragon-kernel": { + "implementation": { + "contract": "@aragon/os/contracts/kernel/Kernel.sol", + "address": "0x2b33CF282f867A7FF693A66e11B0FcC5552e4425", + "constructorArgs": [true] + }, + "proxy": { + "address": "0xb8FFC3Cd6e7Cf5a098A1c92F48009765B24088Dc", + "contract": "@aragon/os/contracts/kernel/KernelProxy.sol" + } + }, "aragonIDAddress": "0x546aa2eae2514494eeadb7bbb35243348983c59d", - "multisigAddress": "0x55Bc991b2edF3DDb4c520B222bE4F378418ff0fA", - "daoTemplateDeployTx": "0xdcd4ebe028aa3663a1fe8bbc92ae8489045e29d2a6ef5284083d9be5c3fa5f19", - "lidoBaseDeployTx": "0xd01afeac8b9231d6d18a874c17ad3995c8702964ade5285977681e69a588f687", - "oracleBaseDeployTx": "0xd16e53c87b643ba68cda34e261dda7a25ebb0b492d835a03f32fa48d5ebe68cd", - "nodeOperatorsRegistryBaseDeployTx": "0x32a2b4ec8b59f2cdde007bbdee23ed1b75491f0ca6acc25d45bf7afbf1c8b4dd", - "depositorDeployTx": "0xce40c18b10854166eb69e64171cbd33ec4ba2f369623f2f438bcf684cfed0523", - "executionLayerRewardsVaultDeployTx": "0xd72cf25e4a5fe3677b6f9b2ae13771e02ad66f8d2419f333bb8bde3147bd4294", + "burner": { + "address": "0xD15a672319Cf0352560eE76d9e89eAB0889046D3", + "contract": "contracts/0.8.9/Burner.sol", + "deployTx": "0xbebf5c85404a0d8e36b859046c984fdf6dd764b5d317feb7eb3525016005b1d9", + "constructorArgs": [ + "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", + "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", + "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", + "0", + "32145684728326685744" + ], + "deployParameters": { + "totalCoverSharesBurnt": "0", + "totalNonCoverSharesBurnt": "32145684728326685744" + } + }, + "chainSpec": { + "depositContractAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa", + "slotsPerEpoch": 32, + "secondsPerSlot": 12, + "genesisTime": 1606824023 + }, + "createAppReposTx": "0xf48cb21c6be021dd18bd8e02ce89ac7b924245b859f0a8b7c47e88a39016ed41", + "daoAragonId": "lido-dao", + "daoFactoryAddress": "0x7378ad1ba8f3c8e64bbb2a04473edd35846360f1", "daoInitialSettings": { "token": { "name": "Lido DAO Token", "symbol": "LDO" }, - "beaconSpec": { - "depositContractAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa", - "slotsPerEpoch": 32, - "secondsPerSlot": 12, - "genesisTime": 1606824023 - }, "voting": { "minSupportRequired": "500000000000000000", "minAcceptanceQuorum": "50000000000000000", @@ -41,6 +203,217 @@ "nodeOperatorsPercent": 50 } }, + "daoTokenAddress": "0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32", + "deployCommit": "e45c4d6fb8120fd29426b8d969c19d8a798ca974", + "deployer": "0x55Bc991b2edF3DDb4c520B222bE4F378418ff0fA", + "depositSecurityModule": { + "address": "0xC77F8768774E1c9244BEed705C4354f2113CFc09", + "contract": "contracts/0.8.9/DepositSecurityModule.sol", + "deployTx": "0x21307a2321f167f99de11ccec86d7bdd8233481bbffa493e15c519ca8d662c4f", + "constructorArgs": [ + "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", + "0x00000000219ab540356cBB839Cbe05303d7705Fa", + "0xFdDf38947aFB03C621C71b06C9C70bce73f12999", + 150, + 25, + 6646 + ], + "deployParameters": { + "maxDepositsPerBlock": 150, + "minDepositBlockDistance": 25, + "pauseIntentValidityPeriodBlocks": 6646 + } + }, + "dummyEmptyContract": { + "address": "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", + "contract": "contracts/0.8.9/test_helpers/DummyEmptyContract.sol", + "deployTx": "0x9d76786f639bd18365f10c087444761db5dafd0edc85c5c1a3e90219f2d1331d", + "constructorArgs": [] + }, + "eip712StETH": { + "address": "0x8F73e4C2A6D852bb4ab2A45E6a9CF5715b3228B7", + "contract": "contracts/0.8.9/EIP712StETH.sol", + "deployTx": "0xecb5010620fb13b0e2bbc98b8a0c82de0d7385491452cd36cf303cd74216ed91", + "constructorArgs": ["0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84"] + }, + "ensAddress": "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + "executionLayerRewardsVault": { + "address": "0x388C818CA8B9251b393131C08a736A67ccB19297", + "contract": "contracts/0.8.9/LidoExecutionLayerRewardsVault.sol", + "deployTx": "0xd72cf25e4a5fe3677b6f9b2ae13771e02ad66f8d2419f333bb8bde3147bd4294" + }, + "hashConsensusForAccountingOracle": { + "address": "0xD624B08C83bAECF0807Dd2c6880C3154a5F0B288", + "contract": "contracts/0.8.9/oracle/HashConsensus.sol", + "deployTx": "0xd74dcca9bacede9f332d70562f49808254061853937ffbbfc7397ab5d017041a", + "constructorArgs": [ + 32, + 12, + 1606824023, + 225, + 100, + "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", + "0x852deD011285fe67063a08005c71a85690503Cee" + ], + "deployParameters": { + "fastLaneLengthSlots": 100, + "epochsPerFrame": 225 + } + }, + "hashConsensusForValidatorsExitBusOracle": { + "address": "0x7FaDB6358950c5fAA66Cb5EB8eE5147De3df355a", + "contract": "contracts/0.8.9/oracle/HashConsensus.sol", + "deployTx": "0xed1ab73dd5458b5ec0b174508318d2f39a31029112af21f87d09106933bd3a9e", + "constructorArgs": [ + 32, + 12, + 1606824023, + 75, + 100, + "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", + "0x0De4Ea0184c2ad0BacA7183356Aea5B8d5Bf5c6e" + ], + "deployParameters": { + "fastLaneLengthSlots": 100, + "epochsPerFrame": 75 + } + }, + "ipfsAPI": "https://ipfs.infura.io:5001/api/v0", + "lidoApm": { + "deployTx": "0xfa66476569ecef5790f2d0634997b952862bbca56aa088f151b8049421eeb87b", + "address": "0x0cb113890b04B49455DfE06554e2D784598A29C9" + }, + "lidoApmEnsName": "lidopm.eth", + "lidoApmEnsRegDurationSec": 94608000, + "lidoLocator": { + "proxy": { + "address": "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb", + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "deployTx": "0x3a2910624533935cc8c21837b1705bcb159a760796930097016186be705cc455", + "constructorArgs": [ + "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", + "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", + "0x" + ] + }, + "implementation": { + "address": "0x1D920cc5bACf7eE506a271a5259f2417CaDeCE1d", + "contract": "contracts/0.8.9/LidoLocator.sol", + "deployTx": "0xf90012ef0a40e47c909ab3a5b3503ecee78f6a9be134d1349a742e500d37ae33", + "constructorArgs": [ + [ + "0x852deD011285fe67063a08005c71a85690503Cee", + "0xC77F8768774E1c9244BEed705C4354f2113CFc09", + "0x388C818CA8B9251b393131C08a736A67ccB19297", + "0x442af784A788A5bd6F42A01Ebe9F287a871243fb", + "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", + "0x9305c1Dbfe22c12c66339184C0025d7006f0f1cC", + "0x442af784A788A5bd6F42A01Ebe9F287a871243fb", + "0xD15a672319Cf0352560eE76d9e89eAB0889046D3", + "0xFdDf38947aFB03C621C71b06C9C70bce73f12999", + "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", + "0x0De4Ea0184c2ad0BacA7183356Aea5B8d5Bf5c6e", + "0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1", + "0xB9D7934878B5FB9610B3fE8A5e441e8fad7E293f", + "0xbf05A929c3D7885a6aeAd833a992dA6E5ac23b09" + ] + ] + } + }, + "lidoTemplate": { + "contract": "contracts/0.4.24/template/LidoTemplate.sol", + "address": "0x752350797CB92Ad3BF1295Faf904B27585e66BF5", + "deployTx": "0xdcd4ebe028aa3663a1fe8bbc92ae8489045e29d2a6ef5284083d9be5c3fa5f19", + "constructorArgs": [ + "0x55Bc991b2edF3DDb4c520B222bE4F378418ff0fA", + "0x7378ad1ba8f3c8e64bbb2a04473edd35846360f1", + "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + "0x909d05f384d0663ed4be59863815ab43b4f347ec", + "0x546aa2eae2514494eeadb7bbb35243348983c59d", + "0xa0BC4B67F5FacDE4E50EAFF48691Cfc43F4E280A" + ] + }, + "miniMeTokenFactoryAddress": "0x909d05f384d0663ed4be59863815ab43b4f347ec", + "networkId": 1, + "newDaoTx": "0x3feabd79e8549ad68d1827c074fa7123815c80206498946293d5373a160fd866", + "oracleDaemonConfig": { + "address": "0xbf05A929c3D7885a6aeAd833a992dA6E5ac23b09", + "contract": "contracts/0.8.9/OracleDaemonConfig.sol", + "deployTx": "0xa4f380b8806f5a504ef67fce62989e09be5a48bf114af63483c01c22f0c9a36f", + "constructorArgs": ["0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", []], + "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, + "PREDICTION_DURATION_IN_SLOTS": 50400, + "FINALIZATION_MAX_NEGATIVE_REBASE_EPOCH_SHIFT": 1350, + "NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP": 100 + } + }, + "oracleReportSanityChecker": { + "address": "0x9305c1Dbfe22c12c66339184C0025d7006f0f1cC", + "contract": "contracts/0.8.9/sanity_checks/OracleReportSanityChecker.sol", + "deployTx": "0x700c83996ad7deefda286044280ad86108dfef9c880909bd8e75a3746f7d631c", + "constructorArgs": [ + "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb", + "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", + [20000, 500, 1000, 50, 600, 2, 100, 7680, 750000], + [[], [], [], [], [], [], [], [], [], []] + ], + "deployParameters": { + "churnValidatorsPerDayLimit": 20000, + "oneOffCLBalanceDecreaseBPLimit": 500, + "annualBalanceIncreaseBPLimit": 1000, + "simulatedShareRateDeviationBPLimit": 50, + "maxValidatorExitRequestsPerReport": 600, + "maxAccountingExtraDataListItemsCount": 2, + "maxNodeOperatorsPerExtraDataItemCount": 100, + "requestTimestampMargin": 7680, + "maxPositiveTokenRebase": 750000 + } + }, + "stakingRouter": { + "proxy": { + "address": "0xFdDf38947aFB03C621C71b06C9C70bce73f12999", + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "deployTx": "0xb8620f04a8db6bb52cfd0978c6677a5f16011e03d4622e5d660ea6ba34c2b122", + "constructorArgs": [ + "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", + "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", + "0x" + ] + }, + "implementation": { + "address": "0xD8784e748f59Ba711fB5643191Ec3fAdD50Fb6df", + "contract": "contracts/0.8.9/StakingRouter.sol", + "deployTx": "0xd6d489f22203c835da6027ff0e532a01a08f36f0fda6c7c0a42e471ae3b3c461", + "constructorArgs": ["0x00000000219ab540356cBB839Cbe05303d7705Fa"] + } + }, + "validatorsExitBusOracle": { + "proxy": { + "address": "0x0De4Ea0184c2ad0BacA7183356Aea5B8d5Bf5c6e", + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "deployTx": "0xef3eea1523d2161c2f36ba61e327e3520231614c055b8a88c7f5928d18e423ea", + "constructorArgs": [ + "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", + "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", + "0x" + ] + }, + "implementation": { + "address": "0xA89Ea51FddE660f67d1850e03C9c9862d33Bc42c", + "contract": "contracts/0.8.9/oracle/ValidatorsExitBusOracle.sol", + "deployTx": "0x5ab545276f78a72a432c3e971c96384973abfab6394e08cb077a006c25aef7a7", + "constructorArgs": [12, 1606824023, "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb"], + "deployParameters": { + "consensusVersion": 1 + } + } + }, "vestingParams": { "unvestedTokensAmount": "363197500000000000000000000", "holders": { @@ -110,391 +483,43 @@ "end": 1671321600, "revokable": false }, - "daoTemplateConstructorArgs": [ - "0x55Bc991b2edF3DDb4c520B222bE4F378418ff0fA", - "0x7378ad1ba8f3c8e64bbb2a04473edd35846360f1", - "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", - "0x909d05f384d0663ed4be59863815ab43b4f347ec", - "0x546aa2eae2514494eeadb7bbb35243348983c59d", - "0xa0BC4B67F5FacDE4E50EAFF48691Cfc43F4E280A" - ], - "daoTemplateAddress": "0x752350797CB92Ad3BF1295Faf904B27585e66BF5", - "app:lido": { - "baseAddress": "0x47EbaB13B806773ec2A2d16873e2dF770D130b50", - "fullName": "lido.lidopm.eth", - "name": "lido", - "id": "0x3ca7c3e38968823ccb4c78ea688df41356f182ae1d159e4ee608d30d68cef320", - "ipfsCid": "QmQkJMtvu4tyJvWrPXJfjLfyTWn959iayyNjp7YqNzX7pS", - "contentURI": "0x697066733a516d516b4a4d7476753474794a76577250584a666a4c667954576e393539696179794e6a703759714e7a58377053", - "proxyAddress": "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - "contract": "Lido", - "implementation": "0x17144556fd3424EDC8Fc8A4C940B2D04936d17eb", - "constructorArgs": [] - }, - "app:oracle": { - "baseAddress": "0x1430194905301504e8830ce4B0b0df7187E84AbD", - "fullName": "oracle.lidopm.eth", - "name": "oracle", - "id": "0x8b47ba2a8454ec799cd91646e7ec47168e91fd139b23f017455f3e5898aaba93", - "ipfsCid": "QmUMPfiEKq5Mxm8y2GYQPLujGaJiWz1tvep5W7EdAGgCR8", - "contentURI": "0x697066733a516d656138394d5533504852503763513157616b3672327355654d554146324c39727132624c6d5963644b764c57", - "proxyAddress": "0x442af784A788A5bd6F42A01Ebe9F287a871243fb", - "contract": "LegacyOracle", - "implementation": "0xa29b819654cE6224A222bb5f586920105E2D7E0E", - "constructorArgs": [] - }, - "app:node-operators-registry": { - "baseAddress": "0x5d39ABaa161e622B99D45616afC8B837E9F19a25", - "fullName": "node-operators-registry.lidopm.eth", - "name": "node-operators-registry", - "id": "0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d", - "ipfsCid": "Qma7PXHmEj4js2gjM9vtHPtqvuK82iS5EYPiJmzKLzU58G", - "contentURI": "0x697066733a516d61375058486d456a346a7332676a4d3976744850747176754b3832695335455950694a6d7a4b4c7a55353847", - "proxyAddress": "0x55032650b14df07b85bF18A3a3eC8E0Af2e028d5", - "contract": "NodeOperatorsRegistry", - "implementation": "0x8538930c385C0438A357d2c25CB3eAD95Ab6D8ed", - "constructorArgs": [] - }, - "nodeOperatorsRegistry": { - "parameters": { - "stakingModuleTypeId": "curated-onchain-v1", - "stuckPenaltyDelay": "432000" - } - }, - "lidoApmDeployTx": "0xfa66476569ecef5790f2d0634997b952862bbca56aa088f151b8049421eeb87b", - "lidoApmAddress": "0x0cb113890b04B49455DfE06554e2D784598A29C9", - "depositContract": { - "address": "0x00000000219ab540356cBB839Cbe05303d7705Fa" - }, - "createAppReposTx": "0xf48cb21c6be021dd18bd8e02ce89ac7b924245b859f0a8b7c47e88a39016ed41", - "newDaoTx": "0x3feabd79e8549ad68d1827c074fa7123815c80206498946293d5373a160fd866", - "daoAddress": "0xb8FFC3Cd6e7Cf5a098A1c92F48009765B24088Dc", - "daoTokenAddress": "0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32", - "app:aragon-agent": { - "name": "aragon-agent", - "fullName": "aragon-agent.lidopm.eth", - "id": "0x701a4fd1f5174d12a0f1d9ad2c88d0ad11ab6aad0ac72b7d9ce621815f8016a9", - "proxyAddress": "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c" - }, - "app:aragon-finance": { - "name": "aragon-finance", - "fullName": "aragon-finance.lidopm.eth", - "id": "0x5c9918c99c4081ca9459c178381be71d9da40e49e151687da55099c49a4237f1", - "proxyAddress": "0xB9E5CBB9CA5b0d659238807E84D0176930753d86" - }, - "app:aragon-token-manager": { - "name": "aragon-token-manager", - "fullName": "aragon-token-manager.lidopm.eth", - "id": "0xcd567bdf93dd0f6acc3bc7f2155f83244d56a65abbfbefb763e015420102c67b", - "proxyAddress": "0xf73a1260d222f447210581DDf212D915c09a3249" - }, - "app:aragon-voting": { - "name": "aragon-voting", - "fullName": "aragon-voting.lidopm.eth", - "id": "0x0abcd104777321a82b010357f20887d61247493d89d2e987ff57bcecbde00e1e", - "proxyAddress": "0x2e59A20f205bB85a89C53f1936454680651E618e" - }, - "wstethContractAddress": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", - "wstethContractDeployTx": "0xaf2c1a501d2b290ef1e84ddcfc7beb3406f8ece2c46dee14e212e8233654ff05", - "wstethContractConstructorArgs": [ - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84" - ], - "depositorParams": { - "maxDepositsPerBlock": 150, - "minDepositBlockDistance": 25, - "pauseIntentValidityPeriodBlocks": 6646, - "guardians": [ - "0x5fd0dDbC3351d009eb3f88DE7Cd081a614C519F1", - "0x7912Fa976BcDe9c2cf728e213e892AD7588E6AaF", - "0x14D5d5B71E048d2D75a39FfC5B407e3a3AB6F314", - "0xf82D88217C249297C6037BA77CE34b3d8a90ab43", - "0xa56b128Ea2Ea237052b0fA2a96a387C0E43157d8", - "0xd4EF84b638B334699bcf5AF4B0410B8CCD71943f" - ], - "quorum": 4 - }, - "depositorConstructorArgs": [ - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - "0x00000000219ab540356cBB839Cbe05303d7705Fa", - "0x55032650b14df07b85bF18A3a3eC8E0Af2e028d5", - 1, - 150, - 25, - 6646 - ], - "depositorAddress": "0x710B3303fB508a84F10793c1106e32bE873C24cd", - "selfOwnedStETHBurnerParams": { - "totalCoverSharesBurnt": "0", - "totalNonCoverSharesBurnt": "32145684728326685744", - "maxBurnAmountPerRunBasisPoints": "4" - }, - "executionLayerRewardsVaultAddress": "0x388C818CA8B9251b393131C08a736A67ccB19297", - "depositorPreviousAddress": "0xDb149235B6F40dC08810AA69869783Be101790e7", - "compositePostRebaseBeaconReceiverConstructorArgs": [ - "0x2e59A20f205bB85a89C53f1936454680651E618e", - "0x442af784A788A5bd6F42A01Ebe9F287a871243fb" - ], - "compositePostRebaseBeaconReceiverDeployTx": "0x6d2ac569028ece24a11eca77a4d0ca5283f4206cc83865cffd88465c490e0ae1", - "compositePostRebaseBeaconReceiverAddress": "0x55a7E1cbD678d9EbD50c7d69Dc75203B0dBdD431", - "selfOwnedStETHBurnerConstructorArgs": [ - "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - "0x2e59A20f205bB85a89C53f1936454680651E618e", - "0", - "32145684728326685744", - "4" - ], - "selfOwnedStETHBurnerDeployTx": "0xc74b79ce67fd3dd5c0f530e60c1f34d76208694df7d9d193478923dd193a1746", - "selfOwnedStETHBurnerAddress": "0xB280E33812c0B09353180e92e27b8AD399B07f26", - "burner": { - "parameters": { - "totalCoverSharesBurnt": "0", - "totalNonCoverSharesBurnt": "32145684728326685744" - }, - "contract": "Burner", - "address": "0xD15a672319Cf0352560eE76d9e89eAB0889046D3", - "constructorArgs": [ - "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - "0", - "32145684728326685744" - ] - }, - "legacyOracle": { - "parameters": { - "lastCompletedEpochId": 0 - } - }, - "hashConsensusForAccounting": { - "parameters": { - "fastLaneLengthSlots": 100, - "epochsPerFrame": 225 - }, - "contract": "HashConsensus", - "address": "0xD624B08C83bAECF0807Dd2c6880C3154a5F0B288", - "constructorArgs": [ - 32, - 12, - 1606824023, - 225, - 100, - "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - "0x852deD011285fe67063a08005c71a85690503Cee" - ] - }, - "accountingOracle": { - "parameters": { - "consensusVersion": 1 - }, - "contract": "AccountingOracle", - "implementation": "0xF3c5E0A67f32CF1dc07a8817590efa102079a1aF", - "address": "0x852deD011285fe67063a08005c71a85690503Cee", - "constructorArgs": [ - "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb", - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - "0x442af784A788A5bd6F42A01Ebe9F287a871243fb", - 12, - 1606824023 - ], - "proxyConstructorArgs": [ - "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", - "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - "0x" - ] - }, - "hashConsensusForValidatorsExitBus": { - "parameters": { - "fastLaneLengthSlots": 100, - "epochsPerFrame": 75 - }, - "contract": "HashConsensus", - "address": "0x7FaDB6358950c5fAA66Cb5EB8eE5147De3df355a", - "constructorArgs": [ - 32, - 12, - 1606824023, - 75, - 100, - "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - "0x0De4Ea0184c2ad0BacA7183356Aea5B8d5Bf5c6e" - ] - }, - "validatorsExitBusOracle": { - "parameters": { - "consensusVersion": 1 - }, - "contract": "ValidatorsExitBusOracle", - "implementation": "0xA89Ea51FddE660f67d1850e03C9c9862d33Bc42c", - "address": "0x0De4Ea0184c2ad0BacA7183356Aea5B8d5Bf5c6e", - "constructorArgs": [ - 12, - 1606824023, - "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb" - ], - "proxyConstructorArgs": [ - "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", - "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - "0x" - ] - }, - "depositSecurityModule": { - "parameters": { - "maxDepositsPerBlock": 150, - "minDepositBlockDistance": 25, - "pauseIntentValidityPeriodBlocks": 6646 - }, - "contract": "DepositSecurityModule", - "address": "0xC77F8768774E1c9244BEed705C4354f2113CFc09", - "constructorArgs": [ - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - "0x00000000219ab540356cBB839Cbe05303d7705Fa", - "0xFdDf38947aFB03C621C71b06C9C70bce73f12999", - 150, - 25, - 6646 - ] - }, - "oracleReportSanityChecker": { - "parameters": { - "churnValidatorsPerDayLimit": 20000, - "oneOffCLBalanceDecreaseBPLimit": 500, - "annualBalanceIncreaseBPLimit": 1000, - "simulatedShareRateDeviationBPLimit": 50, - "maxValidatorExitRequestsPerReport": 600, - "maxAccountingExtraDataListItemsCount": 2, - "maxNodeOperatorsPerExtraDataItemCount": 100, - "requestTimestampMargin": 7680, - "maxPositiveTokenRebase": 750000 - }, - "contract": "OracleReportSanityChecker", - "address": "0x9305c1Dbfe22c12c66339184C0025d7006f0f1cC", - "constructorArgs": [ - "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb", - "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", - [ - 20000, - 500, - 1000, - 50, - 600, - 2, - 100, - 7680, - 750000 - ], - [ - [], - [], - [], - [], - [], - [], - [], - [], - [], - [] - ] - ] - }, - "oracleDaemonConfig": { - "parameters": { - "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, - "PREDICTION_DURATION_IN_SLOTS": 50400, - "FINALIZATION_MAX_NEGATIVE_REBASE_EPOCH_SHIFT": 1350, - "NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP": 100 - }, - "contract": "OracleDaemonConfig", - "address": "0xbf05A929c3D7885a6aeAd833a992dA6E5ac23b09", - "constructorArgs": [ - "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - [] - ] - }, "withdrawalQueueERC721": { - "parameters": { - "name": "Lido: stETH Withdrawal NFT", - "symbol": "unstETH" + "proxy": { + "address": "0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1", + "contract": "contracts/0.8.9/proxy/OssifiableProxy.sol", + "deployTx": "0x98c2170be034f750f5006cb69ea0aeeaf0858b11f6324ee53d582fa4dd49bc1a", + "constructorArgs": [ + "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", + "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", + "0x" + ] }, - "contract": "WithdrawalQueueERC721", - "implementation": "0xE42C659Dc09109566720EA8b2De186c2Be7D94D9", - "address": "0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1", - "constructorArgs": [ - "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", - "Lido: stETH Withdrawal NFT", - "unstETH" - ], - "proxyConstructorArgs": [ - "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", - "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - "0x" - ] + "implementation": { + "address": "0xE42C659Dc09109566720EA8b2De186c2Be7D94D9", + "contract": "contracts/0.8.9/WithdrawalQueueERC721.sol", + "deployTx": "0x6ab0151735c01acdef518421358d41a08752169bc383c57d57f5bfa135ac6eb1", + "constructorArgs": ["0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", "Lido: stETH Withdrawal NFT", "unstETH"], + "deployParameters": { + "name": "Lido: stETH Withdrawal NFT", + "symbol": "unstETH" + } + } }, "withdrawalVault": { - "address": "0xB9D7934878B5FB9610B3fE8A5e441e8fad7E293f", - "contract": "WithdrawalVault", - "implementation": "0xCC52f17756C04bBa7E377716d7062fC36D7f69Fd", - "constructorArgs": [ - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c" - ] - }, - "dummyEmptyContract": { - "contract": "DummyEmptyContract", - "address": "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", - "constructorArgs": [] - }, - "eip712StETH": { - "contract": "EIP712StETH", - "address": "0x8F73e4C2A6D852bb4ab2A45E6a9CF5715b3228B7", - "constructorArgs": [ - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84" - ] - }, - "stakingRouter": { - "contract": "StakingRouter", - "implementation": "0xD8784e748f59Ba711fB5643191Ec3fAdD50Fb6df", - "address": "0xFdDf38947aFB03C621C71b06C9C70bce73f12999", - "constructorArgs": [ - "0x00000000219ab540356cBB839Cbe05303d7705Fa" - ], - "proxyConstructorArgs": [ - "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", - "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - "0x" - ] + "proxy": { + "address": "0xB9D7934878B5FB9610B3fE8A5e441e8fad7E293f" + }, + "implementation": { + "address": "0xCC52f17756C04bBa7E377716d7062fC36D7f69Fd", + "contract": "contracts/0.8.9/WithdrawalVault.sol", + "deployTx": "0xd9eb2eca684770e4d2b192709b6071875f75072a0ce794a582824ee907a704f3", + "constructorArgs": ["0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c"] + } }, - "lidoLocator": { - "contract": "LidoLocator", - "implementation": "0x1D920cc5bACf7eE506a271a5259f2417CaDeCE1d", - "address": "0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb", - "constructorArgs": [ - [ - "0x852deD011285fe67063a08005c71a85690503Cee", - "0xC77F8768774E1c9244BEed705C4354f2113CFc09", - "0x388C818CA8B9251b393131C08a736A67ccB19297", - "0x442af784A788A5bd6F42A01Ebe9F287a871243fb", - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - "0x9305c1Dbfe22c12c66339184C0025d7006f0f1cC", - "0x442af784A788A5bd6F42A01Ebe9F287a871243fb", - "0xD15a672319Cf0352560eE76d9e89eAB0889046D3", - "0xFdDf38947aFB03C621C71b06C9C70bce73f12999", - "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", - "0x0De4Ea0184c2ad0BacA7183356Aea5B8d5Bf5c6e", - "0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1", - "0xB9D7934878B5FB9610B3fE8A5e441e8fad7E293f", - "0xbf05A929c3D7885a6aeAd833a992dA6E5ac23b09" - ] - ], - "proxyConstructorArgs": [ - "0x6F6541C2203196fEeDd14CD2C09550dA1CbEDa31", - "0x8Ea83AD72396f1E0cD2f8E72b1461db8Eb6aF7B5", - "0x" - ] + "wstETH": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "contract": "contracts/0.6.12/WstETH.sol", + "deployTx": "0xaf2c1a501d2b290ef1e84ddcfc7beb3406f8ece2c46dee14e212e8233654ff05", + "constructorArgs": ["0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84"] } -} \ No newline at end of file +} diff --git a/configs/deployed.ts b/configs/deployed.ts index 74a3aeb..0c8353e 100644 --- a/configs/deployed.ts +++ b/configs/deployed.ts @@ -2,6 +2,7 @@ import { lstatSync } from 'fs'; import { resolve } from 'path'; import { envs } from './envs'; import { getValueByPath } from '@utils'; +import { ZeroAddress } from 'ethers'; export const getContracts = () => { const fullPath = resolve('configs', envs?.DEPLOYED ?? ''); @@ -41,6 +42,14 @@ export const getDeployedAddress = (...contractKeys: string[]) => { throw new Error(`Contracts by ${contractKeys} not found`); }; +export const getOptionalDeployedAddress = (...contractKeys: string[]) => { + try { + return getDeployedAddress(...contractKeys); + } catch { + return ZeroAddress; + } +}; + export const getAddressMap = () => { const contracts = getContracts(); diff --git a/contracts/deposit-contract.ts b/contracts/deposit-contract.ts index 0af0521..179e482 100644 --- a/contracts/deposit-contract.ts +++ b/contracts/deposit-contract.ts @@ -3,5 +3,5 @@ import { wallet } from '@providers'; import { getDeployedAddress } from '@configs'; import abi from 'abi/DepositContract.json'; -export const depositAddress = getDeployedAddress('depositContract', 'chainSpec.depositContract'); +export const depositAddress = getDeployedAddress('chainSpec.depositContract', 'chainSpec.depositContractAddress'); export const depositContract = new Contract(depositAddress, abi, wallet); diff --git a/contracts/index.ts b/contracts/index.ts index 58468d8..34cc207 100644 --- a/contracts/index.ts +++ b/contracts/index.ts @@ -12,7 +12,9 @@ export * from './oracles'; export * from './proxy'; export * from './public-resolver'; export * from './repo'; +export * from './sandbox'; export * from './sanity-checker'; +export * from './simple-dvt'; export * from './staking-module'; export * from './staking-router'; export * from './token-manager'; diff --git a/contracts/locator.ts b/contracts/locator.ts index 6dea344..2042f68 100644 --- a/contracts/locator.ts +++ b/contracts/locator.ts @@ -3,7 +3,7 @@ import { wallet } from '@providers'; import { getDeployedAddress } from '@configs'; import abi from 'abi/LidoLocator.json'; -export const locatorAddress = getDeployedAddress('lidoLocator'); +export const locatorAddress = getDeployedAddress('lidoLocator.proxy', 'lidoLocator'); export const locatorContract = new Contract(locatorAddress, abi, wallet); export const getLocatorContract = (address: string) => new Contract(address, abi, wallet); diff --git a/contracts/oracles.ts b/contracts/oracles.ts index f5c6494..e0ced3c 100644 --- a/contracts/oracles.ts +++ b/contracts/oracles.ts @@ -6,16 +6,22 @@ import accountingAbi from 'abi/AccountingOracle.json'; import exitBusAbi from 'abi/ValidatorsExitBusOracle.json'; import configAbi from 'abi/OracleDaemonConfig.json'; -export const accountingOracleAddress = getDeployedAddress('accountingOracle'); +export const accountingOracleAddress = getDeployedAddress('accountingOracle.proxy', 'accountingOracle'); export const accountingOracleContract = new Contract(accountingOracleAddress, accountingAbi, wallet); -export const exitBusOracleAddress = getDeployedAddress('validatorsExitBusOracle'); +export const exitBusOracleAddress = getDeployedAddress('validatorsExitBusOracle.proxy', 'validatorsExitBusOracle'); export const exitBusOracleContract = new Contract(exitBusOracleAddress, exitBusAbi, wallet); -export const consensusForAccountingAddress = getDeployedAddress('hashConsensusForAccounting'); +export const consensusForAccountingAddress = getDeployedAddress( + 'hashConsensusForAccountingOracle', + 'hashConsensusForAccounting', +); export const consensusForAccountingContract = new Contract(consensusForAccountingAddress, consensusAbi, wallet); -export const consensusForExitBusAddress = getDeployedAddress('hashConsensusForValidatorsExitBus'); +export const consensusForExitBusAddress = getDeployedAddress( + 'hashConsensusForValidatorsExitBusOracle', + 'hashConsensusForValidatorsExitBus', +); export const consensusForExitBusContract = new Contract(consensusForExitBusAddress, consensusAbi, wallet); export const oracleConfigAddress = getDeployedAddress('oracleDaemonConfig'); diff --git a/contracts/sandbox.ts b/contracts/sandbox.ts new file mode 100644 index 0000000..9fa1c1d --- /dev/null +++ b/contracts/sandbox.ts @@ -0,0 +1,7 @@ +import { Contract } from 'ethers'; +import { wallet } from '@providers'; +import { getOptionalDeployedAddress } from '@configs'; +import abi from 'abi/NodeOperatorsRegistry.json'; + +export const sandboxAddress = getOptionalDeployedAddress('app:sandbox.proxyAddress', 'app:sandbox.proxy'); +export const sandboxContract = new Contract(sandboxAddress, abi, wallet); diff --git a/contracts/simple-dvt.ts b/contracts/simple-dvt.ts new file mode 100644 index 0000000..efee944 --- /dev/null +++ b/contracts/simple-dvt.ts @@ -0,0 +1,7 @@ +import { Contract } from 'ethers'; +import { wallet } from '@providers'; +import { getOptionalDeployedAddress } from '@configs'; +import abi from 'abi/NodeOperatorsRegistry.json'; + +export const simpleDVTAddress = getOptionalDeployedAddress('app:simple-dvt.proxyAddress', 'app:simple-dvt.proxy'); +export const simpleDVTContract = new Contract(simpleDVTAddress, abi, wallet); diff --git a/contracts/staking-router.ts b/contracts/staking-router.ts index ed69d40..e0c8307 100644 --- a/contracts/staking-router.ts +++ b/contracts/staking-router.ts @@ -3,5 +3,5 @@ import { wallet } from '@providers'; import { getDeployedAddress } from '@configs'; import abi from 'abi/StakingRouter.json'; -export const stakingRouterAddress = getDeployedAddress('stakingRouter'); +export const stakingRouterAddress = getDeployedAddress('stakingRouter.proxy', 'stakingRouter'); export const stakingRouterContract = new Contract(stakingRouterAddress, abi, wallet); diff --git a/contracts/withdrawal-request.ts b/contracts/withdrawal-request.ts index 2e0a63b..52b2813 100644 --- a/contracts/withdrawal-request.ts +++ b/contracts/withdrawal-request.ts @@ -3,5 +3,5 @@ import { wallet } from '@providers'; import { getDeployedAddress } from '@configs'; import abi from 'abi/WithdrawalQueueERC721.json'; -export const withdrawalRequestAddress = getDeployedAddress('withdrawalQueueERC721'); +export const withdrawalRequestAddress = getDeployedAddress('withdrawalQueueERC721.proxy', 'withdrawalQueueERC721'); export const withdrawalRequestContract = new Contract(withdrawalRequestAddress, abi, wallet); diff --git a/programs/common/curated-module.ts b/programs/common/curated-module.ts new file mode 100644 index 0000000..a2651dd --- /dev/null +++ b/programs/common/curated-module.ts @@ -0,0 +1,169 @@ +import { Command } from 'commander'; +import { Contract } from 'ethers'; +import { authorizedCall, contractCallTxWithConfirm, formatDate, logger } from '@utils'; +import { getPenalizedOperators } from '../staking-module'; + +export const addCuratedModuleSubCommands = (command: Command, contract: Contract) => { + command + .command('operators') + .description('returns operators count') + .action(async () => { + const total = await contract.getNodeOperatorsCount(); + logger.log('Total', total); + }); + + command + .command('operator') + .description('returns operator') + .argument('', 'operator id') + .action(async (operatorId) => { + const operator = await contract.getNodeOperator(operatorId, true); + logger.log('Operator', operator.toObject()); + }); + + command + .command('operator-summary') + .description('returns operator summary') + .argument('', 'operator id') + .action(async (operatorId) => { + const summary = await contract.getNodeOperatorSummary(operatorId); + logger.log('Operator summary', summary.toObject()); + }); + + command + .command('add-operator') + .description('adds node operator') + .option('-n, --name ', 'operator name') + .option('-a, --address ', 'reward address') + .action(async (options) => { + const { name, address } = options; + await authorizedCall(contract, 'addNodeOperator', [name, address]); + }); + + command + .command('key') + .description('returns signing key') + .argument('', 'operator id') + .argument('', 'key id') + .action(async (operatorId, keyId) => { + const keyData = await contract.getSigningKey(Number(operatorId), Number(keyId)); + logger.log('Key', keyData); + }); + + command + .command('add-keys') + .description('adds signing keys') + .option('-o, --operator-id ', 'node operator id') + .option('-c, --count ', 'keys count') + .option('-p, --public-keys ', 'public keys') + .option('-s, --signatures ', 'signatures') + .action(async (options) => { + const { operatorId, count, publicKeys, signatures } = options; + await authorizedCall(contract, 'addSigningKeys', [operatorId, count, publicKeys, signatures]); + }); + + command + .command('remove-keys') + .description('removes signing keys') + .option('-o, --operator-id ', 'node operator id') + .option('-i, --from-index ', 'from index') + .option('-c, --count ', 'keys count') + .action(async (options) => { + const { operatorId, fromIndex, count } = options; + await authorizedCall(contract, 'removeSigningKeys', [Number(operatorId), Number(fromIndex), Number(count)]); + }); + + command + .command('set-limit') + .description('sets staking limit') + .option('-o, --operator-id ', 'node operator id') + .option('-l, --limit ', 'staking limit') + .action(async (options) => { + const { operatorId, limit } = options; + await authorizedCall(contract, 'setNodeOperatorStakingLimit', [operatorId, limit]); + }); + + command + .command('set-target-limit') + .description('sets target validators limit') + .option('-o, --operator-id ', 'node operator id') + .option('-l, --limit ', 'target limit') + .action(async (options) => { + const { operatorId, limit } = options; + await authorizedCall(contract, 'updateTargetValidatorsLimits', [operatorId, true, limit]); + }); + + command + .command('unset-target-limit') + .description('unsets target validators limit') + .option('-o, --operator-id ', 'node operator id') + .action(async (options) => { + const { operatorId } = options; + await authorizedCall(contract, 'updateTargetValidatorsLimits', [operatorId, false, 0]); + }); + + command + .command('penalized-operators') + .description('returns penalties for all operators') + .action(async () => { + const penalizedOperators = await getPenalizedOperators(); + + if (!penalizedOperators.length) { + logger.log('No penalized operators'); + return; + } + + const formattedOperators = penalizedOperators.map((operator) => { + const { operatorId, name, isPenaltyClearable } = operator; + const refunded = operator.refundedValidatorsCount; + const stuck = operator.stuckValidatorsCount; + const penaltyEndDate = formatDate(new Date(Number(operator.stuckPenaltyEndTimestamp) * 1000)); + + return { + operatorId, + name, + refunded, + stuck, + penaltyEndDate, + isPenaltyClearable, + }; + }); + + logger.table(formattedOperators); + }); + + command + .command('clear-penalty') + .description('clears node operator penalty') + .argument('', 'operator id') + .action(async (operatorId) => { + await contractCallTxWithConfirm(contract, 'clearNodeOperatorPenalty', [operatorId]); + }); + + command + .command('clear-penalties') + .description('clears node operator penalty') + .action(async () => { + const penalizedOperators = await getPenalizedOperators(); + + if (!penalizedOperators.length) { + logger.log('No penalized operators'); + return; + } + + for (const operator of penalizedOperators) { + logger.log('Operator is penalized', operator.operatorId, operator.name); + logger.log('Current time', formatDate(new Date())); + logger.log('Penalty end time', formatDate(new Date(Number(operator.stuckPenaltyEndTimestamp) * 1000))); + + if (operator.isPenaltyClearable) { + logger.log('Penalty can be cleared'); + await contractCallTxWithConfirm(contract, 'clearNodeOperatorPenalty', [operator.operatorId]); + } else { + logger.log('Penalty is not clearable'); + } + } + + logger.log('All operators are checked'); + }); +}; diff --git a/programs/common/index.ts b/programs/common/index.ts index 02d6da7..44ca5cd 100644 --- a/programs/common/index.ts +++ b/programs/common/index.ts @@ -2,6 +2,7 @@ export * from './access-control'; export * from './aragon-app'; export * from './base-oracle'; export * from './consensus'; +export * from './curated-module'; export * from './logs'; export * from './parsing'; export * from './pause-until'; diff --git a/programs/index.ts b/programs/index.ts index fede942..286ee92 100644 --- a/programs/index.ts +++ b/programs/index.ts @@ -10,9 +10,11 @@ export * from './ldo'; export * from './lido'; export * from './locator'; export * from './nor'; +export * from './nor'; export * from './omnibus'; export * from './oracle-config'; export * from './role'; +export * from './sandbox'; export * from './sanity-checker'; export * from './scripts'; export * from './staking-router'; diff --git a/programs/nor.ts b/programs/nor.ts index fa478b9..24db3dd 100644 --- a/programs/nor.ts +++ b/programs/nor.ts @@ -1,173 +1,9 @@ import { program } from '@command'; import { norContract } from '@contracts'; -import { authorizedCall, contractCallTxWithConfirm, formatDate, logger } from '@utils'; -import { addAragonAppSubCommands, addLogsCommands, addParsingCommands } from './common'; -import { getPenalizedOperators } from './staking-module'; +import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; const nor = program.command('nor').description('interact with node operator registry contract'); addAragonAppSubCommands(nor, norContract); addParsingCommands(nor, norContract); addLogsCommands(nor, norContract); - -nor - .command('operators') - .description('returns operators count') - .action(async () => { - const total = await norContract.getNodeOperatorsCount(); - logger.log('Total', total); - }); - -nor - .command('operator') - .description('returns operator') - .argument('', 'operator id') - .action(async (operatorId) => { - const operator = await norContract.getNodeOperator(operatorId, true); - logger.log('Operator', operator.toObject()); - }); - -nor - .command('operator-summary') - .description('returns operator summary') - .argument('', 'operator id') - .action(async (operatorId) => { - const summary = await norContract.getNodeOperatorSummary(operatorId); - logger.log('Operator summary', summary.toObject()); - }); - -nor - .command('add-operator') - .description('adds node operator') - .option('-n, --name ', 'operator name') - .option('-a, --address ', 'reward address') - .action(async (options) => { - const { name, address } = options; - await authorizedCall(norContract, 'addNodeOperator', [name, address]); - }); - -nor - .command('key') - .description('returns signing key') - .argument('', 'operator id') - .argument('', 'key id') - .action(async (operatorId, keyId) => { - const keyData = await norContract.getSigningKey(Number(operatorId), Number(keyId)); - logger.log('Key', keyData); - }); - -nor - .command('add-keys') - .description('adds signing keys') - .option('-o, --operator-id ', 'node operator id') - .option('-c, --count ', 'keys count') - .option('-p, --public-keys ', 'public keys') - .option('-s, --signatures ', 'signatures') - .action(async (options) => { - const { operatorId, count, publicKeys, signatures } = options; - await authorizedCall(norContract, 'addSigningKeys', [operatorId, count, publicKeys, signatures]); - }); - -nor - .command('remove-keys') - .description('removes signing keys') - .option('-o, --operator-id ', 'node operator id') - .option('-i, --from-index ', 'from index') - .option('-c, --count ', 'keys count') - .action(async (options) => { - const { operatorId, fromIndex, count } = options; - await authorizedCall(norContract, 'removeSigningKeys', [Number(operatorId), Number(fromIndex), Number(count)]); - }); - -nor - .command('set-limit') - .description('sets staking limit') - .option('-o, --operator-id ', 'node operator id') - .option('-l, --limit ', 'staking limit') - .action(async (options) => { - const { operatorId, limit } = options; - await authorizedCall(norContract, 'setNodeOperatorStakingLimit', [operatorId, limit]); - }); - -nor - .command('set-target-limit') - .description('sets target validators limit') - .option('-o, --operator-id ', 'node operator id') - .option('-l, --limit ', 'target limit') - .action(async (options) => { - const { operatorId, limit } = options; - await authorizedCall(norContract, 'updateTargetValidatorsLimits', [operatorId, true, limit]); - }); - -nor - .command('unset-target-limit') - .description('unsets target validators limit') - .option('-o, --operator-id ', 'node operator id') - .action(async (options) => { - const { operatorId } = options; - await authorizedCall(norContract, 'updateTargetValidatorsLimits', [operatorId, false, 0]); - }); - -nor - .command('penalized-operators') - .description('returns penalties for all operators') - .action(async () => { - const penalizedOperators = await getPenalizedOperators(); - - if (!penalizedOperators.length) { - logger.log('No penalized operators'); - return; - } - - const formattedOperators = penalizedOperators.map((operator) => { - const { operatorId, name, isPenaltyClearable } = operator; - const refunded = operator.refundedValidatorsCount; - const stuck = operator.stuckValidatorsCount; - const penaltyEndDate = formatDate(new Date(Number(operator.stuckPenaltyEndTimestamp) * 1000)); - - return { - operatorId, - name, - refunded, - stuck, - penaltyEndDate, - isPenaltyClearable, - }; - }); - - logger.table(formattedOperators); - }); - -nor - .command('clear-penalty') - .description('clears node operator penalty') - .argument('', 'operator id') - .action(async (operatorId) => { - await contractCallTxWithConfirm(norContract, 'clearNodeOperatorPenalty', [operatorId]); - }); - -nor - .command('clear-penalties') - .description('clears node operator penalty') - .action(async () => { - const penalizedOperators = await getPenalizedOperators(); - - if (!penalizedOperators.length) { - logger.log('No penalized operators'); - return; - } - - for (const operator of penalizedOperators) { - logger.log('Operator is penalized', operator.operatorId, operator.name); - logger.log('Current time', formatDate(new Date())); - logger.log('Penalty end time', formatDate(new Date(Number(operator.stuckPenaltyEndTimestamp) * 1000))); - - if (operator.isPenaltyClearable) { - logger.log('Penalty can be cleared'); - await contractCallTxWithConfirm(norContract, 'clearNodeOperatorPenalty', [operator.operatorId]); - } else { - logger.log('Penalty is not clearable'); - } - } - - logger.log('All operators are checked'); - }); +addCuratedModuleSubCommands(nor, norContract); diff --git a/programs/sandbox.ts b/programs/sandbox.ts new file mode 100644 index 0000000..72bf241 --- /dev/null +++ b/programs/sandbox.ts @@ -0,0 +1,9 @@ +import { program } from '@command'; +import { sandboxContract } from '@contracts'; +import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; + +const sandbox = program.command('sandbox').description('interact with simple dvt module contract'); +addAragonAppSubCommands(sandbox, sandboxContract); +addParsingCommands(sandbox, sandboxContract); +addLogsCommands(sandbox, sandboxContract); +addCuratedModuleSubCommands(sandbox, sandboxContract); diff --git a/programs/simple-dvt.ts b/programs/simple-dvt.ts new file mode 100644 index 0000000..9b25846 --- /dev/null +++ b/programs/simple-dvt.ts @@ -0,0 +1,9 @@ +import { program } from '@command'; +import { simpleDVTContract } from '@contracts'; +import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; + +const simpleDVT = program.command('simple-dvt').description('interact with simple dvt module contract'); +addAragonAppSubCommands(simpleDVT, simpleDVTContract); +addParsingCommands(simpleDVT, simpleDVTContract); +addLogsCommands(simpleDVT, simpleDVTContract); +addCuratedModuleSubCommands(simpleDVT, simpleDVTContract); diff --git a/programs/staking-module/operators.ts b/programs/staking-module/operators.ts index 68f2a10..e6307f8 100644 --- a/programs/staking-module/operators.ts +++ b/programs/staking-module/operators.ts @@ -35,10 +35,13 @@ export const getNodeOperators = async (moduleAddress: string): Promise { const nodeOperators = await getNodeOperators(moduleAddress); - return nodeOperators.reduce((acc, nodeOperator) => { - acc[nodeOperator.operatorId] = nodeOperator; - return acc; - }, {} as Record); + return nodeOperators.reduce( + (acc, nodeOperator) => { + acc[nodeOperator.operatorId] = nodeOperator; + return acc; + }, + {} as Record, + ); }; export const getNodeOperatorsMapByModule = async () => { @@ -51,8 +54,11 @@ export const getNodeOperatorsMapByModule = async () => { }), ); - return modulesWithOperatorsMap.reduce((acc, { moduleId, operatorsMap }) => { - acc[moduleId] = operatorsMap; - return acc; - }, {} as Record>); + return modulesWithOperatorsMap.reduce( + (acc, { moduleId, operatorsMap }) => { + acc[moduleId] = operatorsMap; + return acc; + }, + {} as Record>, + ); }; diff --git a/programs/voting.ts b/programs/voting.ts index 5d6eb50..9fb1085 100644 --- a/programs/voting.ts +++ b/programs/voting.ts @@ -55,6 +55,7 @@ voting .action(async (voteId, options) => { const { support } = options; + // TODO: add check and print if (Number(support) == 1) { await voteFor(voteId); } else { @@ -68,6 +69,7 @@ voting .description('executes vote') .argument('', 'vote id') .action(async (voteId) => { + // TODO: add check and print await executeVote(voteId); logger.log('Executed'); }); diff --git a/utils/parse-method-call.ts b/utils/parse-method-call.ts index ad41be7..4e6fdd7 100644 --- a/utils/parse-method-call.ts +++ b/utils/parse-method-call.ts @@ -17,7 +17,17 @@ export const parseMethodCall = (methodCall: string) => { }; export const parseMethodCallToContract = (methodCall: string): ParsedMethodCall => { - const [address, method, ...args] = stringArgv(methodCall.trim()); + const [address, method, ...rawArgs] = stringArgv(methodCall.trim()); + + const args = rawArgs.map((arg) => { + if (arg.startsWith('[') && arg.endsWith(']')) { + return JSON.parse(arg); + } + + return arg; + }); + + console.log(args); if (!method) { throw new Error(`Method name is empty`); From 516c8407c3b5771ade25a84f9e7a5ee80dad92e9 Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Mon, 13 Nov 2023 11:33:25 +0300 Subject: [PATCH 02/14] feat: simple dvt manager addresses list --- programs/index.ts | 1 + programs/simple-dvt.ts | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/programs/index.ts b/programs/index.ts index 286ee92..e90e894 100644 --- a/programs/index.ts +++ b/programs/index.ts @@ -17,6 +17,7 @@ export * from './role'; export * from './sandbox'; export * from './sanity-checker'; export * from './scripts'; +export * from './simple-dvt'; export * from './staking-router'; export * from './tx'; export * from './validators'; diff --git a/programs/simple-dvt.ts b/programs/simple-dvt.ts index 9b25846..ccb11d9 100644 --- a/programs/simple-dvt.ts +++ b/programs/simple-dvt.ts @@ -1,9 +1,47 @@ import { program } from '@command'; -import { simpleDVTContract } from '@contracts'; +import { aclContract, simpleDVTContract } from '@contracts'; import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; +import { getLatestBlock, logger } from '@utils'; +import { EventLog } from 'ethers'; const simpleDVT = program.command('simple-dvt').description('interact with simple dvt module contract'); addAragonAppSubCommands(simpleDVT, simpleDVTContract); addParsingCommands(simpleDVT, simpleDVTContract); addLogsCommands(simpleDVT, simpleDVTContract); addCuratedModuleSubCommands(simpleDVT, simpleDVTContract); + +simpleDVT + .command('manager-addresses') + .description('returns manager addresses list') + .option('-b, --blocks ', 'blocks', '1000000') + .action(async (options) => { + const { blocks } = options; + const simpleDVTAddress = await simpleDVTContract.getAddress(); + const role = await simpleDVTContract.MANAGE_SIGNING_KEYS(); + + const latestBlock = await getLatestBlock(); + const toBlock = latestBlock.number; + const fromBlock = Math.max(toBlock - Number(blocks), 0); + + const filter = aclContract.filters.SetPermission(null, simpleDVTAddress, role); + const logs = await aclContract.queryFilter(filter, fromBlock, toBlock); + + const result = await Promise.all( + logs.map(async (log) => { + if (!(log instanceof EventLog)) throw new Error('Log is not an EventLog'); + + try { + const managerAddress = log.args[0]; + const roleParams = await aclContract.getPermissionParam(managerAddress, simpleDVTAddress, role, 0); + + const [, , operatorId] = roleParams; + + return { operatorId, managerAddress }; + } catch { + // ignore if role has no params + } + }), + ); + + logger.table(result.filter((v) => v)); + }); From 558565b72f4dd953cf85dabf12786e4eaeb12ee0 Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Sun, 19 Nov 2023 18:38:47 +0300 Subject: [PATCH 03/14] feat: set reward address --- programs/common/curated-module.ts | 69 ++++++++++++++++++++++++++++++- programs/simple-dvt.ts | 40 +----------------- 2 files changed, 68 insertions(+), 41 deletions(-) diff --git a/programs/common/curated-module.ts b/programs/common/curated-module.ts index a2651dd..718b5f1 100644 --- a/programs/common/curated-module.ts +++ b/programs/common/curated-module.ts @@ -1,7 +1,8 @@ import { Command } from 'commander'; -import { Contract } from 'ethers'; -import { authorizedCall, contractCallTxWithConfirm, formatDate, logger } from '@utils'; +import { Contract, EventLog } from 'ethers'; +import { authorizedCall, contractCallTxWithConfirm, formatDate, getLatestBlock, logger } from '@utils'; import { getPenalizedOperators } from '../staking-module'; +import { aclContract } from '@contracts'; export const addCuratedModuleSubCommands = (command: Command, contract: Contract) => { command @@ -166,4 +167,68 @@ export const addCuratedModuleSubCommands = (command: Command, contract: Contract logger.log('All operators are checked'); }); + + command + .command('set-reward-address') + .description('sets node operator reward address') + .argument('', 'operator id') + .argument('
', 'reward address') + .action(async (operatorId, address) => { + await authorizedCall(contract, 'setNodeOperatorRewardAddress', [operatorId, address]); + }); + + command + .command('manager-addresses') + .description('returns manager addresses list') + .option('-b, --blocks ', 'blocks', '1000000000') + .action(async (options) => { + const { blocks } = options; + const simpleDVTAddress = await contract.getAddress(); + const role = await contract.MANAGE_SIGNING_KEYS(); + + const latestBlock = await getLatestBlock(); + const toBlock = latestBlock.number; + const fromBlock = Math.max(toBlock - Number(blocks), 0); + + const filter = aclContract.filters.SetPermission(null, simpleDVTAddress, role); + const logs = await aclContract.queryFilter(filter, fromBlock, toBlock); + + const result = await Promise.all( + logs.map(async (log) => { + if (!(log instanceof EventLog)) throw new Error('Failed to parse log'); + + try { + const managerAddress = log.args[0]; + const roleParams = await aclContract.getPermissionParam(managerAddress, simpleDVTAddress, role, 0); + + const [, , operatorId] = roleParams; + + return { operatorId, managerAddress }; + } catch { + // ignore if role has no params + } + }), + ); + + const filteredResult = result.filter((v) => v); + + if (filteredResult.length) { + logger.table(filteredResult); + } else { + logger.log('No manager addresses'); + } + }); + + // command + // .command('grant-manager-role') + // .description('grants manager role') + // .argument('', 'operator id') + // .argument('
', 'address') + // .action(async (operatorId, address) => { + // const role = await contract.MANAGE_SIGNING_KEYS(); + // const simpleDVTAddress = await contract.getAddress(); + // const params = [] + + // await authorizedCall(aclContract, 'grantPermissionP', [address, simpleDVTAddress, role, params]); + // }); }; diff --git a/programs/simple-dvt.ts b/programs/simple-dvt.ts index ccb11d9..9b25846 100644 --- a/programs/simple-dvt.ts +++ b/programs/simple-dvt.ts @@ -1,47 +1,9 @@ import { program } from '@command'; -import { aclContract, simpleDVTContract } from '@contracts'; +import { simpleDVTContract } from '@contracts'; import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; -import { getLatestBlock, logger } from '@utils'; -import { EventLog } from 'ethers'; const simpleDVT = program.command('simple-dvt').description('interact with simple dvt module contract'); addAragonAppSubCommands(simpleDVT, simpleDVTContract); addParsingCommands(simpleDVT, simpleDVTContract); addLogsCommands(simpleDVT, simpleDVTContract); addCuratedModuleSubCommands(simpleDVT, simpleDVTContract); - -simpleDVT - .command('manager-addresses') - .description('returns manager addresses list') - .option('-b, --blocks ', 'blocks', '1000000') - .action(async (options) => { - const { blocks } = options; - const simpleDVTAddress = await simpleDVTContract.getAddress(); - const role = await simpleDVTContract.MANAGE_SIGNING_KEYS(); - - const latestBlock = await getLatestBlock(); - const toBlock = latestBlock.number; - const fromBlock = Math.max(toBlock - Number(blocks), 0); - - const filter = aclContract.filters.SetPermission(null, simpleDVTAddress, role); - const logs = await aclContract.queryFilter(filter, fromBlock, toBlock); - - const result = await Promise.all( - logs.map(async (log) => { - if (!(log instanceof EventLog)) throw new Error('Log is not an EventLog'); - - try { - const managerAddress = log.args[0]; - const roleParams = await aclContract.getPermissionParam(managerAddress, simpleDVTAddress, role, 0); - - const [, , operatorId] = roleParams; - - return { operatorId, managerAddress }; - } catch { - // ignore if role has no params - } - }), - ); - - logger.table(result.filter((v) => v)); - }); From acc1f74ba21bad6f8e33cb99982cdd05bd2c9c24 Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Sun, 19 Nov 2023 19:33:43 +0300 Subject: [PATCH 04/14] fix: await for authorized calls --- utils/authorized-call.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/authorized-call.ts b/utils/authorized-call.ts index c49f750..7938425 100644 --- a/utils/authorized-call.ts +++ b/utils/authorized-call.ts @@ -49,7 +49,7 @@ export const authorizedCallEOA = async (contract: Contract, method: string, args }; export const authorizedCallVoting = async (contract: Contract, method: string, args: unknown[] = []) => { - authorizedCallTest(contract, method, args, votingAddress); + await authorizedCallTest(contract, method, args, votingAddress); printSuccess('voting'); const encoded = await encode(contract, method, args); @@ -60,7 +60,7 @@ export const authorizedCallVoting = async (contract: Contract, method: string, a }; export const authorizedCallAgent = async (contract: Contract, method: string, args: unknown[] = []) => { - authorizedCallTest(contract, method, args, aragonAgentAddress); + await authorizedCallTest(contract, method, args, aragonAgentAddress); printSuccess('agent'); const encoded = await encode(contract, method, args); From a058f784c864c13d1ae5b1da7b7ea95e1fbc1c1c Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Mon, 20 Nov 2023 09:43:03 +0300 Subject: [PATCH 05/14] feat: grant manager role --- programs/common/curated-module.ts | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/programs/common/curated-module.ts b/programs/common/curated-module.ts index 718b5f1..afbb493 100644 --- a/programs/common/curated-module.ts +++ b/programs/common/curated-module.ts @@ -1,5 +1,5 @@ import { Command } from 'commander'; -import { Contract, EventLog } from 'ethers'; +import { Contract, EventLog, concat, toBeHex } from 'ethers'; import { authorizedCall, contractCallTxWithConfirm, formatDate, getLatestBlock, logger } from '@utils'; import { getPenalizedOperators } from '../staking-module'; import { aclContract } from '@contracts'; @@ -219,16 +219,21 @@ export const addCuratedModuleSubCommands = (command: Command, contract: Contract } }); - // command - // .command('grant-manager-role') - // .description('grants manager role') - // .argument('', 'operator id') - // .argument('
', 'address') - // .action(async (operatorId, address) => { - // const role = await contract.MANAGE_SIGNING_KEYS(); - // const simpleDVTAddress = await contract.getAddress(); - // const params = [] + command + .command('grant-manager-role') + .description('grants manager role') + .argument('', 'operator id') + .argument('
', 'address') + .action(async (operatorId, address) => { + const role = await contract.MANAGE_SIGNING_KEYS(); + const simpleDVTAddress = await contract.getAddress(); + + // https://legacy-docs.aragon.org/developers/tools/aragonos/reference-aragonos-3#parameter-interpretation + const op = toBeHex(1, 1); // Op.EQ = 1 + const id = toBeHex(0, 1); // Param id = 0 + const value = toBeHex(operatorId, 30); + const params = [concat([id, op, value])]; - // await authorizedCall(aclContract, 'grantPermissionP', [address, simpleDVTAddress, role, params]); - // }); + await authorizedCall(aclContract, 'grantPermissionP', [address, simpleDVTAddress, role, params]); + }); }; From 29fb9f547e5db15f521de7c959ce7fd0c167a565 Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Mon, 20 Nov 2023 17:33:20 +0300 Subject: [PATCH 06/14] feat: sanity checker --- programs/sanity-checker.ts | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/programs/sanity-checker.ts b/programs/sanity-checker.ts index eb28630..3f0bb4c 100644 --- a/programs/sanity-checker.ts +++ b/programs/sanity-checker.ts @@ -55,3 +55,43 @@ sanityChecker .action(async (limit) => { await authorizedCall(sanityCheckerContract, 'setMaxNodeOperatorsPerExtraDataItemCount', [Number(limit)]); }); + +sanityChecker + .command('set-oracle-report-limits') + .description('sets oracle report limits') + .argument('', 'churn validators per day limit') + .argument('', 'one off cl balance decrease limit in BP') + .argument('', 'annual balance increase limit in BP') + .argument('', 'simulated share rate deviation limit in BP') + .argument('', 'max validator exit requests per report') + .argument('', 'max accounting extra data list items count') + .argument('', 'max node operators per extra data item count') + .argument('', 'request timestamp margin') + .argument('', 'max positive token rebase') + .action( + async ( + churnValidatorsPerDayLimit, + oneOffCLBalanceDecreaseBPLimit, + annualBalanceIncreaseBPLimit, + simulatedShareRateDeviationBPLimit, + maxValidatorExitRequestsPerReport, + maxAccountingExtraDataListItemsCount, + maxNodeOperatorsPerExtraDataItemCount, + requestTimestampMargin, + maxPositiveTokenRebase, + ) => { + await authorizedCall(sanityCheckerContract, 'setOracleReportLimits', [ + { + churnValidatorsPerDayLimit: Number(churnValidatorsPerDayLimit), + oneOffCLBalanceDecreaseBPLimit: Number(oneOffCLBalanceDecreaseBPLimit), + annualBalanceIncreaseBPLimit: Number(annualBalanceIncreaseBPLimit), + simulatedShareRateDeviationBPLimit: Number(simulatedShareRateDeviationBPLimit), + maxValidatorExitRequestsPerReport: Number(maxValidatorExitRequestsPerReport), + maxAccountingExtraDataListItemsCount: Number(maxAccountingExtraDataListItemsCount), + maxNodeOperatorsPerExtraDataItemCount: Number(maxNodeOperatorsPerExtraDataItemCount), + requestTimestampMargin: Number(requestTimestampMargin), + maxPositiveTokenRebase: Number(maxPositiveTokenRebase), + }, + ]); + }, + ); From 56b20a805dda304a86631152994f93a41fadd861 Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Thu, 23 Nov 2023 11:36:14 +0300 Subject: [PATCH 07/14] feat: validator statuses --- programs/validators.ts | 53 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/programs/validators.ts b/programs/validators.ts index 7ef2c17..17d27f0 100644 --- a/programs/validators.ts +++ b/programs/validators.ts @@ -62,6 +62,59 @@ validators logger.log('Operators with 0x00 wc', nodeOperatorIds); }); +validators + .command('statuses') + .description('fetches validators statuses by operator') + .action(async () => { + logger.log('Fetching keys from KAPI, it may take a while...'); + const keys = await fetchAllLidoKeys(); + + logger.log('Fetching validators from CL, it may take a few minutes...'); + const validators = await fetchAllValidators(); + + const keysMap = keys.reduce( + (acc, signingKey) => { + acc[signingKey.key] = signingKey; + return acc; + }, + {} as Record, + ); + + const lidoValidators = validators.filter(({ validator }) => { + return keysMap[validator.pubkey]; + }); + + logger.log('Validators on CL', lidoValidators.length); + + const statsByModuleAndOperator = lidoValidators.reduce( + (acc, { validator, status }) => { + const key = keysMap[validator.pubkey]; + const { moduleAddress, operatorIndex } = key; + + if (!acc[moduleAddress]) { + acc[moduleAddress] = {}; + } + + if (!acc[moduleAddress][operatorIndex]) { + acc[moduleAddress][operatorIndex] = { operatorIndex }; + } + + const operatorStats = acc[moduleAddress][operatorIndex]; + + if (!operatorStats[status]) operatorStats[status] = 0; + operatorStats[status] += 1; + + return acc; + }, + {} as Record>>, + ); + + Object.entries(statsByModuleAndOperator).forEach(([moduleAddress, statsByOperator]) => { + logger.log('Module', moduleAddress); + logger.table(Object.values(statsByOperator)); + }); + }); + validators .command('slash-by-attestations') .description('slash a validator by attestations ') From 0ac345a31742842822e8afe343402e562b10f46b Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Wed, 6 Dec 2023 11:38:30 +0300 Subject: [PATCH 08/14] feat: reward address check --- contracts/index.ts | 1 + contracts/wsteth.ts | 7 +++ programs/simple-dvt.ts | 120 ++++++++++++++++++++++++++++++++++++- programs/staking-router.ts | 20 ++++++- 4 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 contracts/wsteth.ts diff --git a/contracts/index.ts b/contracts/index.ts index 34cc207..c472893 100644 --- a/contracts/index.ts +++ b/contracts/index.ts @@ -20,3 +20,4 @@ export * from './staking-router'; export * from './token-manager'; export * from './voting'; export * from './withdrawal-request'; +export * from './wsteth'; diff --git a/contracts/wsteth.ts b/contracts/wsteth.ts new file mode 100644 index 0000000..c234c4f --- /dev/null +++ b/contracts/wsteth.ts @@ -0,0 +1,7 @@ +import { Contract } from 'ethers'; +import { wallet } from '@providers'; +import { getDeployedAddress } from '@configs'; +import abi from 'abi/WstETH.json'; + +export const wstethAddress = getDeployedAddress('wstETH.address'); +export const wstethContract = new Contract(wstethAddress, abi, wallet); diff --git a/programs/simple-dvt.ts b/programs/simple-dvt.ts index 9b25846..1d8938e 100644 --- a/programs/simple-dvt.ts +++ b/programs/simple-dvt.ts @@ -1,9 +1,127 @@ import { program } from '@command'; -import { simpleDVTContract } from '@contracts'; +import { lidoAddress, simpleDVTContract, wstethAddress } from '@contracts'; import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; +import { provider } from '@providers'; +import { Contract } from 'ethers'; +import { logger } from '@utils'; const simpleDVT = program.command('simple-dvt').description('interact with simple dvt module contract'); addAragonAppSubCommands(simpleDVT, simpleDVTContract); addParsingCommands(simpleDVT, simpleDVTContract); addLogsCommands(simpleDVT, simpleDVTContract); addCuratedModuleSubCommands(simpleDVT, simpleDVTContract); + +simpleDVT + .command('check-reward-address') + .description('check split contracts') + .argument('
', 'address of the reward address') + .action(async (wrapperAddress) => { + // wrapper checks + + const wrapperABI = [ + 'function feeRecipient() view returns (address)', + 'function feeShare() view returns (uint256)', + 'function splitWallet() view returns (address)', + 'function stETH() view returns (address)', + 'function wstETH() view returns (address)', + ]; + + const wrapperContract = new Contract(wrapperAddress, wrapperABI, provider); + + const [feeRecipient, feeShare, splitWallet, stETH, wstETH] = await Promise.all([ + wrapperContract.feeRecipient(), + wrapperContract.feeShare(), + wrapperContract.splitWallet(), + wrapperContract.stETH(), + wrapperContract.wstETH(), + ]); + + logger.log('Wrapper contract info:'); + logger.table({ + feeShare: Number(feeShare), + feeRecipient, + splitWallet, + stETH, + wstETH, + }); + + // 0x splitter checks + + const splitABI = ['function splitMain() view returns (address)']; + const splitMainABI = [ + 'function createSplit(address[] accounts,uint32[] percentAllocations,uint32 distributorFee,address controller)', + 'event CreateSplit(address indexed split)', + ]; + + const splitContract = new Contract(splitWallet, splitABI, provider); + const splitMainAddress = await splitContract.splitMain(); + + const splitMainContract = new Contract(splitMainAddress, splitMainABI, provider); + const deployEvent = splitMainContract.filters.CreateSplit(splitWallet); + const toBlock = await provider.getBlockNumber(); + const [splitMainEvent] = await splitMainContract.queryFilter(deployEvent, 0, toBlock); + const { transactionHash } = splitMainEvent; + + const tx = await provider.getTransaction(transactionHash); + + if (!tx) { + logger.error('Transaction not found'); + return; + } + + const parsedTx = splitMainContract.interface.parseTransaction(tx); + + if (!parsedTx) { + logger.error('Transaction parse failed'); + return; + } + + logger.log(''); + logger.log('Split contract info:'); + logger.log('Accounts:'); + logger.table(parsedTx.args[0]); + logger.log('Percent allocations:'); + logger.table(parsedTx.args[1]); + + logger.log('Common info:'); + logger.table({ + transactionHash, + splitMainAddress, + splitWallet, + distributorFee: parsedTx.args[2], + controller: parsedTx.args[3], + }); + + // addresses checks + + const splitFactoryAddresses: Record = { + 1: '0x2ed6c4B5dA6378c7897AC67Ba9e43102Feb694EE', + 17000: '0x2ed6c4b5da6378c7897ac67ba9e43102feb694ee', + }; + + const { chainId } = await provider.getNetwork(); + const expectedSplitMainAddress = splitFactoryAddresses[Number(chainId)]; + + logger.log('Addresses checks:'); + + const expectedStETHAddress = lidoAddress; + const expectedWstETHAddress = wstethAddress; + + if (stETH.toLocaleLowerCase() === expectedStETHAddress.toLocaleLowerCase()) { + logger.success('stETH address matches'); + } else { + logger.error(`stETH address mismatch: ${stETH} !== ${expectedStETHAddress}`); + } + + if (wstETH.toLocaleLowerCase() === expectedWstETHAddress.toLocaleLowerCase()) { + logger.success('wstETH address matches'); + } else { + logger.error(`wstETH address mismatch: ${wstETH} !== ${expectedWstETHAddress}`); + } + + if (splitMainAddress.toLocaleLowerCase() === expectedSplitMainAddress.toLocaleLowerCase()) { + logger.success('splitMain address matches'); + } else { + logger.error(`splitMain address mismatch: ${splitMainAddress} !== ${expectedSplitMainAddress}`); + } + }); diff --git a/programs/staking-router.ts b/programs/staking-router.ts index fae246f..4c446d9 100644 --- a/programs/staking-router.ts +++ b/programs/staking-router.ts @@ -180,8 +180,26 @@ router }; }); + const extra = operatorsDigests.map((data) => { + const { operatorId, name, active, depositable } = data; + + return { + operatorId, + name, + active, + depositable, + toDepositBeforeInfstones: Math.min(10001 - data.active, data.depositable), + }; + }); logger.log('Module', module.id, module.stakingModuleAddress); - logger.table(operatorsDigests); + logger.table(extra); + + const keysBeforeInfstones = extra.reduce((acc, val) => { + acc += val.toDepositBeforeInfstones; + return acc; + }, 0); + + console.log('Total keys before infstones:', keysBeforeInfstones, `(${keysBeforeInfstones * 32} eth)`); } }); From 1c9333ba541664bc72296a8895b69037aae04963 Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Wed, 20 Dec 2023 17:26:29 +0300 Subject: [PATCH 09/14] fix: remove infstones digests --- programs/staking-router.ts | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/programs/staking-router.ts b/programs/staking-router.ts index 4c446d9..fae246f 100644 --- a/programs/staking-router.ts +++ b/programs/staking-router.ts @@ -180,26 +180,8 @@ router }; }); - const extra = operatorsDigests.map((data) => { - const { operatorId, name, active, depositable } = data; - - return { - operatorId, - name, - active, - depositable, - toDepositBeforeInfstones: Math.min(10001 - data.active, data.depositable), - }; - }); logger.log('Module', module.id, module.stakingModuleAddress); - logger.table(extra); - - const keysBeforeInfstones = extra.reduce((acc, val) => { - acc += val.toDepositBeforeInfstones; - return acc; - }, 0); - - console.log('Total keys before infstones:', keysBeforeInfstones, `(${keysBeforeInfstones * 32} eth)`); + logger.table(operatorsDigests); } }); From a68b984393020816656d068b1a879a71424b7f84 Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Wed, 20 Dec 2023 17:34:47 +0300 Subject: [PATCH 10/14] feat: detect names for modules based on NOR implementation --- programs/staking-module/operators.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/programs/staking-module/operators.ts b/programs/staking-module/operators.ts index e6307f8..f71a242 100644 --- a/programs/staking-module/operators.ts +++ b/programs/staking-module/operators.ts @@ -18,18 +18,21 @@ export const getNodeOperators = async (moduleAddress: string): Promise Number(operatorId)); - if (moduleAddress === norAddress) { + // try to detect name if it's a curated module implementation + try { + const moduleContract = norContract.attach(moduleAddress) as typeof norContract; + return await Promise.all( operatorIds.map(async (operatorId) => { - const result: { name: string } = await norContract.getNodeOperator(operatorId, true); + const result: { name: string } = await moduleContract.getNodeOperator(operatorId, true); return { operatorId, name: result.name }; }), ); + } catch { + return operatorIds.map((operatorId) => { + return { operatorId, name: 'unknown' }; + }); } - - return operatorIds.map((operatorId) => { - return { operatorId, name: 'unknown' }; - }); }; export const getNodeOperatorsMap = async (moduleAddress: string) => { From 9525d1e48d8bbb063f50e758d61c461d0e3bc62d Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Wed, 20 Dec 2023 17:36:01 +0300 Subject: [PATCH 11/14] fix: remove unused var --- programs/staking-module/operators.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/staking-module/operators.ts b/programs/staking-module/operators.ts index f71a242..debad24 100644 --- a/programs/staking-module/operators.ts +++ b/programs/staking-module/operators.ts @@ -1,4 +1,4 @@ -import { getStakingModuleContract, norAddress, norContract } from '@contracts'; +import { getStakingModuleContract, norContract } from '@contracts'; import { getStakingModules } from './modules'; export type NodeOperator = { From 5e15d86906e597600a674fb0758cb1418f4da4f8 Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Mon, 8 Jan 2024 16:26:30 +0300 Subject: [PATCH 12/14] feat: fetch validators with stream --- package.json | 2 ++ programs/validators.ts | 10 +++++++--- providers/cl-provider.ts | 26 ++++++++++++++++++++++---- yarn.lock | 25 +++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index c716331..c616c11 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ }, "devDependencies": { "@swc/core": "1.3.82", + "@types/jsonstream": "^0.8.33", "@types/node": "^20.8.2", "@types/node-fetch": "2", "@types/prompts": "^2.4.3", @@ -26,6 +27,7 @@ "dependencies": { "@chainsafe/bls-keygen": "^0.4.0", "@chainsafe/ssz": "^0.13.0", + "JSONStream": "^1.3.5", "chalk": "^4", "commander": "^11.0.0", "ethers": "^6.2.2", diff --git a/programs/validators.ts b/programs/validators.ts index 17d27f0..cdb98b0 100644 --- a/programs/validators.ts +++ b/programs/validators.ts @@ -26,6 +26,8 @@ validators logger.log('Fetching validators from CL, it may take a few minutes...'); const validators = await fetchAllValidators(); + logger.log('All validators on CL', validators.length); + const keysMap = keys.reduce( (acc, signingKey) => { acc[signingKey.key] = signingKey; @@ -38,13 +40,13 @@ validators return keysMap[validator.pubkey]; }); - logger.log('Validators on CL', lidoValidators.length); + logger.log('Lido validators on CL', lidoValidators.length); const validatorsWith0x00WC = lidoValidators.filter(({ validator }) => { return validator.withdrawal_credentials.startsWith('0x00'); }); - logger.log('Validators with 0x00 wc', validatorsWith0x00WC.length); + logger.log('Lido validators with 0x00 wc', validatorsWith0x00WC.length); const nodeOperatorIds = validatorsWith0x00WC.reduce( (acc, { validator }) => { @@ -72,6 +74,8 @@ validators logger.log('Fetching validators from CL, it may take a few minutes...'); const validators = await fetchAllValidators(); + logger.log('All validators on CL', validators.length); + const keysMap = keys.reduce( (acc, signingKey) => { acc[signingKey.key] = signingKey; @@ -84,7 +88,7 @@ validators return keysMap[validator.pubkey]; }); - logger.log('Validators on CL', lidoValidators.length); + logger.log('Lido validators on CL', lidoValidators.length); const statsByModuleAndOperator = lidoValidators.reduce( (acc, { validator, status }) => { diff --git a/providers/cl-provider.ts b/providers/cl-provider.ts index c0c657a..e0a6a1f 100644 --- a/providers/cl-provider.ts +++ b/providers/cl-provider.ts @@ -1,20 +1,38 @@ import { envs } from '@configs'; import { stringify } from '@utils'; import fetch, { RequestInit } from 'node-fetch'; +import JSONStream from 'JSONStream'; import { Genesis, Fork, SignedBeaconBlock, SignedBeaconBlockHeaderContainer, ValidatorContainer } from './cl-types'; -export const fetchCL = async (url: string, init?: RequestInit) => { +export const fetchCLResponse = async (url: string, init?: RequestInit) => { if (!envs?.CL_API_PROVIDER) { throw new Error('CL_API_PROVIDER is not defined'); } - const response = await fetch(`${envs.CL_API_PROVIDER}/${url}`, init); + return await fetch(`${envs.CL_API_PROVIDER}/${url}`, init); +}; + +export const fetchCL = async (url: string, init?: RequestInit) => { + const response = await fetchCLResponse(url, init); return await response.json(); }; export const fetchAllValidators = async (stateId: string | number = 'head') => { - const result = await fetchCL(`eth/v1/beacon/states/${stateId}/validators`); - return result.data as ValidatorContainer[]; + const response = await fetchCLResponse(`eth/v1/beacon/states/${stateId}/validators`); + + return await new Promise((resolve, reject) => { + try { + (async () => { + const stream = response.body.pipe(JSONStream.parse('data.*')); + + const validators: ValidatorContainer[] = []; + stream.on('data', (validator: ValidatorContainer) => validators.push(validator)); + stream.on('end', () => resolve(validators)); + })(); + } catch (error) { + reject(error); + } + }); }; export const fetchValidator = async (validatorId: string, stateId: string | number = 'head') => { diff --git a/yarn.lock b/yarn.lock index bb6cda8..78bc19a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -324,6 +324,13 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== +"@types/jsonstream@^0.8.33": + version "0.8.33" + resolved "https://registry.yarnpkg.com/@types/jsonstream/-/jsonstream-0.8.33.tgz#7d37a16a78cf68a67858110dc1767023436fca23" + integrity sha512-yhg1SNOgJ8y2nOkvAQ1zZ1Z2xibxgFs7984+EeBPuWgo/TbuYo79+rj2wUVch3KF4GhhcwAi/AlJcehmLCXb3g== + dependencies: + "@types/node" "*" + "@types/node-fetch@2": version "2.6.6" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.6.tgz#b72f3f4bc0c0afee1c0bc9cff68e041d01e3e779" @@ -448,6 +455,14 @@ "@typescript-eslint/types" "6.7.4" eslint-visitor-keys "^3.4.1" +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1304,6 +1319,11 @@ json5@^2.2.2: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + keyv@^4.5.3: version "4.5.3" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" @@ -1922,6 +1942,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + titleize@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" From 31f7f9bdf2fd0f7117cb7bc11f0ee48f2c9fae2e Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Mon, 8 Jan 2024 16:36:49 +0300 Subject: [PATCH 13/14] fix: add error handler for validators stream --- providers/cl-provider.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/providers/cl-provider.ts b/providers/cl-provider.ts index e0a6a1f..6947904 100644 --- a/providers/cl-provider.ts +++ b/providers/cl-provider.ts @@ -28,6 +28,7 @@ export const fetchAllValidators = async (stateId: string | number = 'head') => { const validators: ValidatorContainer[] = []; stream.on('data', (validator: ValidatorContainer) => validators.push(validator)); stream.on('end', () => resolve(validators)); + stream.on('error', reject); })(); } catch (error) { reject(error); From c28eb68c625a3772e3610fcdd14ed60d0b1b2763 Mon Sep 17 00:00:00 2001 From: George Avsetsin Date: Fri, 19 Jan 2024 11:22:10 +0300 Subject: [PATCH 14/14] feat: unlimited stake on holesky --- abi/UnlimitedStake.json | 1 + configs/deployed.ts | 24 +++++++++++++++++++----- configs/extra-deployed-goerli.json | 1 + configs/extra-deployed-holesky.json | 5 +++++ configs/extra-deployed-mainnet.json | 1 + contracts/index.ts | 1 + contracts/unlimited-stake.ts | 7 +++++++ programs/lido.ts | 16 +++++++++++++++- 8 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 abi/UnlimitedStake.json create mode 100644 configs/extra-deployed-goerli.json create mode 100644 configs/extra-deployed-holesky.json create mode 100644 configs/extra-deployed-mainnet.json create mode 100644 contracts/unlimited-stake.ts diff --git a/abi/UnlimitedStake.json b/abi/UnlimitedStake.json new file mode 100644 index 0000000..b492d38 --- /dev/null +++ b/abi/UnlimitedStake.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"_lido","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address[]","name":"_allowedList","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotAllowed","type":"error"},{"inputs":[],"name":"StakingIsPaused","type":"error"},{"inputs":[{"internalType":"string","name":"field","type":"string"}],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"LIDO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_allowed","type":"bool"}],"name":"setAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referral","type":"address"}],"name":"unlimitedSubmit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"}] diff --git a/configs/deployed.ts b/configs/deployed.ts index 0c8353e..e7364e1 100644 --- a/configs/deployed.ts +++ b/configs/deployed.ts @@ -4,15 +4,29 @@ import { envs } from './envs'; import { getValueByPath } from '@utils'; import { ZeroAddress } from 'ethers'; +export const importConfigFile = (path?: string) => { + const fullPath = resolve('configs', path ?? ''); + const json: Record> = {}; + + if (lstatSync(fullPath).isFile()) { + // eslint-disable-next-line @typescript-eslint/no-var-requires + Object.assign(json, require(fullPath)); + } + + return json; +}; + export const getContracts = () => { - const fullPath = resolve('configs', envs?.DEPLOYED ?? ''); + const deployedFile = envs?.DEPLOYED; - if (!lstatSync(fullPath).isFile()) { - throw new Error('Deployed contracts file not found, check .env file'); + if (!deployedFile) { + throw new Error('Deployed contracts file is not set, check .env file'); } - // eslint-disable-next-line @typescript-eslint/no-var-requires - return require(fullPath) as Record>; + const mainDeployedJSON = importConfigFile(envs?.DEPLOYED); + const extraDeployedJSON = importConfigFile(`extra-${envs?.DEPLOYED}`); + + return { ...mainDeployedJSON, ...extraDeployedJSON }; }; export const getContractDeploy = (path: string) => { diff --git a/configs/extra-deployed-goerli.json b/configs/extra-deployed-goerli.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/configs/extra-deployed-goerli.json @@ -0,0 +1 @@ +{} diff --git a/configs/extra-deployed-holesky.json b/configs/extra-deployed-holesky.json new file mode 100644 index 0000000..09f764e --- /dev/null +++ b/configs/extra-deployed-holesky.json @@ -0,0 +1,5 @@ +{ + "unlimitedStake": { + "address": "0xc589bfa706a94fc0fc48720d62e0f442dee0cb5d" + } +} diff --git a/configs/extra-deployed-mainnet.json b/configs/extra-deployed-mainnet.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/configs/extra-deployed-mainnet.json @@ -0,0 +1 @@ +{} diff --git a/contracts/index.ts b/contracts/index.ts index c472893..8fae346 100644 --- a/contracts/index.ts +++ b/contracts/index.ts @@ -18,6 +18,7 @@ export * from './simple-dvt'; export * from './staking-module'; export * from './staking-router'; export * from './token-manager'; +export * from './unlimited-stake'; export * from './voting'; export * from './withdrawal-request'; export * from './wsteth'; diff --git a/contracts/unlimited-stake.ts b/contracts/unlimited-stake.ts new file mode 100644 index 0000000..ccf0f2d --- /dev/null +++ b/contracts/unlimited-stake.ts @@ -0,0 +1,7 @@ +import { Contract } from 'ethers'; +import { wallet } from '@providers'; +import { getOptionalDeployedAddress } from '@configs'; +import abi from 'abi/UnlimitedStake.json'; + +export const unlimitedStakeAddress = getOptionalDeployedAddress('unlimitedStake.address'); +export const unlimitedStakeContract = new Contract(unlimitedStakeAddress, abi, wallet); diff --git a/programs/lido.ts b/programs/lido.ts index 5b1b94a..b3d5bc0 100644 --- a/programs/lido.ts +++ b/programs/lido.ts @@ -1,6 +1,6 @@ import { formatEther, parseEther, ZeroAddress } from 'ethers'; import { program } from '@command'; -import { lidoContract } from '@contracts'; +import { lidoContract, unlimitedStakeContract } from '@contracts'; import { authorizedCall, contractCallTxWithConfirm, forwardVoteFromTm, logger } from '@utils'; import { resumeLidoAndSetStakingLimit, votingForward } from '@scripts'; import { addAragonAppSubCommands, addLogsCommands, addParsingCommands } from './common'; @@ -78,6 +78,7 @@ lido lido .command('submit') + .description('submits ether amount') .argument('', 'ether amount') .option('-r, --referral ', 'referral address', ZeroAddress) .action(async (amount, options) => { @@ -104,3 +105,16 @@ lido parseEther(stakeLimitIncreasePerBlock), ]); }); + +lido + .command('unlimited-submit') + .description('submits unlimited ether amount') + .argument('', 'ether amount') + .option('-r, --referral ', 'referral address', ZeroAddress) + .action(async (amount, options) => { + const { referral } = options; + await contractCallTxWithConfirm(unlimitedStakeContract, 'unlimitedSubmit', [ + referral, + { value: parseEther(amount) }, + ]); + });