Skip to content

Commit

Permalink
feat: tw deploy
Browse files Browse the repository at this point in the history
  • Loading branch information
eddort committed Feb 13, 2025
1 parent 0ab33d2 commit 7207bf4
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 26 deletions.
2 changes: 1 addition & 1 deletion interfaces/WithdrawalVault.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"inputs":[{"internalType":"contract ILido","name":"_lido","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidContractVersionIncrement","type":"error"},{"inputs":[],"name":"LidoZeroAddress","type":"error"},{"inputs":[],"name":"NonZeroContractVersionOnInit","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"NotEnoughEther","type":"error"},{"inputs":[],"name":"NotLido","type":"error"},{"inputs":[],"name":"TreasuryZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedContractVersion","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721Recovered","type":"event"},{"inputs":[],"name":"LIDO","outputs":[{"internalType":"contract ILido","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"}]
[{"inputs":[{"internalType":"address","name":"_lido","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"providedTotalFee","type":"uint256"},{"internalType":"uint256","name":"requiredTotalFee","type":"uint256"},{"internalType":"uint256","name":"requestCount","type":"uint256"}],"name":"InsufficientTriggerableWithdrawalFee","type":"error"},{"inputs":[{"internalType":"uint256","name":"feePerRequest","type":"uint256"},{"internalType":"uint256","name":"minFeePerRequest","type":"uint256"}],"name":"InsufficientWithdrawalFee","type":"error"},{"inputs":[],"name":"InvalidContractVersionIncrement","type":"error"},{"inputs":[],"name":"MalformedPubkeysArray","type":"error"},{"inputs":[],"name":"NoWithdrawalRequests","type":"error"},{"inputs":[],"name":"NonZeroContractVersionOnInit","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"NotEnoughEther","type":"error"},{"inputs":[],"name":"NotLido","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawalFee","type":"uint256"}],"name":"TotalWithdrawalFeeExceededBalance","type":"error"},{"inputs":[],"name":"TriggerableWithdrawalRefundFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedContractVersion","type":"error"},{"inputs":[],"name":"WithdrawalFeeInvalidData","type":"error"},{"inputs":[],"name":"WithdrawalFeeReadFailed","type":"error"},{"inputs":[{"internalType":"bytes","name":"callData","type":"bytes"}],"name":"WithdrawalRequestAdditionFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ADD_FULL_WITHDRAWAL_REQUEST_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIDO","outputs":[{"internalType":"contract ILido","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"pubkeys","type":"bytes"}],"name":"addFullWithdrawalRequests","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"finalizeUpgrade_v2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawalRequestFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"}]
101 changes: 76 additions & 25 deletions scripts/triggerable_withdrawals/vote_body.py
Original file line number Diff line number Diff line change
@@ -1,32 +1,41 @@
try:
from brownie import interface, accounts, TransactionReceipt
except ImportError:
print("You're probably running inside Brownie console. Please call:")
print("set_console_globals(interface=interface)")


from typing import Dict, Tuple, Optional
from utils.config import contracts
from utils.config import contracts, VALIDATORS_EXIT_BUS_ORACLE_IMPL, WITHDRAWAL_VAULT_IMPL
from utils.ipfs import upload_vote_ipfs_description, calculate_vote_ipfs_description
from utils.permissions import encode_oz_grant_role
from utils.permissions import encode_oz_grant_role, encode_oz_revoke_role
from utils.voting import bake_vote_items, confirm_vote_script, create_vote

from utils.agent import agent_forward

from scripts.triggerable_withdrawals import variables

try:
from brownie import interface
except ImportError as e:
print(f"ImportError: {e}")
print("You're probably running inside Brownie console. Please call:")
print("set_console_globals(interface=interface)")


def encode_proxy_upgrade_to(proxy: interface.Contract, implementation: str) -> Tuple[str, str]:
def encode_proxy_upgrade_to(proxy: any, implementation: str) -> Tuple[str, str]:
proxy = interface.OssifiableProxy(proxy)
return proxy.address, proxy.proxy__upgradeTo.encode_input(implementation)

def encode_wv_proxy_upgrade_to(proxy: any, implementation: str) -> Tuple[str, str]:
proxy = interface.WithdrawalContractProxy(proxy)
if (proxy.proxy_getAdmin() != contracts.voting.address):
raise Exception('withdrawal_contract is not in a valid state')

return proxy.address, proxy.proxy_upgradeTo.encode_input(implementation, b'')

def encode_oracle_upgrade_consensus(proxy: interface.Contract, consensus_version: int) -> Tuple[str, str]:

def encode_oracle_upgrade_consensus(proxy: any, consensus_version: int) -> Tuple[str, str]:
oracle = interface.BaseOracle(proxy)
return oracle.address, oracle.setConsensusVersion.encode_input(consensus_version)


def create_tw_vote(tx_params: Dict[str, str], silent: bool) -> Tuple[int, Optional[TransactionReceipt]]:
def create_tw_vote(tx_params: Dict[str, str], silent: bool) -> Tuple[int, Optional[any]]:
"""
Triggerable withdrawals voting baking and sending.
Expand All @@ -44,43 +53,85 @@ def create_tw_vote(tx_params: Dict[str, str], silent: bool) -> Tuple[int, Option
(
"1. Update VEBO implementation",
agent_forward([
encode_proxy_upgrade_to(contracts.validator_exit_bus_oracle, contracts.VALIDATORS_EXIT_BUS_ORACLE_IMPL)
encode_proxy_upgrade_to(contracts.validators_exit_bus_oracle, VALIDATORS_EXIT_BUS_ORACLE_IMPL)
])
),
(
"2. Grant VEBO MANAGE_CONSENSUS_VERSION_ROLE to the ${AGENT}",
agent_forward([
encode_oz_grant_role(
contract=contracts.validators_exit_bus_oracle,
role_name="MANAGE_CONSENSUS_VERSION_ROLE",
grant_to=contracts.agent,
)
])
),
(
"2. Update VEBO consensu version to `4`",
"3. Update VEBO consensus version to `4`",
agent_forward([
encode_oracle_upgrade_consensus(contracts.validator_exit_bus_oracle, variables.VEBO_CONSENSUS_VERSION)
encode_oracle_upgrade_consensus(contracts.validators_exit_bus_oracle, 6)
])
),
# (
# "3. Call finalize upgrade on VEBO",
# agent_forward([
# TODO
# ])
# ),
(
"4. Update WithdrawalVault implementation",
"4. Revoke VEBO MANAGE_CONSENSUS_VERSION_ROLE from ${AGENT}",
agent_forward([
encode_proxy_upgrade_to(contracts.withdrawal_vault, contracts.WITHDRAWAL_VAULT_IMPL)
encode_oz_revoke_role(
contract=contracts.validators_exit_bus_oracle,
role_name="MANAGE_CONSENSUS_VERSION_ROLE",
revoke_from=contracts.agent,
)
])
),
(
"5. Grant ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the VEBO in WithdrawalVault",
"5. Update WithdrawalVault implementation",
encode_wv_proxy_upgrade_to(contracts.withdrawal_vault, WITHDRAWAL_VAULT_IMPL)

),
(
"6. Initialize new WV implementation",
(
contracts.withdrawal_vault.address,
contracts.withdrawal_vault.initialize.encode_input(
contracts.agent,
),
)
),
(
"7. Grant ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the VEBO in WithdrawalVault",
agent_forward([
encode_oz_grant_role(
contract=contracts.WithdrawalVault,
contract=contracts.withdrawal_vault,
role_name="ADD_FULL_WITHDRAWAL_REQUEST_ROLE",
grant_to=contracts.validator_exit_bus_oracle,
grant_to=contracts.validators_exit_bus_oracle,
)
])
),
(
"8. Grant MANAGE_CONSENSUS_VERSION_ROLE to the ${AGENT}",
agent_forward([
encode_oz_grant_role(
contract=contracts.accounting_oracle,
role_name="MANAGE_CONSENSUS_VERSION_ROLE",
grant_to=contracts.agent,
)
])
),
(
"6. Update AO consensus version to `4`",
"9. Update AO consensus version to `4`",
agent_forward([
encode_oracle_upgrade_consensus(contracts.accounting_oracle, variables.AO_CONSENSUS_VERSION)
])
),
(
"10. Revoke MANAGE_CONSENSUS_VERSION_ROLE from ${AGENT}",
agent_forward([
encode_oz_revoke_role(
contract=contracts.accounting_oracle,
role_name="MANAGE_CONSENSUS_VERSION_ROLE",
revoke_from=contracts.agent,
)
])
),
)

vote_items = bake_vote_items(list(vote_descriptions), list(call_script_items))
Expand Down

0 comments on commit 7207bf4

Please sign in to comment.