Skip to content

Commit

Permalink
linting
Browse files Browse the repository at this point in the history
  • Loading branch information
jeandemeusy committed Jun 7, 2024
1 parent eaaa0db commit 4eb5f6d
Show file tree
Hide file tree
Showing 23 changed files with 166 additions and 116 deletions.
1 change: 0 additions & 1 deletion ct-app/core/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ def main(configfile: str = None):
params.from_env("SUBGRAPH_", "PG", "RABBITMQ_")
params.overrides("OVERRIDE_")


Utils.stringArrayToGCP(
params.gcp.bucket,
Utils.generateFilename("", "startup", "csv"),
Expand Down
1 change: 1 addition & 0 deletions ct-app/core/components/baseclass.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class Base:
"""
Base class for logging and printing messages with different colors.
"""

handler = logging.StreamHandler()
handler.setFormatter(formatter)

Expand Down
9 changes: 4 additions & 5 deletions ct-app/core/components/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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])

Expand All @@ -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
20 changes: 12 additions & 8 deletions ct-app/core/components/graphql_providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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"
return "rewards-provider"
16 changes: 4 additions & 12 deletions ct-app/core/components/hoprd_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion ct-app/core/components/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__()

Expand Down Expand Up @@ -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()
Expand Down
3 changes: 1 addition & 2 deletions ct-app/core/components/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@
import aiohttp
from aiohttp import ClientSession
from celery import Celery
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

Expand Down
49 changes: 31 additions & 18 deletions ct-app/core/core.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
import asyncio
from copy import deepcopy
import random
from copy import deepcopy

from celery import Celery
from core.model.economic_model_sigmoid import EconomicModelSigmoid
from prometheus_client import Gauge

from .components.baseclass import Base
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
from .components.parameters import Parameters
from .components.utils import Utils
from .model.address import Address
from .model.economic_model_legacy import EconomicModelLegacy
from .model.budget import Budget
from .model.economic_model_legacy import EconomicModelLegacy
from .model.economic_model_sigmoid import EconomicModelSigmoid
from .model.peer import Peer
from .model.subgraph_entry import SubgraphEntry
from .model.subgraph_type import SubgraphType
Expand Down Expand Up @@ -98,8 +98,12 @@ def post_init(self, nodes: list[Node], params: Parameters):

self.budget = Budget.fromParameters(self.params.economicModel.budget)

self.legacy_model = EconomicModelLegacy.fromParameters(self.params.economicModel.legacy)
self.sigmoid_model = EconomicModelSigmoid.fromParameters(self.params.economicModel.sigmoid)
self.legacy_model = EconomicModelLegacy.fromParameters(
self.params.economicModel.legacy
)
self.sigmoid_model = EconomicModelSigmoid.fromParameters(
self.params.economicModel.sigmoid
)

self.legacy_model.budget = deepcopy(self.budget)
self.sigmoid_model.budget = deepcopy(self.budget)
Expand Down Expand Up @@ -128,9 +132,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:
Expand All @@ -151,7 +153,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:
Expand Down Expand Up @@ -312,7 +314,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).")

Expand Down Expand Up @@ -366,9 +368,13 @@ async def apply_economic_model(self):
redeemed_rewards = await self.peer_rewards.get()
for peer in eligibles:
peer.economic_model = deepcopy(self.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
)

self.info(f"Assigned economic model to eligible nodes. ({len(eligibles)} entries).")
self.info(
f"Assigned economic model to eligible nodes. ({len(eligibles)} entries)."
)

excluded = Utils.rewardProbability(eligibles)
self.debug(f"Excluded nodes with low stakes ({len(excluded)} entries).")
Expand Down Expand Up @@ -421,14 +427,21 @@ async def distribute_rewards(self):
broker=f"amqp://{self.params.rabbitmq.username}:{self.params.rabbitmq.password}@{self.params.rabbitmq.host}/{self.params.rabbitmq.virtualhost}",
)
app.autodiscover_tasks(force=True)

economic_security = sum([peer.split_stake for peer in peers]) / self.params.economicModel.sigmoid.totalTokenSupply
network_capacity = len(peers) / self.params.economicModel.sigmoid.networkCapacity

economic_security = (
sum([peer.split_stake for peer in peers])
/ self.params.economicModel.sigmoid.totalTokenSupply
)
network_capacity = (
len(peers) / self.params.economicModel.sigmoid.networkCapacity
)
sigmoid_model_input = [economic_security, network_capacity]

for peer in peers:
for peer in peers:
legacy_count = self.legacy_model.message_count_for_reward(peer.split_stake)
sigmoid_count = self.sigmoid_model.message_count_for_reward(peer.split_stake, sigmoid_model_input)
sigmoid_count = self.sigmoid_model.message_count_for_reward(
peer.split_stake, sigmoid_model_input
)

Utils.taskSendMessage(
app,
Expand Down
5 changes: 3 additions & 2 deletions ct-app/core/model/budget.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
TICKET_PRICE = Gauge("ticket_price", "Ticket price")
TICKET_WINNING_PROB = Gauge("ticket_winning_prob", "Ticket winning probability")


class Budget:
def __init__(
self,
Expand All @@ -26,7 +27,7 @@ def period(self):
@property
def distribution_per_period(self):
return self._distribution_per_period

@property
def ticket_price(self):
return self._ticket_price
Expand Down Expand Up @@ -54,7 +55,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(
Expand Down
27 changes: 18 additions & 9 deletions ct-app/core/model/economic_model_legacy.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from core.components.parameters import Parameters

from .budget import Budget


class Equation:
def __init__(self, formula: str, condition: str):
self.formula = formula
Expand All @@ -10,6 +12,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
Expand Down Expand Up @@ -42,7 +45,11 @@ def fromParameters(cls, parameters: Parameters):

class EconomicModelLegacy:
def __init__(
self, equations: Equations, coefficients: Coefficients, proportion: float, apr: float
self,
equations: Equations,
coefficients: Coefficients,
proportion: float,
apr: float,
):
"""
Initialisation of the class.
Expand All @@ -64,24 +71,26 @@ def transformed_stake(self, stake: float):
func = self.equations.g_x

return eval(func.formula, kwargs)

def message_count_for_reward(self, stake: float):
"""
Calculate the message count for the reward.
"""
rewards = self.apr / 12 * self.transformed_stake(stake)
denominator = self.budget.ticket_price * self.budget.winning_probability

return round(rewards / denominator * self.economic_model.proportion)
return round(rewards / denominator * self.economic_model.proportion)

@classmethod
def fromParameters(cls, parameters: Parameters):
return cls(
Equations.fromParameters(parameters.equations),
Coefficients.fromParameters(parameters.coefficients),
Equations.fromParameters(parameters.equations),
Coefficients.fromParameters(parameters.coefficients),
parameters.proportion,
parameters.apr
parameters.apr,
)

def __repr__(self):
return f"EconomicModelLegacy({self.equations}, {self.coefficients}, {self.budget})"
return (
f"EconomicModelLegacy({self.equations}, {self.coefficients}, {self.budget})"
)
Loading

0 comments on commit 4eb5f6d

Please sign in to comment.