def test_user_stream_tracker(self, mock_ws):
        user_stream_tracker = CoinflexUserStreamTracker(
            auth=CoinflexAuth(api_key="TEST_API_KEY", secret_key="TEST_SECRET"),
            domain=self.domain,
            throttler=self.throttler
        )
        msg_queue: asyncio.Queue = asyncio.Queue()
        mock_ws.return_value = self.mocking_assistant.create_websocket_mock()
        mock_ws.return_value.receive.side_effect = (lambda *args, **kwargs:
                                                    self._create_exception_and_unlock_test_with_event(
                                                        Exception("TEST ERROR")))
        mock_ws.close.return_value = None

        user_stream_tracker._ev_loop = self.ev_loop
        user_stream_tracker._user_stream = msg_queue

        self.listening_task = self.ev_loop.create_task(
            user_stream_tracker.start()
        )

        self.async_run_with_timeout(self.resume_test_event.wait())

        self.assertTrue(
            self._is_logged(
                "ERROR",
                "Unexpected error while listening to user stream. Retrying after 5 seconds..."))
Ejemplo n.º 2
0
 def setUpClass(cls):
     cls.ev_loop: asyncio.BaseEventLoop = asyncio.get_event_loop()
     cls._throttler = AsyncThrottler(CONSTANTS.RATE_LIMITS)
     cls._domain = os.getenv("COINFLEX_DOMAIN", "live")
     cls._test_order_id = os.getenv("TEST_ORDER_STATUS_ID")
     cls._logger = logging.getLogger(__name__)
     api_key = conf.coinflex_api_key
     secret_key = conf.coinflex_api_secret
     cls._auth = CoinflexAuth(api_key=api_key, secret_key=secret_key)
     cls._api_factory = build_api_factory(auth=cls._auth)
Ejemplo n.º 3
0
    def test_rest_authenticate(self, time_mock):
        now = 1234567890.000
        time_mock.return_value = now

        params = {
            "symbol": "LTCBTC",
            "side": "BUY",
            "type": "LIMIT",
            "timeInForce": "GTC",
            "quantity": 1,
            "price": "0.1",
        }
        full_params = copy(params)

        auth = CoinflexAuth(api_key=self._api_key, secret_key=self._secret)
        request = CoinflexRESTRequest(method=RESTMethod.GET,
                                      endpoint="",
                                      params=params,
                                      is_auth_required=True)
        configured_request = self.async_run_with_timeout(
            auth.rest_authenticate(request))

        str_timestamp = datetime.fromtimestamp(now).isoformat()
        nonce = int(now * 1e3)

        encoded_params = "&".join(
            [f"{key}={value}" for key, value in full_params.items()])
        payload = '{}\n{}\n{}\n{}\n{}\n{}'.format(str_timestamp, nonce,
                                                  str(RESTMethod.GET),
                                                  request.auth_url,
                                                  request.auth_path,
                                                  encoded_params)

        expected_signature = b64encode(
            hmac.new(self._secret.encode("utf-8"), payload.encode("utf-8"),
                     hashlib.sha256).digest()).decode().strip()
        expected_headers = {
            "AccessKey": self._api_key,
            "Timestamp": str_timestamp,
            "Signature": expected_signature,
            "Nonce": str(nonce),
        }
        self.assertEqual(expected_headers, configured_request.headers)
 def setUpClass(cls):
     cls.ev_loop: asyncio.BaseEventLoop = asyncio.get_event_loop()
     cls.trading_pairs = ["BTC-USD"]
     cls.user_stream_tracker: CoinflexUserStreamTracker = CoinflexUserStreamTracker(
         domain=os.getenv("COINFLEX_DOMAIN", "live"),
         auth=CoinflexAuth(api_key=cls.api_key,
                           secret_key=cls.api_secret,
                           time_provider=TimeSynchronizer()))
     cls.user_stream_tracker_task: asyncio.Task = safe_ensure_future(
         cls.user_stream_tracker.start())
    def setUp(self) -> None:
        super().setUp()
        self.log_records = []
        self.listening_task: Optional[asyncio.Task] = None
        self.mocking_assistant = NetworkMockingAssistant()

        self.throttler = AsyncThrottler(rate_limits=CONSTANTS.RATE_LIMITS)
        self.data_source = CoinflexAPIUserStreamDataSource(
            auth=CoinflexAuth(api_key="TEST_API_KEY", secret_key="TEST_SECRET"),
            domain=self.domain,
            throttler=self.throttler
        )

        self.data_source.logger().setLevel(1)
        self.data_source.logger().addHandler(self)

        self.resume_test_event = asyncio.Event()
Ejemplo n.º 6
0
 def __init__(self,
              coinflex_api_key: str,
              coinflex_api_secret: str,
              trading_pairs: Optional[List[str]] = None,
              trading_required: bool = True,
              domain: str = CONSTANTS.DEFAULT_DOMAIN):
     self._domain = domain
     super().__init__()
     self._trading_required = trading_required
     self._auth = CoinflexAuth(api_key=coinflex_api_key,
                               secret_key=coinflex_api_secret)
     self._throttler = AsyncThrottler(CONSTANTS.RATE_LIMITS)
     self._api_factory = web_utils.build_api_factory(auth=self._auth)
     self._order_book_tracker = CoinflexOrderBookTracker(
         trading_pairs=trading_pairs,
         domain=domain,
         api_factory=self._api_factory,
         throttler=self._throttler)
     self._user_stream_tracker = CoinflexUserStreamTracker(
         auth=self._auth,
         domain=domain,
         throttler=self._throttler,
         api_factory=self._api_factory)
     self._ev_loop = asyncio.get_event_loop()
     self._poll_notifier = asyncio.Event()
     self._last_timestamp = 0
     self._order_not_found_records = {
     }  # Dict[client_order_id:str, count:int]
     self._trading_rules = {}  # Dict[trading_pair:str, TradingRule]
     self._trade_fees = {
     }  # Dict[trading_pair:str, (maker_fee_percent:Decimal, taken_fee_percent:Decimal)]
     self._last_update_trade_fees_timestamp = 0
     self._status_polling_task = None
     self._user_stream_event_listener_task = None
     self._trading_rules_polling_task = None
     self._last_poll_timestamp = 0
     self._last_trades_poll_coinflex_timestamp = 0
     self._order_tracker: ClientOrderTracker = ClientOrderTracker(
         connector=self)