diff --git a/src/common/register_validators.py b/src/common/register_validators.py index 546edb38..84f861ab 100644 --- a/src/common/register_validators.py +++ b/src/common/register_validators.py @@ -4,10 +4,12 @@ from multiproof import MultiProof from sw_utils.typings import Bytes32 from web3 import Web3 +from web3.exceptions import ContractLogicError from src.common.clients import execution_client from src.common.contracts import ( deposit_data_registry_contract, + get_gno_vault_contract, multicall_contract, vault_contract, vault_v1_contract, @@ -91,30 +93,49 @@ async def register_validators( async def _get_update_state_calls( harvest_params: HarvestParams, ) -> list[tuple[ChecksumAddress, HexStr]]: - calls = [] - if settings.network in GNO_NETWORKS: - # TODO: add swap xDAI to GNO to calls if it passes static call - pass - - calls.append( - ( - vault_contract.address, - vault_contract.encode_abi( - fn_name='updateState', - args=[ - ( - harvest_params.rewards_root, - harvest_params.reward, - harvest_params.unlocked_mev_reward, - harvest_params.proof, - ) - ], - ), - ) + update_state_call = ( + vault_contract.address, + vault_contract.encode_abi( + fn_name='updateState', + args=[ + ( + harvest_params.rewards_root, + harvest_params.reward, + harvest_params.unlocked_mev_reward, + harvest_params.proof, + ) + ], + ), ) + calls = [update_state_call] + + if settings.network in GNO_NETWORKS: + gno_vault_contract = get_gno_vault_contract() + + if _check_swap_xdai(harvest_params): + calls.append( + ( + gno_vault_contract.address, + gno_vault_contract.encode_abi(fn_name='swapXdaiToGno', args=[]), + ) + ) + else: + logger.warning('Swap xdai failed. Falling back to eth flow.') + return calls +async def _check_swap_xdai(harvest_params: HarvestParams) -> bool: + gno_vault_contract = get_gno_vault_contract() + update_state_calls = gno_vault_contract.get_update_state_calls(harvest_params) + + try: + await gno_vault_contract.functions.multicall(update_state_calls).call() + except (ValueError, ContractLogicError): + return False + return True + + def _get_single_validator_registration_call( vault_version: int, keeper_approval_params: tuple,