diff --git a/ct-app/core/__main__.py b/ct-app/core/__main__.py index eab0c89e..e1642a44 100644 --- a/ct-app/core/__main__.py +++ b/ct-app/core/__main__.py @@ -23,12 +23,11 @@ def main(configfile: str = None): params.from_env("SUBGRAPH_", "PG", "RABBITMQ_") params.overrides("OVERRIDE_") - - # Utils.stringArrayToGCP( - # params.gcp.bucket, - # Utils.generateFilename("", "startup", "csv"), - # [["header"], ["value"]], - # ) + Utils.stringArrayToGCP( + params.gcp.bucket, + Utils.generateFilename("", "startup", "csv"), + [["header"], ["value"]], + ) # create the core and nodes instances instance = Core() diff --git a/ct-app/core/components/baseclass.py b/ct-app/core/components/baseclass.py index 015c2ca0..75451ab5 100644 --- a/ct-app/core/components/baseclass.py +++ b/ct-app/core/components/baseclass.py @@ -9,6 +9,7 @@ class Base: """ Base class for logging and printing messages with different colors. """ + handler = logging.StreamHandler() handler.setFormatter(formatter) @@ -20,7 +21,9 @@ class Base: @property def print_prefix(self) -> str: cls = self.__class__ - raise NotImplementedError(f"print_prefix not implemented for class '{cls.__name__}'") + raise NotImplementedError( + f"print_prefix not implemented for class '{cls.__name__}'" + ) @classmethod def class_prefix(cls) -> str: diff --git a/ct-app/core/components/decorators.py b/ct-app/core/components/decorators.py index e3c131d4..1277c9c3 100644 --- a/ct-app/core/components/decorators.py +++ b/ct-app/core/components/decorators.py @@ -31,10 +31,10 @@ async def wrapper(self, *args, **kwargs): if not hasattr(self.params, "flags"): self.error("No flags available") return - + if not hasattr(self.params.flags, self.class_prefix()): raise AttributeError(f"Feature `{func.__name__}` not in config file") - + class_flags = getattr(self.params.flags, self.class_prefix()) params_raw = dir(class_flags) @@ -71,7 +71,7 @@ async def wrapper(self, *args, **kwargs): if func_name_clean not in params_clean: self.error(f"Feature `{func.__name__}` not regonized") return - + index = params_clean.index(func_name_clean) delay = getattr(class_flags, params_raw[index]) @@ -85,11 +85,10 @@ async def wrapper(self, *args, **kwargs): if delay == 0: break - + if delay is not None: await asyncio.sleep(delay) - return wrapper return decorator diff --git a/ct-app/core/components/environment_utils.py b/ct-app/core/components/environment_utils.py index b77ed43e..42bba94e 100644 --- a/ct-app/core/components/environment_utils.py +++ b/ct-app/core/components/environment_utils.py @@ -22,4 +22,4 @@ def envvarWithPrefix(cls, prefix: str, type=str) -> dict[str, Any]: key: type(v) for key, v in environ.items() if key.startswith(prefix) } - return dict(sorted(var_dict.items())) \ No newline at end of file + return dict(sorted(var_dict.items())) diff --git a/ct-app/core/components/graphql_providers.py b/ct-app/core/components/graphql_providers.py index dc2b2dbf..f6d83e50 100644 --- a/ct-app/core/components/graphql_providers.py +++ b/ct-app/core/components/graphql_providers.py @@ -58,7 +58,9 @@ async def _test_query(self, key: str, **kwargs) -> bool: # call `self._execute(self._sku_query, vars)` with a timeout try: - response = await asyncio.wait_for(self._execute(self._sku_query, vars), timeout=30) + response = await asyncio.wait_for( + self._execute(self._sku_query, vars), timeout=30 + ) except asyncio.TimeoutError: self.error("Query timeout occurred") return False @@ -81,10 +83,12 @@ async def _get(self, key: str, **kwargs) -> dict: vars.update(kwargs) try: - response = await asyncio.wait_for(self._execute(self._sku_query, vars), timeout=30) + response = await asyncio.wait_for( + self._execute(self._sku_query, vars), timeout=30 + ) except asyncio.TimeoutError: self.error("Timeout error while fetching data from subgraph.") - break + break if response is None: break @@ -136,9 +140,10 @@ async def test(self, **kwargs): if result is None: return False - + return result + class SafesProvider(GraphQLProvider): def __init__(self, url: str): super().__init__(url) @@ -175,14 +180,13 @@ def __init__(self, url: str): def print_prefix(self) -> str: return "transaction-provider" + class RewardsProvider(GraphQLProvider): def __init__(self, url: str): super().__init__(url) self._default_key = "accounts" - self._sku_query = self._load_query( - "core/subgraph_queries/rewards.graphql" - ) + self._sku_query = self._load_query("core/subgraph_queries/rewards.graphql") @property def print_prefix(self) -> str: - return "rewards-provider" \ No newline at end of file + return "rewards-provider" diff --git a/ct-app/core/components/hoprd_api.py b/ct-app/core/components/hoprd_api.py index a7e63188..47ea9c6e 100644 --- a/ct-app/core/components/hoprd_api.py +++ b/ct-app/core/components/hoprd_api.py @@ -10,13 +10,7 @@ SendMessageBodyRequest, TagQueryRequest, ) -from hoprd_sdk.api import ( - AccountApi, - ChannelsApi, - MessagesApi, - NetworkApi, - NodeApi, -) +from hoprd_sdk.api import AccountApi, ChannelsApi, MessagesApi, NetworkApi, NodeApi from hoprd_sdk.rest import ApiException from requests import Response from urllib3.exceptions import MaxRetryError @@ -142,9 +136,7 @@ async def open_channel(self, peer_address: str, amount: str): """ body = OpenChannelBodyRequest(amount, peer_address) - is_ok, response = await self.__call_api( - ChannelsApi, "open_channel", body=body - ) + is_ok, response = await self.__call_api(ChannelsApi, "open_channel", body=body) return response.channel_id if is_ok else None @@ -335,7 +327,7 @@ async def messages_pop(self, tag: int = MESSAGE_TAG) -> bool: """ body = TagQueryRequest(tag=tag) _, response = await self.__call_api(MessagesApi, "pop", body=body) - + return response async def messages_pop_all(self, tag: int = MESSAGE_TAG) -> list: @@ -350,7 +342,7 @@ async def messages_pop_all(self, tag: int = MESSAGE_TAG) -> list: async def node_info(self): _, response = await self.__call_api(NodeApi, "info") - + return response async def ticket_price(self) -> int: diff --git a/ct-app/core/components/parameters.py b/ct-app/core/components/parameters.py index 82963f8c..f8c10a38 100644 --- a/ct-app/core/components/parameters.py +++ b/ct-app/core/components/parameters.py @@ -6,6 +6,7 @@ class Parameters(Base): """ Class that represents a set of parameters that can be accessed and modified. The parameters are stored in a dictionary and can be accessed and modified using the dot notation. The parameters can be loaded from environment variables with a specified prefix. """ + def __init__(self): super().__init__() @@ -41,7 +42,6 @@ def overrides(self, prefix: str): else: raise KeyError(f"Key {key} not found in parameters") - def from_env(self, *prefixes: list[str]): for prefix in prefixes: subparams_name = prefix.lower() diff --git a/ct-app/core/components/utils.py b/ct-app/core/components/utils.py index 444af9d2..77bc19dc 100644 --- a/ct-app/core/components/utils.py +++ b/ct-app/core/components/utils.py @@ -1,17 +1,16 @@ import csv -from os import path import random import time from datetime import datetime, timedelta +from os import path from typing import Any from aiohttp import ClientSession -from google.cloud import storage - from core.model.address import Address from core.model.peer import Peer from core.model.subgraph_entry import SubgraphEntry from core.model.topology_entry import TopologyEntry +from google.cloud import storage from .baseclass import Base from .channelstatus import ChannelStatus @@ -44,6 +43,7 @@ async def httpPOST( :param data: The data to be sent. :returns: A tuple containing the status code and the response. """ + async def post(session: ClientSession, url: str, data: dict, timeout: int): async with session.post(url, json=data, timeout=timeout) as response: status = response.status @@ -77,7 +77,12 @@ def mergeDataSources( # if safe is None: # safe = SubgraphEntry(address, "0.000015", "0x0", "10000") - if peer is None or topo is None or safe is None or safe.wxHoprBalance is None: + if ( + peer is None + or topo is None + or safe is None + or safe.wxHoprBalance is None + ): continue peer.safe_address = safe.safe_address diff --git a/ct-app/core/core.py b/ct-app/core/core.py index 0ce9e529..7e7df505 100644 --- a/ct-app/core/core.py +++ b/ct-app/core/core.py @@ -1,8 +1,8 @@ import asyncio +import random import time -from typing import Any from copy import deepcopy -import random +from typing import Any from database import Utils as DBUtils from database.database_connection import DatabaseConnection @@ -13,10 +13,10 @@ from .components.decorators import connectguard, flagguard, formalin from .components.graphql_providers import ( ProviderError, + RewardsProvider, SafesProvider, StakingProvider, wxHOPRTransactionProvider, - RewardsProvider ) from .components.hoprd_api import HoprdAPI from .components.lockedvar import LockedVar @@ -118,9 +118,7 @@ def api(self) -> HoprdAPI: @property async def network_nodes_addresses(self) -> list[Address]: - return await asyncio.gather( - *[node.address.get() for node in self.nodes] - ) + return await asyncio.gather(*[node.address.get() for node in self.nodes]) @property def subgraph_type(self) -> SubgraphType: @@ -141,7 +139,7 @@ def wxhopr_txs_subgraph_url(self) -> str: @property def rewards_subgraph_url(self) -> str: return self._rewards_subgraph_url(self.subgraph_type) - + @subgraph_type.setter def subgraph_type(self, value: SubgraphType): if value != self.subgraph_type: @@ -303,7 +301,7 @@ async def apply_economic_model(self): if not ready: self.warning("Not enough data to apply economic model.") return - + eligibles = Utils.mergeDataSources(topology, peers, registered_nodes) self.debug(f"Merged topology and subgraph data ({len(eligibles)} entries).") @@ -353,7 +351,9 @@ async def apply_economic_model(self): for peer in eligibles: peer.economic_model = deepcopy(model) - peer.economic_model.coefficients.c += redeemed_rewards.get(peer.address.address,0.0) + peer.economic_model.coefficients.c += redeemed_rewards.get( + peer.address.address, 0.0 + ) peer.max_apr = self.params.economicModel.maxAPRPercentage self.debug("Assigned economic model to eligible nodes.") @@ -379,7 +379,7 @@ async def apply_economic_model(self): PEER_SAFE_COUNT.labels(peer.address.id).set(peer.safe_address_count) PEER_TF_STAKE.labels(peer.address.id).set(peer.transformed_stake) PEER_VERSION.labels(peer.address.id, str(peer.version)).set(1) - + @flagguard @formalin("Distributing rewards") @connectguard @@ -421,7 +421,7 @@ async def distribute_rewards(self): t: tuple[dict[str, dict[str, Any]], int] = await self.multiple_attempts_sending( peers, self.params.distribution.maxIterations ) - rewards, iterations = t # trick for typehinting tuple unpacking + rewards, iterations = t # trick for typehinting tuple unpacking self.info("Distribution completed.") self.debug(rewards) diff --git a/ct-app/core/model/economic_model.py b/ct-app/core/model/economic_model.py index 54da3456..c4856ce4 100644 --- a/ct-app/core/model/economic_model.py +++ b/ct-app/core/model/economic_model.py @@ -17,6 +17,7 @@ def __init__(self, formula: str, condition: str): def fromParameters(cls, parameters: Parameters): return cls(parameters.formula, parameters.condition) + class Equations: def __init__(self, f_x: Equation, g_x: Equation): self.f_x = f_x @@ -74,7 +75,7 @@ def period(self): @property def distribution_per_period(self): return self._distribution_per_period - + @property def ticket_price(self): return self._ticket_price @@ -108,7 +109,7 @@ def ticket_price(self, value): def winning_probability(self, value): self._winning_probability = value TICKET_WINNING_PROB.set(value) - + @classmethod def fromParameters(cls, parameters: Parameters): return cls( @@ -154,10 +155,10 @@ def delay_between_distributions(self): @classmethod def fromParameters(cls, parameters: Parameters): return EconomicModel( - Equations.fromParameters(parameters.equations), - Coefficients.fromParameters(parameters.coefficients), + Equations.fromParameters(parameters.equations), + Coefficients.fromParameters(parameters.coefficients), Budget.fromParameters(parameters.budget), ) - + def __repr__(self): return f"EconomicModel({self.equations}, {self.coefficients}, {self.budget})" diff --git a/ct-app/core/model/peer.py b/ct-app/core/model/peer.py index 58576119..7836cc20 100644 --- a/ct-app/core/model/peer.py +++ b/ct-app/core/model/peer.py @@ -156,7 +156,7 @@ def message_count_for_reward(self): budget = self.economic_model.budget denominator = budget.ticket_price * budget.winning_probability - return round(self.protocol_reward_per_distribution / denominator) + return round(self.protocol_reward_per_distribution / denominator) @property def apr_percentage(self): diff --git a/ct-app/core/model/subgraph_url.py b/ct-app/core/model/subgraph_url.py index c3cf1f74..1b5cd0f2 100644 --- a/ct-app/core/model/subgraph_url.py +++ b/ct-app/core/model/subgraph_url.py @@ -1,4 +1,5 @@ from core.components.parameters import Parameters + from .subgraph_type import SubgraphType diff --git a/ct-app/core/node.py b/ct-app/core/node.py index 9c72534e..ce9930d6 100644 --- a/ct-app/core/node.py +++ b/ct-app/core/node.py @@ -371,8 +371,7 @@ async def retrieve_outgoing_channels(self): outgoings = [ c for c in channels.all - if c.source_peer_id == addr.id - and not ChannelStatus.isClosed(c.status) + if c.source_peer_id == addr.id and not ChannelStatus.isClosed(c.status) ] await self.outgoings.set(outgoings) @@ -417,7 +416,7 @@ async def get_total_channel_funds(self): if node_address is None: return - + results = await Utils.aggregatePeerBalanceInChannels(channels) self.debug(f"Results of channels balance aggregation: {results}") @@ -465,7 +464,7 @@ async def distribute_rewards( if node_address is None: return issued_count - + for relayer, data in peer_group.items(): remaining = data.get("remaining", 0) tag = data.get("tag", None) diff --git a/ct-app/database/database_connection.py b/ct-app/database/database_connection.py index 3f981108..6f944764 100644 --- a/ct-app/database/database_connection.py +++ b/ct-app/database/database_connection.py @@ -27,7 +27,7 @@ def __init__(self, params: Parameters): host=params.host, port=params.port, database=params.database, - query={} + query={}, ) self.engine = create_engine(url) diff --git a/ct-app/test/components/test_decorators.py b/ct-app/test/components/test_decorators.py index d704c429..0f0c6fdd 100644 --- a/ct-app/test/components/test_decorators.py +++ b/ct-app/test/components/test_decorators.py @@ -6,14 +6,8 @@ from core.components.lockedvar import LockedVar from core.components.parameters import Parameters -flag_dictionary = { - "flags": { - "fooclass": { - "fooFlagguardFunc": 1, - "fooFormalinFunc": 1 - } - } -} +flag_dictionary = {"flags": {"fooclass": {"fooFlagguardFunc": 1, "fooFormalinFunc": 1}}} + class FooClass(Base): @property @@ -44,6 +38,7 @@ async def foo_formalin_func(self): self.counter += 1 await asyncio.sleep(0.1) + @pytest.fixture def foo_class(): return FooClass() @@ -82,4 +77,4 @@ async def setup_test(run_time: float, sleep_time: float, expected_count: int): foo_class.counter = 0 setup_test(1, 0, 1) - setup_test(1.3, 0.5, 2) \ No newline at end of file + setup_test(1.3, 0.5, 2) diff --git a/ct-app/test/components/test_environment_utils.py b/ct-app/test/components/test_environment_utils.py index ebae7fb1..150a28e4 100644 --- a/ct-app/test/components/test_environment_utils.py +++ b/ct-app/test/components/test_environment_utils.py @@ -1,4 +1,5 @@ from test.components.utils import handle_envvars + from core.components.environment_utils import EnvironmentUtils @@ -28,4 +29,4 @@ def test_envvarWithPrefix(): "TEST_ENVVAR_1": 1, "TEST_ENVVAR_2": 2, "TEST_ENVVAR_3": 3, - } \ No newline at end of file + } diff --git a/ct-app/test/components/test_lockedvar.py b/ct-app/test/components/test_lockedvar.py index f2ab4def..928c7974 100644 --- a/ct-app/test/components/test_lockedvar.py +++ b/ct-app/test/components/test_lockedvar.py @@ -1,7 +1,6 @@ import asyncio import pytest - from core.components.lockedvar import LockedVar @@ -37,6 +36,7 @@ async def test_locker_var_infer_type(): await locked_var.set("string") assert await locked_var.get() == "string" + @pytest.mark.asyncio async def test_locked_var_inc_with_infer_type(): locked_var = LockedVar("test_var", 0, infer_type=True) @@ -45,6 +45,7 @@ async def test_locked_var_inc_with_infer_type(): assert await locked_var.get() == 1.0 + @pytest.mark.asyncio async def test_locked_var_update_with_infer_type(): locked_var = LockedVar("test_var", {}, infer_type=True) @@ -53,4 +54,4 @@ async def test_locked_var_update_with_infer_type(): assert (await locked_var.get())["key"] == 1.0 with pytest.raises(TypeError): - await locked_var.update(10) \ No newline at end of file + await locked_var.update(10) diff --git a/ct-app/test/components/test_parameters.py b/ct-app/test/components/test_parameters.py index 8e54993a..fc1e7095 100644 --- a/ct-app/test/components/test_parameters.py +++ b/ct-app/test/components/test_parameters.py @@ -1,17 +1,13 @@ import os -from core.components.parameters import Parameters import pytest +from core.components.parameters import Parameters params_from_yaml = { - "parent1": "value1", - "parent2": { - "child1": "value2", - "child2": { - "grandchild1": "value3" - } - } - } + "parent1": "value1", + "parent2": {"child1": "value2", "child2": {"grandchild1": "value3"}}, +} + def test_parse(): params = Parameters() @@ -21,6 +17,7 @@ def test_parse(): assert params.parent2.child1 == "value2" assert params.parent2.child2.grandchild1 == "value3" + def test_overrides(): os.environ["OVERRIDES_PARENT1"] = "value1-override" os.environ["OVERRIDES_PARENT2_CHILD1"] = "value2-override" @@ -38,16 +35,18 @@ def test_overrides(): del os.environ["OVERRIDES_PARENT2_CHILD1"] del os.environ["OVERRIDES_PARENT2_CHILD2_GRANDCHILD1"] + def test_overrides_raises(): os.environ["OVERRIDES_PARENT3"] = "value1-override" params = Parameters() params.parse(params_from_yaml) - + with pytest.raises(KeyError): params.overrides("OVERRIDES_") del os.environ["OVERRIDES_PARENT3"] + def test_from_env(): os.environ["ENVPREFIX_STRING"] = "random-string" os.environ["ENVPREFIX_VALUE"] = "2" @@ -72,6 +71,7 @@ def test_from_env(): del os.environ["ENVPREFIX_DECIMAL"] del os.environ["ENVPREFIX_URL"] + def test__convert(): params = Parameters() diff --git a/ct-app/test/conftest.py b/ct-app/test/conftest.py index 0d2df347..5b46ffd6 100644 --- a/ct-app/test/conftest.py +++ b/ct-app/test/conftest.py @@ -1,18 +1,13 @@ from itertools import repeat from random import choice, choices, randint from test.decorators_patches import patches -import yaml -import pytest +import pytest +import yaml from core.components.parameters import Parameters -from core.model.economic_model import ( - Budget, - EconomicModel, - Equation, - Equations, -) - +from core.model.economic_model import Budget from core.model.economic_model import Coefficients as Coefficients +from core.model.economic_model import EconomicModel, Equation, Equations from core.model.peer import Peer from database import Utils as DBUtils from hoprd_sdk.models import ChannelInfoResponse, NodeChannelsResponse @@ -91,7 +86,11 @@ def peers_raw() -> list[dict]: {"peer_id": "id_0", "peer_address": "address_0", "reported_version": "2.0.0"}, {"peer_id": "id_1", "peer_address": "address_1", "reported_version": "1.7.0"}, {"peer_id": "id_2", "peer_address": "address_2", "reported_version": "1.0.3"}, - {"peer_id": "id_3", "peer_address": "address_3", "reported_version": "1.0.0-rc.3"}, + { + "peer_id": "id_3", + "peer_address": "address_3", + "reported_version": "1.0.0-rc.3", + }, {"peer_id": "id_4", "peer_address": "address_4", "reported_version": "1.0.0"}, ] @@ -124,7 +123,8 @@ def addresses() -> list[dict]: @pytest.fixture -async def nodes(mocker: MockerFixture, +async def nodes( + mocker: MockerFixture, peers: list[Peer], addresses: list[dict], peers_raw: list[dict], @@ -138,7 +138,9 @@ async def nodes(mocker: MockerFixture, Node("localhost:9004", "random_key"), ] for idx, node in enumerate(nodes): - mocker.patch.object(node.peers, "get", return_value=peers[:idx] + peers[idx+1:]) + mocker.patch.object( + node.peers, "get", return_value=peers[:idx] + peers[idx + 1 :] + ) mocker.patch.object(node.api, "get_address", return_value=addresses[idx]) mocker.patch.object(node.api, "all_channels", return_value=channels) mocker.patch.object( @@ -152,7 +154,9 @@ async def nodes(mocker: MockerFixture, node.api, "messages_pop_all", side_effect=SideEffect().inbox_messages ) mocker.patch.object(node.api, "balances", side_effect=SideEffect().node_balance) - mocker.patch.object(node.api, "peers", return_value=peers_raw[:idx] + peers_raw[idx+1:]) + mocker.patch.object( + node.api, "peers", return_value=peers_raw[:idx] + peers_raw[idx + 1 :] + ) mocker.patch.object(node.api, "healthyz", return_value=True) mocker.patch.object(node.api, "startedz", return_value=True) @@ -165,6 +169,7 @@ async def nodes(mocker: MockerFixture, return nodes + @pytest.fixture def channels(peers: list[Peer]) -> NodeChannelsResponse: channels = list[ChannelInfoResponse]() @@ -209,7 +214,7 @@ async def core(mocker: MockerFixture, nodes: list[Node]) -> Core: core.post_init(nodes, params) await core._retrieve_address() - + return core diff --git a/ct-app/test/model/test_peer.py b/ct-app/test/model/test_peer.py index f06326e8..176be8b2 100644 --- a/ct-app/test/model/test_peer.py +++ b/ct-app/test/model/test_peer.py @@ -31,4 +31,4 @@ def test_peer_version(): peer.version = "2.0.7" assert not peer.version_is_old("2.0.7") - assert not peer.version_is_old(Version("2.0.7")) \ No newline at end of file + assert not peer.version_is_old(Version("2.0.7")) diff --git a/ct-app/test/test_core.py b/ct-app/test/test_core.py index 3ffb61d8..6bb7afd8 100644 --- a/ct-app/test/test_core.py +++ b/ct-app/test/test_core.py @@ -1,5 +1,4 @@ import pytest - from core.model.address import Address from core.model.peer import Peer from core.model.subgraph_type import SubgraphType @@ -17,7 +16,7 @@ def test__safe_subgraph_url(core: Core): async def test__retrieve_address(core: Core, addresses: list[dict]): await core._retrieve_address() - assert core.address in [Address(addr["hopr"], addr["native"]) for addr in addresses ] + assert core.address in [Address(addr["hopr"], addr["native"]) for addr in addresses] @pytest.mark.asyncio diff --git a/ct-app/test/test_node.py b/ct-app/test/test_node.py index 130a9233..46b5e6d0 100644 --- a/ct-app/test/test_node.py +++ b/ct-app/test/test_node.py @@ -1,6 +1,7 @@ import asyncio import time from random import randint, random + import pytest from hoprd_sdk.models import NodeChannelsResponse @@ -12,7 +13,7 @@ async def test__retrieve_address(node: Node, addresses: dict): await node._retrieve_address() address = await node.address.get() - assert address.address in [addr["native"] for addr in addresses] + assert address.address in [addr["native"] for addr in addresses] assert address.id in [addr["hopr"] for addr in addresses] @@ -94,7 +95,9 @@ async def test_retrieve_incoming_channels(node: Node, channels: NodeChannelsResp incomings_from_node = await node.incomings.get() incomings_from_fixture = [ - c for c in channels.all if c.destination_peer_id == (await node.address.get()).id + c + for c in channels.all + if c.destination_peer_id == (await node.address.get()).id ] assert [c.channel_id for c in incomings_from_node] == [ @@ -108,7 +111,11 @@ async def test_get_total_channel_funds(node: Node, channels: NodeChannelsRespons total_funds_from_node = await node.get_total_channel_funds() total_funds_from_fixture = sum( - [int(c.balance) for c in channels.all if c.source_peer_id == (await node.address.get()).id] + [ + int(c.balance) + for c in channels.all + if c.source_peer_id == (await node.address.get()).id + ] ) assert total_funds_from_fixture / 1e18 == total_funds_from_node diff --git a/ct-app/tests_endurance/test_fund_channels.py b/ct-app/tests_endurance/test_fund_channels.py index dbfcc2a5..766d64a6 100644 --- a/ct-app/tests_endurance/test_fund_channels.py +++ b/ct-app/tests_endurance/test_fund_channels.py @@ -4,7 +4,6 @@ from core.components.hoprd_api import HoprdAPI from core.components.utils import Utils -# tools import HoprdAPIHelper, envvar from . import EnduranceTest, Metric