Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Clean storage properly #213

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 19 additions & 10 deletions src/bots/depositor.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,12 @@ def _check_module_status(self, module_id: int) -> bool:

def _get_quorum(self, module_id: int) -> Optional[list[DepositMessage]]:
"""Returns quorum messages or None is quorum is not ready"""
actualize_filter = self._get_message_actualize_filter(module_id)
actualize_filter = self._get_message_actualize_filter()
messages = self.message_storage.get_messages(actualize_filter)

module_filter = self._get_module_messages_filter(module_id)
messages = list(filter(module_filter, messages))

min_signs_to_deposit = self.w3.lido.deposit_security_module.get_guardian_quorum()

CURRENT_QUORUM_SIZE.labels('required').set(min_signs_to_deposit)
Expand All @@ -161,21 +165,16 @@ def _get_quorum(self, module_id: int) -> Optional[list[DepositMessage]]:

CURRENT_QUORUM_SIZE.labels('current').set(max_quorum_size)

def _get_message_actualize_filter(self, module_id: int) -> Callable[[DepositMessage], bool]:
def _get_message_actualize_filter(self) -> Callable[[DepositMessage], bool]:
latest = self.w3.eth.get_block('latest')

deposit_root = '0x' + self.w3.lido.deposit_contract.get_deposit_root().hex()
nonce = self.w3.lido.staking_router.get_staking_module_nonce(module_id)
guardians_list = self.w3.lido.deposit_security_module.get_guardians()

def message_filter(message: DepositMessage) -> bool:
if message['guardianAddress'] not in guardians_list:
UNEXPECTED_EXCEPTIONS.labels('unexpected_guardian_address').inc()
return False

if message['stakingModuleId'] != module_id:
return False

if message['blockNumber'] < latest['number'] - 200:
return False

Expand All @@ -184,16 +183,26 @@ def message_filter(message: DepositMessage) -> bool:
# can't be verified, so skip
return True

if message['nonce'] != nonce:
return False

if message['depositRoot'] != deposit_root:
return False

return True

return message_filter

def _get_module_messages_filter(self, module_id: int) -> Callable[[DepositMessage], bool]:
nonce = self.w3.lido.staking_router.get_staking_module_nonce(module_id)

def message_filter(message: DepositMessage) -> bool:
if message['stakingModuleId'] != module_id:
return False

if message['nonce'] < nonce:
return False

return True
return message_filter

def _build_and_send_deposit_tx(self, quorum: list[DepositMessage]) -> bool:
signs = self._prepare_signs_for_deposit(quorum)

Expand Down
20 changes: 10 additions & 10 deletions tests/bots/test_depositor.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,14 @@ def setup_deposit_message(depositor_bot, block_data):

@pytest.mark.unit
def test_depositor_message_actualizer(setup_deposit_message, depositor_bot, deposit_message, block_data):
message_filter = depositor_bot._get_message_actualize_filter(1)
message_filter = depositor_bot._get_message_actualize_filter()
assert list(filter(message_filter, [deposit_message]))


@pytest.mark.unit
def test_depositor_message_actualizer_not_guardian(setup_deposit_message, depositor_bot, deposit_message, block_data):
depositor_bot.w3.lido.deposit_security_module.get_guardians = Mock(return_value=['0x13464Fe06c18848a2E2e913194D64c1970f4326a'])
message_filter = depositor_bot._get_message_actualize_filter(1)
message_filter = depositor_bot._get_message_actualize_filter()
assert not list(filter(message_filter, [deposit_message]))


Expand All @@ -139,7 +139,7 @@ def test_depositor_message_actualizer_no_selected_module(setup_deposit_message,
second = deposit_message.copy()
second['stakingModuleId'] = 2

message_filter = depositor_bot._get_message_actualize_filter(2)
message_filter = depositor_bot._get_module_messages_filter(2)
assert not list(filter(message_filter, [
deposit_message,
]))
Expand All @@ -149,7 +149,7 @@ def test_depositor_message_actualizer_no_selected_module(setup_deposit_message,
@pytest.mark.unit
def test_depositor_message_actualizer_outdated(setup_deposit_message, depositor_bot, deposit_message, block_data):
deposit_message['blockNumber'] = block_data['number'] - 250
message_filter = depositor_bot._get_message_actualize_filter(1)
message_filter = depositor_bot._get_message_actualize_filter()
assert not list(filter(message_filter, [deposit_message]))

deposit_message['blockNumber'] = block_data['number'] - 150
Expand All @@ -158,18 +158,17 @@ def test_depositor_message_actualizer_outdated(setup_deposit_message, depositor_

@pytest.mark.unit
def test_depositor_message_actualizer_nonce(setup_deposit_message, depositor_bot, deposit_message, block_data):
deposit_message['nonce'] += 10
message_filter = depositor_bot._get_message_actualize_filter(1)
assert not list(filter(message_filter, [deposit_message]))

deposit_message['blockNumber'] = block_data['number'] + 100
message_filter = depositor_bot._get_module_messages_filter(1)
assert list(filter(message_filter, [deposit_message]))

deposit_message['nonce'] -= 10
assert not list(filter(message_filter, [deposit_message]))


@pytest.mark.unit
def test_depositor_message_actualizer_root(setup_deposit_message, depositor_bot, deposit_message, block_data):
deposit_message['depositRoot'] += '0x55dcf70a7ad7fc6b1a55db6b08b86e9d80736259916fcaef98f4710f0bac687b'
message_filter = depositor_bot._get_message_actualize_filter(1)
message_filter = depositor_bot._get_message_actualize_filter()
assert not list(filter(message_filter, [deposit_message]))

deposit_message['blockNumber'] = block_data['number'] + 100
Expand Down Expand Up @@ -240,6 +239,7 @@ def test_get_quorum(depositor_bot, setup_deposit_message):
}
]

depositor_bot._get_module_messages_filter = Mock(return_value=lambda x: True)
depositor_bot.w3.lido.deposit_security_module.get_guardian_quorum = Mock(return_value=2)
depositor_bot.message_storage.get_messages = Mock(return_value=deposit_messages[:2])
assert not depositor_bot._get_quorum(1)
Expand Down
Loading