crypticorn 2.12.1__py3-none-any.whl → 2.13.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. crypticorn/auth/client/models/create_user_request.py +4 -16
  2. crypticorn/auth/main.py +8 -0
  3. crypticorn/client.py +26 -22
  4. crypticorn/common/auth.py +44 -12
  5. crypticorn/common/errors.py +79 -76
  6. crypticorn/hive/client/configuration.py +2 -2
  7. crypticorn/hive/client/models/api_error_identifier.py +2 -2
  8. crypticorn/hive/main.py +9 -5
  9. crypticorn/klines/client/models/api_error_identifier.py +1 -1
  10. crypticorn/klines/main.py +7 -0
  11. crypticorn/metrics/client/api/exchanges_api.py +343 -0
  12. crypticorn/metrics/client/configuration.py +4 -2
  13. crypticorn/metrics/client/models/api_error_identifier.py +9 -3
  14. crypticorn/metrics/main.py +8 -3
  15. crypticorn/pay/client/api/products_api.py +228 -1
  16. crypticorn/pay/client/configuration.py +2 -2
  17. crypticorn/pay/client/models/api_error_identifier.py +7 -3
  18. crypticorn/pay/main.py +7 -0
  19. crypticorn/trade/client/__init__.py +1 -0
  20. crypticorn/trade/client/api/strategies_api.py +296 -26
  21. crypticorn/trade/client/api/trading_actions_api.py +4 -4
  22. crypticorn/trade/client/models/__init__.py +1 -0
  23. crypticorn/trade/client/models/api_error_identifier.py +6 -2
  24. crypticorn/trade/client/models/futures_trading_action.py +23 -37
  25. crypticorn/trade/client/models/futures_trading_action_create.py +28 -42
  26. crypticorn/trade/client/models/order.py +40 -34
  27. crypticorn/trade/client/models/spot_trading_action_create.py +10 -25
  28. crypticorn/trade/client/models/strategy_exchange_info.py +3 -3
  29. crypticorn/trade/client/models/tpsl.py +7 -16
  30. crypticorn/trade/client/models/tpsl_create.py +103 -0
  31. crypticorn/trade/main.py +8 -2
  32. {crypticorn-2.12.1.dist-info → crypticorn-2.13.1.dist-info}/METADATA +30 -3
  33. {crypticorn-2.12.1.dist-info → crypticorn-2.13.1.dist-info}/RECORD +37 -36
  34. {crypticorn-2.12.1.dist-info → crypticorn-2.13.1.dist-info}/WHEEL +0 -0
  35. {crypticorn-2.12.1.dist-info → crypticorn-2.13.1.dist-info}/entry_points.txt +0 -0
  36. {crypticorn-2.12.1.dist-info → crypticorn-2.13.1.dist-info}/licenses/LICENSE +0 -0
  37. {crypticorn-2.12.1.dist-info → crypticorn-2.13.1.dist-info}/top_level.txt +0 -0
@@ -23,20 +23,31 @@ class ApiErrorType(StrEnum):
23
23
  """error that does not need to be handled or does not affect the program or is a placeholder."""
24
24
 
25
25
 
26
+ class ApiErrorLevel(StrEnum):
27
+ """Level of the API error."""
28
+
29
+ ERROR = "error"
30
+ INFO = "info"
31
+ SUCCESS = "success"
32
+ WARNING = "warning"
33
+
34
+
26
35
  class ApiErrorIdentifier(StrEnum):
27
36
  """Unique identifier of the API error."""
28
37
 
29
38
  ALLOCATION_BELOW_EXPOSURE = "allocation_below_current_exposure"
30
39
  ALLOCATION_BELOW_MINIMUM = "allocation_below_min_amount"
40
+ ALLOCATION_LIMIT_EXCEEDED = "allocation_limit_exceeded"
31
41
  BLACK_SWAN = "black_swan"
32
42
  BOT_ALREADY_DELETED = "bot_already_deleted"
33
- BOT_DISABLED = "bot_disabled"
34
43
  BOT_STOPPING_COMPLETED = "bot_stopping_completed"
35
44
  BOT_STOPPING_STARTED = "bot_stopping_started"
36
45
  CANCELLED_OPEN_ORDER = "cancelled_open_order"
37
46
  CLIENT_ORDER_ID_REPEATED = "client_order_id_already_exists"
38
47
  CONTENT_TYPE_ERROR = "invalid_content_type"
39
48
  DELETE_BOT_ERROR = "delete_bot_error"
49
+ EXCHANGE_HTTP_ERROR = "exchange_http_request_error"
50
+ EXCHANGE_INVALID_PARAMETER = "exchange_invalid_parameter"
40
51
  EXCHANGE_INVALID_SIGNATURE = "exchange_invalid_signature"
41
52
  EXCHANGE_INVALID_TIMESTAMP = "exchange_invalid_timestamp"
42
53
  EXCHANGE_IP_RESTRICTED = "exchange_ip_address_is_not_authorized"
@@ -55,7 +66,6 @@ class ApiErrorIdentifier(StrEnum):
55
66
  FAILED_OPEN_ORDER = "open_order_expired"
56
67
  FORBIDDEN = "forbidden"
57
68
  HEDGE_MODE_NOT_ACTIVE = "hedge_mode_not_active"
58
- HTTP_ERROR = "http_request_error"
59
69
  INSUFFICIENT_BALANCE = "insufficient_balance"
60
70
  INSUFFICIENT_MARGIN = "insufficient_margin"
61
71
  INSUFFICIENT_SCOPES = "insufficient_scopes"
@@ -64,13 +74,13 @@ class ApiErrorIdentifier(StrEnum):
64
74
  INVALID_DATA_REQUEST = "invalid_data"
65
75
  INVALID_DATA_RESPONSE = "invalid_data_response"
66
76
  INVALID_EXCHANGE_KEY = "invalid_exchange_key"
67
- INVALID_MARGIN_MODE = "invalid_margin_mode"
68
77
  INVALID_MODEL_NAME = "invalid_model_name"
69
- INVALID_PARAMETER = "invalid_parameter_provided"
70
78
  LEVERAGE_EXCEEDED = "leverage_limit_exceeded"
71
79
  LIQUIDATION_PRICE_VIOLATION = "order_violates_liquidation_price_constraints"
72
80
  MARGIN_MODE_CLASH = "margin_mode_clash"
73
81
  NAME_NOT_UNIQUE = "name_not_unique"
82
+ NO_API_KEY = "no_api_key"
83
+ NO_BEARER = "no_bearer"
74
84
  NO_CREDENTIALS = "no_credentials"
75
85
  NOW_API_DOWN = "now_api_down"
76
86
  OBJECT_ALREADY_EXISTS = "object_already_exists"
@@ -96,14 +106,13 @@ class ApiErrorIdentifier(StrEnum):
96
106
  RISK_LIMIT_EXCEEDED = "risk_limit_exceeded"
97
107
  RPC_TIMEOUT = "rpc_timeout"
98
108
  SETTLEMENT_IN_PROGRESS = "system_settlement_in_process"
99
- STRATEGY_ALREADY_EXISTS = "strategy_already_exists"
100
109
  STRATEGY_DISABLED = "strategy_disabled"
101
110
  STRATEGY_LEVERAGE_MISMATCH = "strategy_leverage_mismatch"
102
111
  STRATEGY_NOT_SUPPORTING_EXCHANGE = "strategy_not_supporting_exchange"
103
112
  SUCCESS = "success"
104
113
  SYMBOL_NOT_FOUND = "symbol_does_not_exist"
105
114
  TRADING_ACTION_EXPIRED = "trading_action_expired"
106
- TRADING_ACTION_SKIPPED_BOT_STOPPING = "TRADING_ACTION_SKIPPED_BOT_STOPPING"
115
+ TRADING_ACTION_SKIPPED_BOT_STOPPING = "trading_action_skipped_bot_stopping"
107
116
  TRADING_LOCKED = "trading_has_been_locked"
108
117
  TRADING_SUSPENDED = "trading_is_suspended"
109
118
  UNKNOWN_ERROR = "unknown_error_occurred"
@@ -114,15 +123,6 @@ class ApiErrorIdentifier(StrEnum):
114
123
  return getattr(ApiError, self.name)
115
124
 
116
125
 
117
- class ApiErrorLevel(StrEnum):
118
- """Level of the API error."""
119
-
120
- ERROR = "error"
121
- INFO = "info"
122
- SUCCESS = "success"
123
- WARNING = "warning"
124
-
125
-
126
126
  class ApiError(Enum, metaclass=ApiErrorFallback):
127
127
  # Fallback to UNKNOWN_ERROR for error codes not yet published to PyPI.
128
128
  """Crypticorn API error enumeration."""
@@ -137,9 +137,14 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
137
137
  ApiErrorType.USER_ERROR,
138
138
  ApiErrorLevel.ERROR,
139
139
  )
140
+ ALLOCATION_LIMIT_EXCEEDED = (
141
+ ApiErrorIdentifier.ALLOCATION_LIMIT_EXCEEDED,
142
+ ApiErrorType.NO_ERROR,
143
+ ApiErrorLevel.INFO,
144
+ )
140
145
  BLACK_SWAN = (
141
146
  ApiErrorIdentifier.BLACK_SWAN,
142
- ApiErrorType.USER_ERROR,
147
+ ApiErrorType.EXCHANGE_ERROR,
143
148
  ApiErrorLevel.INFO,
144
149
  )
145
150
  BOT_ALREADY_DELETED = (
@@ -147,20 +152,15 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
147
152
  ApiErrorType.USER_ERROR,
148
153
  ApiErrorLevel.INFO,
149
154
  )
150
- BOT_DISABLED = (
151
- ApiErrorIdentifier.BOT_DISABLED,
152
- ApiErrorType.USER_ERROR,
153
- ApiErrorLevel.WARNING,
154
- )
155
155
  BOT_STOPPING_COMPLETED = (
156
156
  ApiErrorIdentifier.BOT_STOPPING_COMPLETED,
157
157
  ApiErrorType.NO_ERROR,
158
- ApiErrorLevel.INFO,
158
+ ApiErrorLevel.SUCCESS,
159
159
  )
160
160
  BOT_STOPPING_STARTED = (
161
161
  ApiErrorIdentifier.BOT_STOPPING_STARTED,
162
162
  ApiErrorType.NO_ERROR,
163
- ApiErrorLevel.INFO,
163
+ ApiErrorLevel.SUCCESS,
164
164
  )
165
165
  CANCELLED_OPEN_ORDER = (
166
166
  ApiErrorIdentifier.CANCELLED_OPEN_ORDER,
@@ -182,6 +182,16 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
182
182
  ApiErrorType.SERVER_ERROR,
183
183
  ApiErrorLevel.ERROR,
184
184
  )
185
+ EXCHANGE_HTTP_ERROR = (
186
+ ApiErrorIdentifier.EXCHANGE_HTTP_ERROR,
187
+ ApiErrorType.EXCHANGE_ERROR,
188
+ ApiErrorLevel.ERROR,
189
+ )
190
+ EXCHANGE_INVALID_PARAMETER = (
191
+ ApiErrorIdentifier.EXCHANGE_INVALID_PARAMETER,
192
+ ApiErrorType.SERVER_ERROR,
193
+ ApiErrorLevel.ERROR,
194
+ )
185
195
  EXCHANGE_INVALID_SIGNATURE = (
186
196
  ApiErrorIdentifier.EXCHANGE_INVALID_SIGNATURE,
187
197
  ApiErrorType.SERVER_ERROR,
@@ -194,7 +204,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
194
204
  )
195
205
  EXCHANGE_IP_RESTRICTED = (
196
206
  ApiErrorIdentifier.EXCHANGE_IP_RESTRICTED,
197
- ApiErrorType.SERVER_ERROR,
207
+ ApiErrorType.USER_ERROR,
198
208
  ApiErrorLevel.ERROR,
199
209
  )
200
210
  EXCHANGE_KEY_ALREADY_EXISTS = (
@@ -204,7 +214,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
204
214
  )
205
215
  EXCHANGE_KEY_IN_USE = (
206
216
  ApiErrorIdentifier.EXCHANGE_KEY_IN_USE,
207
- ApiErrorType.SERVER_ERROR,
217
+ ApiErrorType.USER_ERROR,
208
218
  ApiErrorLevel.ERROR,
209
219
  )
210
220
  EXCHANGE_MAINTENANCE = (
@@ -214,7 +224,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
214
224
  )
215
225
  EXCHANGE_RATE_LIMIT = (
216
226
  ApiErrorIdentifier.EXCHANGE_RATE_LIMIT,
217
- ApiErrorType.EXCHANGE_ERROR,
227
+ ApiErrorType.SERVER_ERROR,
218
228
  ApiErrorLevel.ERROR,
219
229
  )
220
230
  EXCHANGE_PERMISSION_DENIED = (
@@ -272,11 +282,6 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
272
282
  ApiErrorType.USER_ERROR,
273
283
  ApiErrorLevel.ERROR,
274
284
  )
275
- HTTP_ERROR = (
276
- ApiErrorIdentifier.HTTP_ERROR,
277
- ApiErrorType.EXCHANGE_ERROR,
278
- ApiErrorLevel.ERROR,
279
- )
280
285
  INSUFFICIENT_BALANCE = (
281
286
  ApiErrorIdentifier.INSUFFICIENT_BALANCE,
282
287
  ApiErrorType.USER_ERROR,
@@ -309,7 +314,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
309
314
  )
310
315
  INVALID_DATA_RESPONSE = (
311
316
  ApiErrorIdentifier.INVALID_DATA_RESPONSE,
312
- ApiErrorType.USER_ERROR,
317
+ ApiErrorType.SERVER_ERROR,
313
318
  ApiErrorLevel.ERROR,
314
319
  )
315
320
  INVALID_EXCHANGE_KEY = (
@@ -317,21 +322,11 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
317
322
  ApiErrorType.USER_ERROR,
318
323
  ApiErrorLevel.ERROR,
319
324
  )
320
- INVALID_MARGIN_MODE = (
321
- ApiErrorIdentifier.INVALID_MARGIN_MODE,
322
- ApiErrorType.SERVER_ERROR,
323
- ApiErrorLevel.ERROR,
324
- )
325
325
  INVALID_MODEL_NAME = (
326
326
  ApiErrorIdentifier.INVALID_MODEL_NAME,
327
327
  ApiErrorType.USER_ERROR,
328
328
  ApiErrorLevel.ERROR,
329
329
  )
330
- INVALID_PARAMETER = (
331
- ApiErrorIdentifier.INVALID_PARAMETER,
332
- ApiErrorType.SERVER_ERROR,
333
- ApiErrorLevel.ERROR,
334
- )
335
330
  LEVERAGE_EXCEEDED = (
336
331
  ApiErrorIdentifier.LEVERAGE_EXCEEDED,
337
332
  ApiErrorType.SERVER_ERROR,
@@ -352,6 +347,16 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
352
347
  ApiErrorType.USER_ERROR,
353
348
  ApiErrorLevel.ERROR,
354
349
  )
350
+ NO_API_KEY = (
351
+ ApiErrorIdentifier.NO_API_KEY,
352
+ ApiErrorType.USER_ERROR,
353
+ ApiErrorLevel.ERROR,
354
+ )
355
+ NO_BEARER = (
356
+ ApiErrorIdentifier.NO_BEARER,
357
+ ApiErrorType.USER_ERROR,
358
+ ApiErrorLevel.ERROR,
359
+ )
355
360
  NO_CREDENTIALS = (
356
361
  ApiErrorIdentifier.NO_CREDENTIALS,
357
362
  ApiErrorType.USER_ERROR,
@@ -364,18 +369,18 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
364
369
  )
365
370
  OBJECT_ALREADY_EXISTS = (
366
371
  ApiErrorIdentifier.OBJECT_ALREADY_EXISTS,
367
- ApiErrorType.SERVER_ERROR,
372
+ ApiErrorType.USER_ERROR,
368
373
  ApiErrorLevel.ERROR,
369
374
  )
370
375
  OBJECT_CREATED = (
371
376
  ApiErrorIdentifier.OBJECT_CREATED,
372
- ApiErrorType.SERVER_ERROR,
373
- ApiErrorLevel.INFO,
377
+ ApiErrorType.NO_ERROR,
378
+ ApiErrorLevel.SUCCESS,
374
379
  )
375
380
  OBJECT_DELETED = (
376
381
  ApiErrorIdentifier.OBJECT_DELETED,
377
- ApiErrorType.SERVER_ERROR,
378
- ApiErrorLevel.INFO,
382
+ ApiErrorType.NO_ERROR,
383
+ ApiErrorLevel.SUCCESS,
379
384
  )
380
385
  OBJECT_LOCKED = (
381
386
  ApiErrorIdentifier.OBJECT_LOCKED,
@@ -384,13 +389,13 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
384
389
  )
385
390
  OBJECT_NOT_FOUND = (
386
391
  ApiErrorIdentifier.OBJECT_NOT_FOUND,
387
- ApiErrorType.SERVER_ERROR,
392
+ ApiErrorType.USER_ERROR,
388
393
  ApiErrorLevel.ERROR,
389
394
  )
390
395
  OBJECT_UPDATED = (
391
396
  ApiErrorIdentifier.OBJECT_UPDATED,
392
- ApiErrorType.SERVER_ERROR,
393
- ApiErrorLevel.INFO,
397
+ ApiErrorType.NO_ERROR,
398
+ ApiErrorLevel.SUCCESS,
394
399
  )
395
400
  ORDER_ALREADY_FILLED = (
396
401
  ApiErrorIdentifier.ORDER_ALREADY_FILLED,
@@ -429,13 +434,13 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
429
434
  )
430
435
  ORPHAN_OPEN_ORDER = (
431
436
  ApiErrorIdentifier.ORPHAN_OPEN_ORDER,
432
- ApiErrorType.SERVER_ERROR,
433
- ApiErrorLevel.INFO,
437
+ ApiErrorType.NO_ERROR,
438
+ ApiErrorLevel.WARNING,
434
439
  )
435
- ORPHAN_CLOSE_ORDER = (
440
+ ORPHAN_CLOSE_ORDER = (
436
441
  ApiErrorIdentifier.ORPHAN_CLOSE_ORDER,
437
442
  ApiErrorType.NO_ERROR,
438
- ApiErrorLevel.INFO,
443
+ ApiErrorLevel.WARNING,
439
444
  )
440
445
  POSITION_LIMIT_EXCEEDED = (
441
446
  ApiErrorIdentifier.POSITION_LIMIT_EXCEEDED,
@@ -445,7 +450,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
445
450
  POSITION_NOT_FOUND = (
446
451
  ApiErrorIdentifier.POSITION_NOT_FOUND,
447
452
  ApiErrorType.NO_ERROR,
448
- ApiErrorLevel.INFO,
453
+ ApiErrorLevel.WARNING,
449
454
  )
450
455
  POSITION_SUSPENDED = (
451
456
  ApiErrorIdentifier.POSITION_SUSPENDED,
@@ -477,15 +482,10 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
477
482
  ApiErrorType.EXCHANGE_ERROR,
478
483
  ApiErrorLevel.ERROR,
479
484
  )
480
- STRATEGY_ALREADY_EXISTS = (
481
- ApiErrorIdentifier.STRATEGY_ALREADY_EXISTS,
482
- ApiErrorType.USER_ERROR,
483
- ApiErrorLevel.ERROR,
484
- )
485
485
  STRATEGY_DISABLED = (
486
486
  ApiErrorIdentifier.STRATEGY_DISABLED,
487
- ApiErrorType.USER_ERROR,
488
- ApiErrorLevel.ERROR,
487
+ ApiErrorType.NO_ERROR,
488
+ ApiErrorLevel.WARNING,
489
489
  )
490
490
  STRATEGY_LEVERAGE_MISMATCH = (
491
491
  ApiErrorIdentifier.STRATEGY_LEVERAGE_MISMATCH,
@@ -494,8 +494,8 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
494
494
  )
495
495
  STRATEGY_NOT_SUPPORTING_EXCHANGE = (
496
496
  ApiErrorIdentifier.STRATEGY_NOT_SUPPORTING_EXCHANGE,
497
- ApiErrorType.USER_ERROR,
498
- ApiErrorLevel.ERROR,
497
+ ApiErrorType.NO_ERROR,
498
+ ApiErrorLevel.WARNING,
499
499
  )
500
500
  SUCCESS = (ApiErrorIdentifier.SUCCESS, ApiErrorType.NO_ERROR, ApiErrorLevel.SUCCESS)
501
501
  SYMBOL_NOT_FOUND = (
@@ -585,6 +585,14 @@ class StatusCodeMapper:
585
585
  status.HTTP_401_UNAUTHORIZED,
586
586
  status.WS_1008_POLICY_VIOLATION,
587
587
  ),
588
+ ApiError.NO_API_KEY: (
589
+ status.HTTP_401_UNAUTHORIZED,
590
+ status.WS_1008_POLICY_VIOLATION,
591
+ ),
592
+ ApiError.NO_BEARER: (
593
+ status.HTTP_401_UNAUTHORIZED,
594
+ status.WS_1008_POLICY_VIOLATION,
595
+ ),
588
596
  ApiError.INSUFFICIENT_SCOPES: (
589
597
  status.HTTP_403_FORBIDDEN,
590
598
  status.WS_1008_POLICY_VIOLATION,
@@ -643,10 +651,6 @@ class StatusCodeMapper:
643
651
  status.HTTP_409_CONFLICT,
644
652
  status.WS_1008_POLICY_VIOLATION,
645
653
  ),
646
- ApiError.STRATEGY_ALREADY_EXISTS: (
647
- status.HTTP_409_CONFLICT,
648
- status.WS_1008_POLICY_VIOLATION,
649
- ),
650
654
  ApiError.NAME_NOT_UNIQUE: (
651
655
  status.HTTP_409_CONFLICT,
652
656
  status.WS_1008_POLICY_VIOLATION,
@@ -728,15 +732,15 @@ class StatusCodeMapper:
728
732
  status.HTTP_400_BAD_REQUEST,
729
733
  status.WS_1008_POLICY_VIOLATION,
730
734
  ),
731
- ApiError.ALLOCATION_BELOW_MINIMUM: (
735
+ ApiError.ALLOCATION_LIMIT_EXCEEDED: (
732
736
  status.HTTP_400_BAD_REQUEST,
733
737
  status.WS_1008_POLICY_VIOLATION,
734
738
  ),
735
- ApiError.BLACK_SWAN: (
739
+ ApiError.ALLOCATION_BELOW_MINIMUM: (
736
740
  status.HTTP_400_BAD_REQUEST,
737
741
  status.WS_1008_POLICY_VIOLATION,
738
742
  ),
739
- ApiError.BOT_DISABLED: (
743
+ ApiError.BLACK_SWAN: (
740
744
  status.HTTP_400_BAD_REQUEST,
741
745
  status.WS_1008_POLICY_VIOLATION,
742
746
  ),
@@ -768,7 +772,7 @@ class StatusCodeMapper:
768
772
  status.HTTP_400_BAD_REQUEST,
769
773
  status.WS_1008_POLICY_VIOLATION,
770
774
  ),
771
- ApiError.HTTP_ERROR: (
775
+ ApiError.EXCHANGE_HTTP_ERROR: (
772
776
  status.HTTP_400_BAD_REQUEST,
773
777
  status.WS_1008_POLICY_VIOLATION,
774
778
  ),
@@ -776,16 +780,15 @@ class StatusCodeMapper:
776
780
  status.HTTP_400_BAD_REQUEST,
777
781
  status.WS_1008_POLICY_VIOLATION,
778
782
  ),
779
- ApiError.INSUFFICIENT_MARGIN: status.HTTP_400_BAD_REQUEST,
780
- ApiError.INVALID_EXCHANGE_KEY: (
783
+ ApiError.INSUFFICIENT_MARGIN: (
781
784
  status.HTTP_400_BAD_REQUEST,
782
785
  status.WS_1008_POLICY_VIOLATION,
783
786
  ),
784
- ApiError.INVALID_MARGIN_MODE: (
787
+ ApiError.INVALID_EXCHANGE_KEY: (
785
788
  status.HTTP_400_BAD_REQUEST,
786
789
  status.WS_1008_POLICY_VIOLATION,
787
790
  ),
788
- ApiError.INVALID_PARAMETER: (
791
+ ApiError.EXCHANGE_INVALID_PARAMETER: (
789
792
  status.HTTP_400_BAD_REQUEST,
790
793
  status.WS_1008_POLICY_VIOLATION,
791
794
  ),
@@ -215,7 +215,7 @@ class Configuration:
215
215
  debug: Optional[bool] = None,
216
216
  ) -> None:
217
217
  """Constructor"""
218
- self._base_path = "http://localhost/v1/hive" if host is None else host
218
+ self._base_path = "https://api.crypticorn.dev/v1/hive" if host is None else host
219
219
  """Default Base url
220
220
  """
221
221
  self.server_index = 0 if server_index is None and host is None else server_index
@@ -557,7 +557,7 @@ class Configuration:
557
557
  """
558
558
  return [
559
559
  {
560
- "url": "http://localhost/v1/hive",
560
+ "url": "https://api.crypticorn.dev/v1/hive",
561
561
  "description": "No description provided",
562
562
  }
563
563
  ]
@@ -68,13 +68,13 @@ class ApiErrorIdentifier(str, Enum):
68
68
  INVALID_EXCHANGE_KEY = "invalid_exchange_key"
69
69
  INVALID_MARGIN_MODE = "invalid_margin_mode"
70
70
  INVALID_MODEL_NAME = "invalid_model_name"
71
- INVALID_PARAMETER_PROVIDED = "invalid_parameter_provided"
71
+ INVALID_PARAMETER_PROVIDED = "exchange_invalid_parameter"
72
72
  LEVERAGE_LIMIT_EXCEEDED = "leverage_limit_exceeded"
73
73
  ORDER_VIOLATES_LIQUIDATION_PRICE_CONSTRAINTS = (
74
74
  "order_violates_liquidation_price_constraints"
75
75
  )
76
76
  MARGIN_MODE_CLASH = "margin_mode_clash"
77
- MODEL_NAME_NOT_UNIQUE = "model_name_not_unique"
77
+ NAME_NOT_UNIQUE = "name_not_unique"
78
78
  NO_CREDENTIALS = "no_credentials"
79
79
  NOW_API_DOWN = "now_api_down"
80
80
  OBJECT_ALREADY_EXISTS = "object_already_exists"
crypticorn/hive/main.py CHANGED
@@ -1,21 +1,24 @@
1
+ from __future__ import annotations
2
+ import os
1
3
  import asyncio
2
4
  from pathlib import Path
3
- import os
5
+ from typing import TYPE_CHECKING, Optional
4
6
  from crypticorn.hive import (
5
7
  ApiClient,
6
8
  Configuration,
7
9
  ModelsApi,
8
10
  DataApi,
9
11
  StatusApi,
10
- Configuration,
11
12
  AdminApi,
12
13
  DataVersion,
13
14
  FeatureSize,
14
15
  )
15
16
  from crypticorn.hive.utils import download_file
16
- from typing import Optional
17
17
  from pydantic import StrictInt
18
18
 
19
+ if TYPE_CHECKING:
20
+ from aiohttp import ClientSession
21
+
19
22
 
20
23
  class DataApiWrapper(DataApi):
21
24
  """
@@ -82,11 +85,12 @@ class HiveClient:
82
85
  config_class = Configuration
83
86
 
84
87
  def __init__(
85
- self,
86
- config: Configuration,
88
+ self, config: Configuration, http_client: Optional[ClientSession] = None
87
89
  ):
88
90
  self.config = config
89
91
  self.base_client = ApiClient(configuration=self.config)
92
+ if http_client is not None:
93
+ self.base_client.rest_client.pool_manager = http_client
90
94
  # Instantiate all the endpoint clients
91
95
  self.models = ModelsApi(self.base_client)
92
96
  self.data = DataApiWrapper(self.base_client)
@@ -68,7 +68,7 @@ class ApiErrorIdentifier(str, Enum):
68
68
  INVALID_EXCHANGE_KEY = "invalid_exchange_key"
69
69
  INVALID_MARGIN_MODE = "invalid_margin_mode"
70
70
  INVALID_MODEL_NAME = "invalid_model_name"
71
- INVALID_PARAMETER_PROVIDED = "invalid_parameter_provided"
71
+ INVALID_PARAMETER_PROVIDED = "exchange_invalid_parameter"
72
72
  LEVERAGE_LIMIT_EXCEEDED = "leverage_limit_exceeded"
73
73
  ORDER_VIOLATES_LIQUIDATION_PRICE_CONSTRAINTS = (
74
74
  "order_violates_liquidation_price_constraints"
crypticorn/klines/main.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Optional
2
3
  from crypticorn.klines import (
3
4
  ApiClient,
4
5
  Configuration,
@@ -10,6 +11,9 @@ from crypticorn.klines import (
10
11
  )
11
12
  from crypticorn.common import optional_import
12
13
 
14
+ if TYPE_CHECKING:
15
+ from aiohttp import ClientSession
16
+
13
17
 
14
18
  class KlinesClient:
15
19
  """
@@ -21,9 +25,12 @@ class KlinesClient:
21
25
  def __init__(
22
26
  self,
23
27
  config: Configuration,
28
+ http_client: Optional[ClientSession] = None,
24
29
  ):
25
30
  self.config = config
26
31
  self.base_client = ApiClient(configuration=self.config)
32
+ if http_client is not None:
33
+ self.base_client.rest_client.pool_manager = http_client
27
34
  # Instantiate all the endpoint clients
28
35
  self.funding = FundingRatesApiWrapper(self.base_client)
29
36
  self.ohlcv = OHLCVDataApiWrapper(self.base_client)