Skip to content

Commit 7fa669e

Browse files
committed
review fixes
1 parent f4340ed commit 7fa669e

File tree

9 files changed

+92
-77
lines changed

9 files changed

+92
-77
lines changed

src/blockchain/contracts/deposit_security_module.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ def get_max_deposits(self, block_identifier: BlockIdentifier = 'latest'):
140140
})
141141
return response
142142

143+
def version(self, block_identifier: BlockIdentifier = 'latest'):
144+
return 1
145+
143146

144147
class DepositSecurityModuleContractV2(DepositSecurityModuleContract):
145148
abi_path = './interfaces/DepositSecurityModuleV2.json'
@@ -217,3 +220,12 @@ def get_is_deposits_paused(self, block_identifier: BlockIdentifier = 'latest'):
217220
'block_identifier': block_identifier.__repr__(),
218221
})
219222
return response
223+
224+
def version(self, block_identifier: BlockIdentifier = 'latest'):
225+
response = self.functions.VERSION().call(block_identifier=block_identifier)
226+
logger.info({
227+
'msg': f'Call `VERSION()`.',
228+
'value': response,
229+
'block_identifier': block_identifier.__repr__(),
230+
})
231+
return response

src/blockchain/web3_extentions/lido_contracts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def _load_contracts(self):
5858
))
5959

6060
try:
61-
self.deposit_security_module.functions.VERSION().call()
61+
self.deposit_security_module.version()
6262
except ContractLogicError:
6363
logger.info({'msg': 'Use deposit security module V1.'})
6464
self.deposit_security_module = cast(DepositSecurityModuleContract, self.w3.eth.contract(

src/bots/depositor.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from collections import defaultdict
33
from typing import Optional, Callable
44

5+
from eth_account import Account
56
from eth_typing import Hash32
67
from schema import Or, Schema
78
from web3.types import BlockData
@@ -10,7 +11,9 @@
1011
from blockchain.deposit_strategy.curated_module import CuratedModuleDepositStrategy
1112
from blockchain.deposit_strategy.interface import ModuleDepositStrategyInterface
1213
from blockchain.deposit_strategy.prefered_module_to_deposit import get_preferred_to_deposit_modules
14+
from blockchain.executor import Executor
1315
from blockchain.typings import Web3
16+
from blockchain.web3_extentions.bundle import activate_relay
1417
from cryptography.verify_signature import compute_vs
1518
from metrics.metrics import (
1619
ACCOUNT_BALANCE,
@@ -29,6 +32,27 @@
2932
logger = logging.getLogger(__name__)
3033

3134

35+
def run_depositor(w3):
36+
if variables.AUCTION_BUNDLER_PRIVATE_KEY and variables.AUCTION_BUNDLER_URIS:
37+
logger.info({'msg': 'Add private relays.'})
38+
activate_relay(w3, Account.from_key(variables.AUCTION_BUNDLER_PRIVATE_KEY), variables.AUCTION_BUNDLER_URIS)
39+
else:
40+
logger.info({'msg': 'No flashbots available for this network.'})
41+
42+
logger.info({'msg': 'Initialize Depositor bot.'})
43+
depositor_bot = DepositorBot(w3)
44+
45+
e = Executor(
46+
w3,
47+
depositor_bot.execute,
48+
5,
49+
variables.MAX_CYCLE_LIFETIME_IN_SECONDS,
50+
)
51+
logger.info({'msg': 'Execute depositor as daemon.'})
52+
e.execute_as_daemon()
53+
54+
55+
3256
class ModuleNotSupportedError(Exception):
3357
pass
3458

src/bots/pauser.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from web3.types import BlockData
66

77
import variables
8+
from blockchain.executor import Executor
89
from blockchain.typings import Web3
910
from cryptography.verify_signature import compute_vs
1011
from metrics.metrics import UNEXPECTED_EXCEPTIONS
@@ -20,6 +21,19 @@
2021
logger = logging.getLogger(__name__)
2122

2223

24+
def run_pauser(w3: Web3):
25+
pause = PauserBot(w3)
26+
e = Executor(
27+
w3,
28+
pause.execute,
29+
1,
30+
variables.MAX_CYCLE_LIFETIME_IN_SECONDS,
31+
)
32+
logger.info({'msg': 'Execute pauser as daemon.'})
33+
e.execute_as_daemon()
34+
35+
36+
2337
class PauserBot:
2438
def __init__(self, w3: Web3):
2539
self.w3 = w3

src/bots/unvetter.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from web3.types import BlockData
66

77
import variables
8+
from blockchain.executor import Executor
89
from blockchain.typings import Web3
910
from cryptography.verify_signature import compute_vs
1011
from metrics.metrics import UNEXPECTED_EXCEPTIONS
@@ -20,18 +21,29 @@
2021
logger = logging.getLogger(__name__)
2122

2223

23-
class UnvetterBot:
24+
def run_unvetter(w3: Web3):
25+
unvetter = UnvetterBot(w3)
26+
e = Executor(
27+
w3,
28+
unvetter.execute,
29+
1,
30+
variables.MAX_CYCLE_LIFETIME_IN_SECONDS,
31+
)
32+
logger.info({'msg': 'Execute unvetter as daemon.'})
33+
e.execute_as_daemon()
34+
2435

25-
fully_initialized = False
36+
37+
class UnvetterBot:
38+
message_storage: MessageStorage
2639

2740
def __init__(self, w3: Web3):
2841
self.w3 = w3
2942

30-
if self.w3.lido.deposit_security_module.__class__.__name__ == 'DepositSecurityModuleContractV2':
31-
self.finalize_init()
32-
fully_initialized = True
43+
def prepare_transport_bus(self):
44+
if self.message_storage:
45+
return
3346

34-
def finalize_init(self):
3547
transports = []
3648

3749
if TransportType.RABBIT in variables.MESSAGE_TRANSPORTS:
@@ -62,12 +74,11 @@ def finalize_init(self):
6274
)
6375

6476
def execute(self, block: BlockData) -> bool:
65-
if not self.fully_initialized:
66-
if self.w3.lido.deposit_security_module.__class__.__name__ == 'DepositSecurityModuleContractV2':
67-
self.finalize_init()
68-
self.fully_initialized = True
69-
else:
70-
return True
77+
if self.w3.lido.deposit_security_module.version() == 1:
78+
logger.warning({'msg': 'DSM version is not supported.'})
79+
return True
80+
else:
81+
self.prepare_transport_bus()
7182

7283
messages = self.receive_unvet_messages()
7384
logger.info({'msg': f'Received {len(messages)} unvet messages.'})
@@ -108,8 +119,7 @@ def _send_unvet_message(self, message: UnvetMessage) -> bool:
108119

109120
actual_nonce = self.w3.lido.staking_router.get_staking_module_nonce(module_id)
110121

111-
if message['nonce'] < actual_nonce:
112-
self._clear_outdated_messages_for_module(module_id, actual_nonce)
122+
self._clear_outdated_messages_for_module(module_id, actual_nonce)
113123

114124
unvet_tx = self.w3.lido.deposit_security_module.unvet_signing_keys(
115125
message['blockNumber'],

src/depositor.py

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,9 @@
1-
from eth_account import Account
2-
3-
import variables
4-
from blockchain.executor import Executor
5-
from blockchain.web3_extentions.bundle import activate_relay
6-
from bots.depositor import DepositorBot
1+
from main import main
72
from metrics.logging import logging
83

94

105
logger = logging.getLogger(__name__)
116

127

13-
def run_depositor(w3):
14-
if variables.AUCTION_BUNDLER_PRIVATE_KEY and variables.AUCTION_BUNDLER_URIS:
15-
logger.info({'msg': 'Add private relays.'})
16-
activate_relay(w3, Account.from_key(variables.AUCTION_BUNDLER_PRIVATE_KEY), variables.AUCTION_BUNDLER_URIS)
17-
else:
18-
logger.info({'msg': 'No flashbots available for this network.'})
19-
20-
logger.info({'msg': 'Initialize Depositor bot.'})
21-
depositor_bot = DepositorBot(w3)
22-
23-
e = Executor(
24-
w3,
25-
depositor_bot.execute,
26-
5,
27-
variables.MAX_CYCLE_LIFETIME_IN_SECONDS,
28-
)
29-
logger.info({'msg': 'Execute depositor as daemon.'})
30-
e.execute_as_daemon()
8+
if __name__ == '__main__':
9+
main('depositor')

src/main.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
from blockchain.web3_extentions.lido_contracts import LidoContracts
1010
from blockchain.web3_extentions.requests_metric_middleware import add_requests_metric_middleware
1111
from blockchain.web3_extentions.transaction import TransactionUtils
12-
from depositor import run_depositor
12+
from bots.depositor import run_depositor
13+
from bots.pauser import run_pauser
14+
from bots.unvetter import run_unvetter
1315
from metrics.healthcheck_pulse import start_pulse_server
1416
from metrics.logging import logging
1517
from metrics.metrics import BUILD_INFO
16-
from pauser import run_pauser
17-
from unvetter import run_unvetter
1818

1919

2020
logger = logging.getLogger(__name__)
@@ -26,9 +26,7 @@ class BotModule(StrEnum):
2626
UNVETTER = 'unvetter'
2727

2828

29-
if __name__ == '__main__':
30-
bot_name = sys.argv[-1]
31-
29+
def main(bot_name: str):
3230
if bot_name not in iter(BotModule):
3331
msg = f'Last arg should be one of {[str(item) for item in BotModule]}, received {BotModule}.'
3432
logger.error({'msg': msg})
@@ -74,3 +72,7 @@ class BotModule(StrEnum):
7472
run_pauser(w3)
7573
elif bot_name == BotModule.UNVETTER:
7674
run_unvetter(w3)
75+
76+
77+
if __name__ == '__main__':
78+
main(sys.argv[-1])

src/pauser.py

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,9 @@
1-
from web3 import Web3
2-
3-
import variables
4-
from blockchain.executor import Executor
5-
from bots.pauser import PauserBot
1+
from main import main
62
from metrics.logging import logging
73

84

95
logger = logging.getLogger(__name__)
106

117

12-
def run_pauser(w3: Web3):
13-
pause = PauserBot(w3)
14-
e = Executor(
15-
w3,
16-
pause.execute,
17-
1,
18-
variables.MAX_CYCLE_LIFETIME_IN_SECONDS,
19-
)
20-
logger.info({'msg': 'Execute pauser as daemon.'})
21-
e.execute_as_daemon()
8+
if __name__ == '__main__':
9+
main('pauser')

src/unvetter.py

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,9 @@
1-
import time
2-
3-
import variables
4-
from blockchain.executor import Executor
5-
from blockchain.typings import Web3
6-
from bots.unvetter import UnvetterBot
7-
from metrics.healthcheck_pulse import pulse
1+
from main import main
82
from metrics.logging import logging
93

104

115
logger = logging.getLogger(__name__)
126

137

14-
def run_unvetter(w3: Web3):
15-
unvetter = UnvetterBot(w3)
16-
e = Executor(
17-
w3,
18-
unvetter.execute,
19-
1,
20-
variables.MAX_CYCLE_LIFETIME_IN_SECONDS,
21-
)
22-
logger.info({'msg': 'Execute unvetter as daemon.'})
23-
e.execute_as_daemon()
8+
if __name__ == '__main__':
9+
main('unvetter')

0 commit comments

Comments
 (0)