Source code for nqs_sdk.bindings.protocols.cex.cex_factory
from typing import Any, List, Optional, Tuple
from nqs_sdk import Metrics, MutBuilderSharedState, MutSharedState, SimulationClock, TxRequest
from nqs_sdk.bindings.protocols.protocol_infos import ProtocolInfos
from nqs_sdk.interfaces.protocol import Protocol
from nqs_sdk.interfaces.protocol_factory import ProtocolFactory
from nqs_sdk.interfaces.protocol_metafactory import ProtocolMetaFactory
from nqs_sdk.interfaces.tx_generator import TxGenerator
from .cex_market import CEXMarkets
from .cex_protocol import CEX
[docs]
class CEXMarginCheckTxGenerator(TxGenerator):
[docs]
def __init__(self, markets: CEXMarkets) -> None:
self.previous_price = None
self.markets = markets
[docs]
def id(self) -> str:
return "cex_margin_check"
[docs]
def next(
self, clock: SimulationClock, state: MutSharedState, metrics: Metrics
) -> Tuple[List[TxRequest], Optional[int]]:
# generate a transaction with the current price at each block
"""parameters = states.get_parameters()
#metric_spots
current_price = metrics.get(
previous_price = self.previous_price
self.previous_price = current_price
check_tx = CheckMarginPositionTransaction(previous_price)
return [check_tx.to_tx_request(protocol="cex", source="cex", sender=agent_id)], 1"""
return [], None
[docs]
class CEXDefaultFactory(ProtocolFactory):
[docs]
def __init__(self, markets: dict[str, CEXMarkets]) -> None:
self.name = "cex"
self.markets = markets
[docs]
def id(self) -> str:
return self.name
[docs]
def build(
self,
clock: SimulationClock,
builder_state: MutBuilderSharedState,
common_config: Any,
backtest: bool,
config: Any,
) -> Tuple[List[Protocol], List[TxGenerator]]:
return [CEX(markets) for markets in self.markets.values()], [
CEXMarginCheckTxGenerator(markets) for markets in self.markets.values()
]
[docs]
class CEXFactory(ProtocolMetaFactory):
[docs]
def __init__(self) -> None:
self.name = "cex"
self.protocols: dict[str, CEXMarkets] = {}
[docs]
def register_protocol(self, protocol: ProtocolInfos) -> None:
assert isinstance(protocol, CEXMarkets), "Protocol must be an instance of UniswapV3Pool"
assert protocol.name not in self.protocols, "Protocol already registered"
self.protocols[protocol.name] = protocol
[docs]
def id(self) -> str:
return self.name
[docs]
def get_config(self) -> dict[str, Any]:
config: dict[str, Any] = {
"cex": {},
}
return config
[docs]
def get_factories(self) -> list[Any]:
return [CEXDefaultFactory(self.protocols)]