Try   HackMD

24.05.22 How to check the vote for Merge-ready protocol upgrade (round 1)

The 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/

After parsing, you will get the list of elements. And here are explanations and all links to 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)
newVersion function to create a new version with

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)
setApp function to set the address 0x47EbaB13B806773ec2A2d16873e2dF770D130b50 as implementation for Lido's proxy contract.

How to check _namespace and _appId parameters:
Go to Lido DAO contract -> Read as Proxy -> 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

All the addresses, current and proposed, are published here.

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)
newVersion function to create a new version with

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)
setApp function to set the address 0x5d39ABaa161e622B99D45616afC8B837E9F19a25 as implementation for Node Operators registry contract.

How to check _namespace and _appId parameters:
Go to Lido DAO contract -> Read as Proxy -> 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

All the addresses, current and proposed, are published here.

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)
newVersion function to create a new version with

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)
setApp function to set the address 0x1430194905301504e8830ce4B0b0df7187E84AbD as implementation for Oracle contract.

How to check _namespace and _appId parameters:
Go to Lido DAO contract -> Read as Proxy -> 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

All the addresses, current and proposed, are published here.

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) finalizeUpgrade_v3 function.
finalizeUpgrade_v3 is a new function in a new implementation.

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)
createPermission function with parameters:
_entity is Aragon Voting contract
_app is Lido contract
_role is keccak256('SET_EL_REWARDS_VAULT_ROLE') = 9d68ad53a92b6f44b2e8fb18d211bf8ccb1114f6fafd56aa364515dfdf23c44f
_manager is Aragon Voting contract

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)
createPermission function with parameters:
_entity is Aragon Voting contract
_app is Lido contract
_role is keccak256('STAKING_CONTROL_ROLE') = a42eee1333c0758ba72be38e728b6dadb32ea767de5b4ddbaea1dae85b1b051f
_manager is Aragon Voting contract

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
setELRewardsVault function.
setELRewardsVault is a new function in a new implementation that sets the address of LidoExecutionLayerRewardsVault contract.
LidoExecutionLayerRewardsVault proposed implementation: 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 resumeStaking function.
resumeStaking is a new function in a new implementation 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 setStakingLimit function.
setStakingLimit is a new function in a new implementation 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.