--- tags: governance, howto, omnibus --- # 24.05.22 How to check the vote for Merge-ready protocol upgrade (round 1) The vote [#129](https://mainnet.lido.fi/#/lido-dao/0x2e59a20f205bb85a89c53f1936454680651e618e/vote/129/) has the number of actions without descriptions. There is a list of things that are going to be performed: 1. Publishing new implementation (0x47EbaB13B806773ec2A2d16873e2dF770D130b50) in Lido app APM repo 0xF5Dc67E54FC96F993CD06073f71ca732C1E654B1 2. Updating implementation of Lido app with the new one 0x47EbaB13B806773ec2A2d16873e2dF770D130b50 3. Publishing new implementation (0x5d39ABaa161e622B99D45616afC8B837E9F19a25) in Node Operators Registry app APM repo 0x0D97E876ad14DB2b183CFeEB8aa1A5C788eB1831 4. Updating implementation of Node Operators Registry app with the new one 0x5d39ABaa161e622B99D45616afC8B837E9F19a25 5. Publishing new implementation (0x1430194905301504e8830ce4B0b0df7187E84AbD) in Oracle app APM repo 0xF9339DE629973c60c4d2b76749c81E6F40960E3A 6. Updating implementation of Oracle app with new one 0x1430194905301504e8830ce4B0b0df7187E84AbD 7. Call Oracle's finalizeUpgrade_v3() to update internal version counter 8. Create permission for SET_EL_REWARDS_VAULT_ROLE of Lido app assigning it to Voting 0x2e59A20f205bB85a89C53f1936454680651E618e 9. Create permission for STAKING_CONTROL_ROLE of Lido app assigning it to Voting 0x2e59A20f205bB85a89C53f1936454680651E618e 10. Set execution layer rewards vault to LidoExecutionLayerRewardsVault 0x388C818CA8B9251b393131C08a736A67ccB19297 11. Resume staking 12. Set staking limit rate roughly to 150,000 ETH per day To get the data in the voting script in readable format please refer to our how-to on checking Aragon votes: [https://docs.lido.fi/guides/checking-aragon-vote/](https://docs.lido.fi/guides/checking-aragon-vote/) After parsing, you will get the list of elements. And here are explanations and all links to [etherscan.io](http://etherscan.io/) for verification: ## Point #1/12. ``` Contract: 0xf5dc67e54fc96f993cd06073f71ca732c1e654b1 Function: newVersion Inputs: _newSemanticVersion: uint16[3] = [3, 0, 0] _contractAddress: address = 0x47EbaB13B806773ec2A2d16873e2dF770D130b50 _contentURI: bytes = 697066733a516d516b4a4d7476753474794a76577250584a666a4c667954576e393539696179794e6a703759714e7a58377053 ``` **Publishing new implementation (0x47EbaB13B806773ec2A2d16873e2dF770D130b50) in Lido app APM repo 0xF5Dc67E54FC96F993CD06073f71ca732C1E654B1** calls Lido app Repo’s ([0xf5dc67e54fc96f993cd06073f71ca732c1e654b1](https://etherscan.io/address/0xf5dc67e54fc96f993cd06073f71ca732c1e654b1)) [newVersion](https://etherscan.io/address/0xf5dc67e54fc96f993cd06073f71ca732c1e654b1#code#F74#L46) function to create a new version with - contract [0x47EbaB13B806773ec2A2d16873e2dF770D130b50](https://etherscan.io/address/0x47EbaB13B806773ec2A2d16873e2dF770D130b50) - and content 0x697066733a516d516b4a4d7476753474794a76577250584a666a4c667954576e393539696179794e6a703759714e7a58377053 and bumps semantic version to 3.0.0 ## Point #2/12. ``` Contract: 0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc Function: setApp Inputs: _namespace: bytes32 = f1f3eb40f5bc1ad1344716ced8b8a0431d840b5783aea1fd01786bc26f35ac0f _appId: bytes32 = 3ca7c3e38968823ccb4c78ea688df41356f182ae1d159e4ee608d30d68cef320 _app: address = 0x47EbaB13B806773ec2A2d16873e2dF770D130b50 ``` **Updating implementation of Lido app with the new one 0x47EbaB13B806773ec2A2d16873e2dF770D130b50** calls Lido DAO contract‘s ([0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc](https://etherscan.io/address/0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc)) [setApp](https://etherscan.io/address/0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc#code#L1244) function to set the address [0x47EbaB13B806773ec2A2d16873e2dF770D130b50](https://etherscan.io/address/0x47EbaB13B806773ec2A2d16873e2dF770D130b50) as implementation for Lido's proxy contract. How to check `_namespace` and `_appId` parameters: Go to [Lido DAO contract -> Read as Proxy](https://etherscan.io/address/0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc#readProxyContract) -> function #11 `getApp` and use parameters as in the Vote's point 2: ``` _namespace: 0xf1f3eb40f5bc1ad1344716ced8b8a0431d840b5783aea1fd01786bc26f35ac0f _appId: 0x3ca7c3e38968823ccb4c78ea688df41356f182ae1d159e4ee608d30d68cef320 ``` you should get address of the current implementation: [0xC7B5aF82B05Eb3b64F12241B04B2cF14469E39F7](https://etherscan.io/address/0xC7B5aF82B05Eb3b64F12241B04B2cF14469E39F7) All the addresses, current and proposed, are published [here](https://docs.lido.fi/deployed-contracts/). ## Point #3/12. ``` Contract: 0x0d97e876ad14db2b183cfeeb8aa1a5c788eb1831 Function: newVersion Inputs: _newSemanticVersion: uint16[3] = [3, 0, 0] _contractAddress: address = 0x5d39ABaa161e622B99D45616afC8B837E9F19a25 _contentURI: bytes = 697066733a516d61375058486d456a346a7332676a4d3976744850747176754b3832695335455950694a6d7a4b4c7a55353847 ``` **Publishing new implementation (0x5d39ABaa161e622B99D45616afC8B837E9F19a25) in Node Operators Registry app APM repo 0x0D97E876ad14DB2b183CFeEB8aa1A5C788eB1831** calls Node Operators Registry app Repo’s ([0x0D97E876ad14DB2b183CFeEB8aa1A5C788eB1831](https://etherscan.io/address/0x0d97e876ad14db2b183cfeeb8aa1a5c788eb1831)) [newVersion](https://etherscan.io/address/0x0d97e876ad14db2b183cfeeb8aa1a5c788eb1831#code#F74#L46) function to create a new version with - contract [0x5d39ABaa161e622B99D45616afC8B837E9F19a25](https://etherscan.io/address/0x5d39ABaa161e622B99D45616afC8B837E9F19a25) - and content  697066733a516d61375058486d456a346a7332676a4d3976744850747176754b3832695335455950694a6d7a4b4c7a55353847 and bumps semantic version to 3.0.0 ## Point #4/12. ``` Contract: 0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc Function: setApp Inputs: _namespace: bytes32 = f1f3eb40f5bc1ad1344716ced8b8a0431d840b5783aea1fd01786bc26f35ac0f _appId: bytes32 = 7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d _app: address = 0x5d39ABaa161e622B99D45616afC8B837E9F19a25 ``` **Updating implementation of Node Operators Registry app with the new one 0x5d39ABaa161e622B99D45616afC8B837E9F19a25** calls Lido DAO contract‘s ([0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc](https://etherscan.io/address/0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc)) [setApp](https://etherscan.io/address/0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc#code#L1244) function to set the address [0x5d39ABaa161e622B99D45616afC8B837E9F19a25](https://etherscan.io/address/0x5d39ABaa161e622B99D45616afC8B837E9F19a25) as implementation for Node Operators registry contract. How to check `_namespace` and `_appId` parameters: Go to [Lido DAO contract -> Read as Proxy](https://etherscan.io/address/0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc#readProxyContract) -> function #11 `getApp` and use parameters as in the Vote's point 4: ``` _namespace: 0xf1f3eb40f5bc1ad1344716ced8b8a0431d840b5783aea1fd01786bc26f35ac0f _appId: 0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d ``` you should get address of the current implementation: [0xec3567ae258639a0FF5A02F7eAF4E4aE4416C5fe](https://etherscan.io/address/0xec3567ae258639a0FF5A02F7eAF4E4aE4416C5fe) All the addresses, current and proposed, are published [here](https://docs.lido.fi/deployed-contracts/). ## Point #5/12. ``` Contract: 0xf9339de629973c60c4d2b76749c81e6f40960e3a Function: newVersion Inputs: _newSemanticVersion: uint16[3] = [3, 0, 0] _contractAddress: address = 0x1430194905301504e8830ce4B0b0df7187E84AbD _contentURI: bytes = 697066733a516d554d506669454b71354d786d387932475951504c756a47614a69577a31747665703557374564414767435238 ``` **Publishing new implementation (0x1430194905301504e8830ce4B0b0df7187E84AbD) in Oracle app APM repo 0xF9339DE629973c60c4d2b76749c81E6F40960E3A** calls Lido Oracle Repo‘s ([0xf9339de629973c60c4d2b76749c81e6f40960e3a](https://etherscan.io/address/0xf9339de629973c60c4d2b76749c81e6f40960e3a)) [newVersion](https://etherscan.io/address/0xF9339DE629973c60c4d2b76749c81E6F40960E3A#code#F74#L46) function to create a new version with - contract [0x1430194905301504e8830ce4B0b0df7187E84AbD](https://etherscan.io/address/0x1430194905301504e8830ce4B0b0df7187E84AbD) - and content  697066733a516d554d506669454b71354d786d387932475951504c756a47614a69577a31747665703557374564414767435238 and bumps semantic version to 3.0.0 ## Point #6/12. ``` Contract: 0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc Function: setApp Inputs: _namespace: bytes32 = f1f3eb40f5bc1ad1344716ced8b8a0431d840b5783aea1fd01786bc26f35ac0f _appId: bytes32 = 8b47ba2a8454ec799cd91646e7ec47168e91fd139b23f017455f3e5898aaba93 _app: address = 0x1430194905301504e8830ce4B0b0df7187E84AbD ``` **Updating implementation of Oracle app with new one 0x1430194905301504e8830ce4B0b0df7187E84AbD** calls Lido DAO contract‘s ([0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc](https://etherscan.io/address/0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc)) [setApp](https://etherscan.io/address/0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc#code#L1244) function to set the address [0x1430194905301504e8830ce4B0b0df7187E84AbD](https://etherscan.io/address/0x1430194905301504e8830ce4B0b0df7187E84AbD) as implementation for Oracle contract. How to check `_namespace` and `_appId` parameters: Go to [Lido DAO contract -> Read as Proxy](https://etherscan.io/address/0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc#readProxyContract) -> function #11 `getApp` and use parameters as in the Vote's point 6: ``` _namespace: 0xf1f3eb40f5bc1ad1344716ced8b8a0431d840b5783aea1fd01786bc26f35ac0f _appId: 0x8b47ba2a8454ec799cd91646e7ec47168e91fd139b23f017455f3e5898aaba93 ``` you should get address of the current implementation: [0xADa6E33aa65590934870bFD204Fe8efe9c6Aa4bC](https://etherscan.io/address/0xADa6E33aa65590934870bFD204Fe8efe9c6Aa4bC) All the addresses, current and proposed, are published [here](https://docs.lido.fi/deployed-contracts/). ## Point #7/12. ``` Raw script: Contract address: 0x442af784a788a5bd6f42a01ebe9f287a871243fb Function signature: 0x6d395b7e Call data length: 4 Call data: 0x ``` **Call Oracle's finalizeUpgrade_v3() to update internal version counter** calls Oracle's [(0x442af784A788A5bd6F42A01Ebe9F287a871243fb)](https://etherscan.io/address/0x442af784a788a5bd6f42a01ebe9f287a871243fb) finalizeUpgrade_v3 function. [finalizeUpgrade_v3](https://etherscan.io/address/0x1430194905301504e8830ce4B0b0df7187E84AbD#code#F1#L417) is a new function in a new [implementation](https://etherscan.io/address/0x1430194905301504e8830ce4B0b0df7187E84AbD). To check Function signature: 1. Go to https://abi.hashex.org/ 2. Below the title `"Or enter your parameters manually"` you should choose `"your function"` function type 3. Then enter `finalizeUpgrade_v3` as a function name. You should get: `6d395b7e` As you can see, it matches with the function signature from evmscript parser. ## Point #8/12. ``` Contract: 0x9895f0f17cc1d1891b6f18ee0b483b6f221b37bb Function: createPermission Inputs: _entity: address = 0x2e59A20f205bB85a89C53f1936454680651E618e _app: address = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84 _role: bytes32 = 9d68ad53a92b6f44b2e8fb18d211bf8ccb1114f6fafd56aa364515dfdf23c44f _manager: address = 0x2e59A20f205bB85a89C53f1936454680651E618e ``` **Create permission for SET_EL_REWARDS_VAULT_ROLE of Lido app assigning it to Voting 0x2e59A20f205bB85a89C53f1936454680651E618e** calls Aragon ACL‘s ([0x9895f0f17cc1d1891b6f18ee0b483b6f221b37bb](https://etherscan.io/address/0x9895f0f17cc1d1891b6f18ee0b483b6f221b37bb)) [createPermission](https://etherscan.io/address/0x9f3b9198911054b122fdb865f8a5ac516201c339#code#L879) function with parameters: _entity is [Aragon Voting contract](0x2e59A20f205bB85a89C53f1936454680651E618e) _app is [Lido contract](https://etherscan.io/address/0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84) _role is `keccak256('SET_EL_REWARDS_VAULT_ROLE') = 9d68ad53a92b6f44b2e8fb18d211bf8ccb1114f6fafd56aa364515dfdf23c44f` _manager is [Aragon Voting contract](0x2e59A20f205bB85a89C53f1936454680651E618e) ## Point #9/12. ``` Contract: 0x9895f0f17cc1d1891b6f18ee0b483b6f221b37bb Function: createPermission Inputs: _entity: address = 0x2e59A20f205bB85a89C53f1936454680651E618e _app: address = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84 _role: bytes32 = a42eee1333c0758ba72be38e728b6dadb32ea767de5b4ddbaea1dae85b1b051f _manager: address = 0x2e59A20f205bB85a89C53f1936454680651E618e ``` **Create permission for STAKING_CONTROL_ROLE of Lido app assigning it to Voting 0x2e59A20f205bB85a89C53f1936454680651E618e** calls Aragon ACL‘s ([0x9895f0f17cc1d1891b6f18ee0b483b6f221b37bb](https://etherscan.io/address/0x9895f0f17cc1d1891b6f18ee0b483b6f221b37bb)) [createPermission](https://etherscan.io/address/0x9f3b9198911054b122fdb865f8a5ac516201c339#code#L879) function with parameters: _entity is [Aragon Voting contract](0x2e59A20f205bB85a89C53f1936454680651E618e) _app is [Lido contract](https://etherscan.io/address/0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84) _role is `keccak256('STAKING_CONTROL_ROLE') = a42eee1333c0758ba72be38e728b6dadb32ea767de5b4ddbaea1dae85b1b051f` _manager is [Aragon Voting contract](0x2e59A20f205bB85a89C53f1936454680651E618e) ## Point #10/12. ``` Raw script: Contract address: 0xae7ab96520de3a18e5e111b5eaab095312d7fe84 Function signature: 0x7e4193c6 Call data length: 36 Call data: 0x000000000000000000000000388c818ca8b9251b393131c08a736a67ccb19297 ``` **Set execution layer rewards vault to LidoExecutionLayerRewardsVault 0x388C818CA8B9251b393131C08a736A67ccB19297** calls Lido's [0xae7ab96520de3a18e5e111b5eaab095312d7fe84](https://etherscan.io/address/0xae7ab96520de3a18e5e111b5eaab095312d7fe84) setELRewardsVault function. [setELRewardsVault](https://etherscan.io/address/0x47EbaB13B806773ec2A2d16873e2dF770D130b50#code#F1#L442) is a new function in a new [implementation](https://etherscan.io/address/0x47EbaB13B806773ec2A2d16873e2dF770D130b50) that sets the address of LidoExecutionLayerRewardsVault contract. LidoExecutionLayerRewardsVault proposed implementation: [0x388C818CA8B9251b393131C08a736A67ccB19297](https://etherscan.io/address/0x388C818CA8B9251b393131C08a736A67ccB19297) To check Function signature and call data: 1. Go to https://abi.hashex.org/ 2. Below the title `"Or enter your parameters manually"` you should choose `"your function"` function type 3. Then enter `setELRewardsVault` as a function name. 4. Press Add argument, choose `address` in the dropdown list and type in `0x388C818CA8B9251b393131C08a736A67ccB19297` for a value You should get: `7e4193c6000000000000000000000000388c818ca8b9251b393131c08a736a67ccb19297` As you can see, the first 4 bytes `0x7e4193c6` match with the function signature from evmscript parser and the rest `000000000000000000000000388c818ca8b9251b393131c08a736a67ccb19297` matches with the calldata. ## Point #11/12. ``` Raw script: Contract address: 0xae7ab96520de3a18e5e111b5eaab095312d7fe84 Function signature: 0x7475f913 Call data length: 4 Call data: 0x ``` **Resume staking** calls Lido's [0xae7ab96520de3a18e5e111b5eaab095312d7fe84](https://etherscan.io/address/0xae7ab96520de3a18e5e111b5eaab095312d7fe84) resumeStaking function. [resumeStaking](https://etherscan.io/address/0x47EbaB13B806773ec2A2d16873e2dF770D130b50#code#F1#L166) is a new function in a new [implementation](https://etherscan.io/address/0x47EbaB13B806773ec2A2d16873e2dF770D130b50) that preserves staking limit if it was set previously. To check Function signature and call data: 1. Go to https://abi.hashex.org/ 2. Below the title `"Or enter your parameters manually"` you should choose `"your function"` function type 3. Then enter `resumeStaking` as a function name. You should get: `7475f913` As you can see, it matches with the function signature from evmscript parser. ## Point #12/12. ``` Raw script: Contract address: 0xae7ab96520de3a18e5e111b5eaab095312d7fe84 Function signature: 0x2cb5f784 Call data length: 68 Call data: 0x000000000000000000000000000000000000000000001fc3842bd1f071c000000000000000000000000000000000000000000000000000014542ba12a337c000 ``` **Set staking limit rate to 150,000 ETH per day** calls Lido's [0xae7ab96520de3a18e5e111b5eaab095312d7fe84](https://etherscan.io/address/0xae7ab96520de3a18e5e111b5eaab095312d7fe84) setStakingLimit function. [setStakingLimit](https://etherscan.io/address/0x47EbaB13B806773ec2A2d16873e2dF770D130b50#code#F1#L194) is a new function in a new [implementation](https://etherscan.io/address/0x47EbaB13B806773ec2A2d16873e2dF770D130b50) that Sets the staking rate limit. Params: ``` _maxStakeLimit = 150_000 * 10**18 _stakeLimitIncreasePerBlock = 150_000 * 10**18 * 13.5 // (24 * 60 * 60) # 13.5s per block as a rough average ``` To check Function signature and call data: 1. Go to https://abi.hashex.org/ 2. Below the title `"Or enter your parameters manually"` you should choose `"your function"` function type 3. Then enter `setStakingLimit` as a function name. 4. Press Add argument, choose `uint256` in the dropdown list and type in `150000000000000000000000` for a value (it's `150_000 * 10**18`) 5. Press Add argument, choose `uint256` in the dropdown list and type in `23437500000000000000` for a value (it's `150_000 * 10**18 * 13.5 // (24 * 60 * 60)`) You should get: `2cb5f784000000000000000000000000000000000000000000001fc3842bd1f071c000000000000000000000000000000000000000000000000000014542ba12a337c000` As you can see, the first 4 bytes `0x2cb5f784` match with the function signature from evmscript parser and the rest `000000000000000000000000000000000000000000001fc3842bd1f071c000000000000000000000000000000000000000000000000000014542ba12a337c000` matches with the calldata.