crypticorn 2.11.0__py3-none-any.whl → 2.11.4__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 (28) hide show
  1. crypticorn/auth/client/configuration.py +2 -2
  2. crypticorn/auth/client/models/create_api_key_request.py +2 -1
  3. crypticorn/auth/client/models/get_api_keys200_response_inner.py +2 -1
  4. crypticorn/cli/templates/merge-env.sh +3 -5
  5. crypticorn/client.py +2 -2
  6. crypticorn/common/ansi_colors.py +1 -0
  7. crypticorn/common/auth.py +2 -3
  8. crypticorn/common/errors.py +1 -0
  9. crypticorn/common/exceptions.py +1 -0
  10. crypticorn/common/scopes.py +10 -0
  11. crypticorn/common/warnings.py +1 -0
  12. crypticorn/klines/main.py +13 -1
  13. crypticorn/metrics/client/__init__.py +4 -0
  14. crypticorn/metrics/client/api/exchanges_api.py +7 -6
  15. crypticorn/metrics/client/api/indicators_api.py +12 -6
  16. crypticorn/metrics/client/api/marketcap_api.py +49 -31
  17. crypticorn/metrics/client/configuration.py +2 -2
  18. crypticorn/metrics/client/models/__init__.py +4 -0
  19. crypticorn/metrics/client/models/exchange_availability.py +88 -0
  20. crypticorn/metrics/client/models/marketcap_ranking.py +9 -6
  21. crypticorn/metrics/client/models/marketcap_symbol_ranking.py +86 -0
  22. crypticorn/metrics/main.py +12 -19
  23. {crypticorn-2.11.0.dist-info → crypticorn-2.11.4.dist-info}/METADATA +9 -19
  24. {crypticorn-2.11.0.dist-info → crypticorn-2.11.4.dist-info}/RECORD +28 -26
  25. {crypticorn-2.11.0.dist-info → crypticorn-2.11.4.dist-info}/WHEEL +1 -1
  26. {crypticorn-2.11.0.dist-info → crypticorn-2.11.4.dist-info}/entry_points.txt +0 -0
  27. {crypticorn-2.11.0.dist-info → crypticorn-2.11.4.dist-info}/licenses/LICENSE +0 -0
  28. {crypticorn-2.11.0.dist-info → crypticorn-2.11.4.dist-info}/top_level.txt +0 -0
@@ -195,7 +195,7 @@ class Configuration:
195
195
  debug: Optional[bool] = None,
196
196
  ) -> None:
197
197
  """Constructor"""
198
- self._base_path = "http://localhost/v1/auth" if host is None else host
198
+ self._base_path = "https://api.crypticorn.dev/v1/auth" if host is None else host
199
199
  """Default Base url
200
200
  """
201
201
  self.server_index = 0 if server_index is None and host is None else server_index
@@ -528,7 +528,7 @@ class Configuration:
528
528
  """
529
529
  return [
530
530
  {
531
- "url": "http://localhost/v1/auth",
531
+ "url": "https://api.crypticorn.dev/v1/auth",
532
532
  "description": "No description provided",
533
533
  }
534
534
  ]
@@ -78,12 +78,13 @@ class CreateApiKeyRequest(BaseModel):
78
78
  "read:metrics:tokens",
79
79
  "read:metrics:markets",
80
80
  "read:sentiment",
81
+ "read:klines",
81
82
  "read:admin",
82
83
  "write:admin",
83
84
  ]
84
85
  ):
85
86
  raise ValueError(
86
- "each list item must be one of ('read:predictions', 'read:hive:model', 'read:hive:data', 'write:hive:model', 'read:trade:bots', 'write:trade:bots', 'read:trade:exchangekeys', 'write:trade:exchangekeys', 'read:trade:orders', 'read:trade:actions', 'write:trade:actions', 'read:trade:exchanges', 'read:trade:futures', 'write:trade:futures', 'read:trade:notifications', 'write:trade:notifications', 'read:trade:strategies', 'write:trade:strategies', 'read:pay:payments', 'read:pay:products', 'write:pay:products', 'read:pay:now', 'write:pay:now', 'read:metrics:marketcap', 'read:metrics:indicators', 'read:metrics:exchanges', 'read:metrics:tokens', 'read:metrics:markets', 'read:sentiment', 'read:admin', 'write:admin')"
87
+ "each list item must be one of ('read:predictions', 'read:hive:model', 'read:hive:data', 'write:hive:model', 'read:trade:bots', 'write:trade:bots', 'read:trade:exchangekeys', 'write:trade:exchangekeys', 'read:trade:orders', 'read:trade:actions', 'write:trade:actions', 'read:trade:exchanges', 'read:trade:futures', 'write:trade:futures', 'read:trade:notifications', 'write:trade:notifications', 'read:trade:strategies', 'write:trade:strategies', 'read:pay:payments', 'read:pay:products', 'write:pay:products', 'read:pay:now', 'write:pay:now', 'read:metrics:marketcap', 'read:metrics:indicators', 'read:metrics:exchanges', 'read:metrics:tokens', 'read:metrics:markets', 'read:sentiment', 'read:klines', 'read:admin', 'write:admin')"
87
88
  )
88
89
  return value
89
90
 
@@ -86,12 +86,13 @@ class GetApiKeys200ResponseInner(BaseModel):
86
86
  "read:metrics:tokens",
87
87
  "read:metrics:markets",
88
88
  "read:sentiment",
89
+ "read:klines",
89
90
  "read:admin",
90
91
  "write:admin",
91
92
  ]
92
93
  ):
93
94
  raise ValueError(
94
- "each list item must be one of ('read:predictions', 'read:hive:model', 'read:hive:data', 'write:hive:model', 'read:trade:bots', 'write:trade:bots', 'read:trade:exchangekeys', 'write:trade:exchangekeys', 'read:trade:orders', 'read:trade:actions', 'write:trade:actions', 'read:trade:exchanges', 'read:trade:futures', 'write:trade:futures', 'read:trade:notifications', 'write:trade:notifications', 'read:trade:strategies', 'write:trade:strategies', 'read:pay:payments', 'read:pay:products', 'write:pay:products', 'read:pay:now', 'write:pay:now', 'read:metrics:marketcap', 'read:metrics:indicators', 'read:metrics:exchanges', 'read:metrics:tokens', 'read:metrics:markets', 'read:sentiment', 'read:admin', 'write:admin')"
95
+ "each list item must be one of ('read:predictions', 'read:hive:model', 'read:hive:data', 'write:hive:model', 'read:trade:bots', 'write:trade:bots', 'read:trade:exchangekeys', 'write:trade:exchangekeys', 'read:trade:orders', 'read:trade:actions', 'write:trade:actions', 'read:trade:exchanges', 'read:trade:futures', 'write:trade:futures', 'read:trade:notifications', 'write:trade:notifications', 'read:trade:strategies', 'write:trade:strategies', 'read:pay:payments', 'read:pay:products', 'write:pay:products', 'read:pay:now', 'write:pay:now', 'read:metrics:marketcap', 'read:metrics:indicators', 'read:metrics:exchanges', 'read:metrics:tokens', 'read:metrics:markets', 'read:sentiment', 'read:klines', 'read:admin', 'write:admin')"
95
96
  )
96
97
  return value
97
98
 
@@ -1,17 +1,15 @@
1
1
  #!/usr/bin/env bash
2
-
3
2
  # this script merges the env variables from the environment and the .env.example file into the .env file
4
3
  # the appended variables take precedence over the .env.example variables (if both are set)
5
4
 
6
- # Make executable before running in github actions
7
- # chmod +x scripts/merge-env.sh
8
-
9
5
  # Usage in a github action:
10
6
  # - name: Generate .env
11
7
  # run: ./scripts/merge-env.sh
8
+ # add this after checkout before copying files to the host
12
9
 
13
10
  set -e
14
11
 
15
12
  cp .env.example .env
16
13
  echo >> .env
17
- printenv | awk -F= '{print $1"=\""substr($0, index($0,$2))"\""}' >> .env
14
+ echo "# Environment variables" >> .env
15
+ printenv | awk -F= '/^[a-zA-Z_][a-zA-Z0-9_]*=/{print $1"=\""substr($0, index($0,$2))"\""}' | sort | uniq >> .env
crypticorn/client.py CHANGED
@@ -119,8 +119,8 @@ class ApiClient:
119
119
  :param service: The service to configure.
120
120
 
121
121
  Example:
122
- >>> async with ApiClient(base_url=BaseUrl.DEV, jwt=jwt) as client:
123
- >>> client.configure(config=HiveConfig(host="http://localhost:8000"), client=client.hive)
122
+ >>> async with ApiClient() as client:
123
+ ... client.configure(config=HiveConfig(host="http://localhost:8000"), service=Service.HIVE)
124
124
  """
125
125
  assert Service.validate(service), f"Invalid service: {service}"
126
126
  client = self._services[service]
@@ -3,6 +3,7 @@ try:
3
3
  except ImportError:
4
4
  from strenum import StrEnum
5
5
 
6
+
6
7
  class AnsiColors(StrEnum):
7
8
  """Provides a collection of ANSI color codes for terminal text formatting, including regular, bright, and bold text colors. Useful for creating colorful and readable console output."""
8
9
 
crypticorn/common/auth.py CHANGED
@@ -19,6 +19,7 @@ from fastapi.security import (
19
19
  )
20
20
  from typing_extensions import Annotated
21
21
  from typing import Union
22
+
22
23
  # Auth Schemes
23
24
  http_bearer = HTTPBearer(
24
25
  bearerFormat="JWT",
@@ -160,9 +161,7 @@ class AuthHandler:
160
161
  bearer: Annotated[
161
162
  Union[HTTPAuthorizationCredentials, None], Depends(http_bearer)
162
163
  ] = None,
163
- api_key: Annotated[
164
- Union[str, None], Depends(apikey_header)
165
- ] = None,
164
+ api_key: Annotated[Union[str, None], Depends(apikey_header)] = None,
166
165
  sec: SecurityScopes = SecurityScopes(),
167
166
  ) -> Verify200Response:
168
167
  """
@@ -3,6 +3,7 @@
3
3
  from enum import Enum
4
4
  from fastapi import status
5
5
  from crypticorn.common.mixins import ApiErrorFallback
6
+
6
7
  try:
7
8
  from enum import StrEnum
8
9
  except ImportError:
@@ -6,6 +6,7 @@ from fastapi.responses import JSONResponse
6
6
  from crypticorn.common import ApiError, ApiErrorIdentifier, ApiErrorType, ApiErrorLevel
7
7
  import logging
8
8
  import json
9
+
9
10
  try:
10
11
  from enum import StrEnum
11
12
  except ImportError:
@@ -55,6 +55,9 @@ class Scope(StrEnum):
55
55
  # Sentiment scopes
56
56
  READ_SENTIMENT = "read:sentiment"
57
57
 
58
+ # Klines scopes
59
+ READ_KLINES = "read:klines"
60
+
58
61
  @classmethod
59
62
  def admin_scopes(cls) -> list["Scope"]:
60
63
  """Scopes that are only available to admins."""
@@ -77,4 +80,11 @@ class Scope(StrEnum):
77
80
  """Scopes that can be purchased."""
78
81
  return [
79
82
  cls.READ_PREDICTIONS,
83
+ cls.READ_METRICS_MARKETCAP,
84
+ cls.READ_METRICS_INDICATORS,
85
+ cls.READ_METRICS_EXCHANGES,
86
+ cls.READ_METRICS_TOKENS,
87
+ cls.READ_METRICS_MARKETS,
88
+ cls.READ_KLINES,
89
+ cls.READ_SENTIMENT,
80
90
  ]
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
  from typing import Union
5
5
 
6
+
6
7
  class CrypticornDeprecationWarning(DeprecationWarning):
7
8
  """A Crypticorn specific deprecation warning.
8
9
 
crypticorn/klines/main.py CHANGED
@@ -65,7 +65,19 @@ class OHLCVDataApiWrapper(OHLCVDataApi):
65
65
  """
66
66
  pd = optional_import("pandas", "extra")
67
67
  response = await self.get_ohlcv(*args, **kwargs)
68
- return pd.DataFrame(response)
68
+ rows = []
69
+ for item in response:
70
+ row = {
71
+ 'timestamp': item.timestamp,
72
+ 'open': item.open,
73
+ 'high': item.high,
74
+ 'low': item.low,
75
+ 'close': item.close,
76
+ 'volume': item.volume
77
+ }
78
+ rows.append(row)
79
+ df = pd.DataFrame(rows)
80
+ return df
69
81
 
70
82
 
71
83
  class SymbolsApiWrapper(SymbolsApi):
@@ -43,11 +43,15 @@ from crypticorn.metrics.client.models.api_error_identifier import ApiErrorIdenti
43
43
  from crypticorn.metrics.client.models.api_error_level import ApiErrorLevel
44
44
  from crypticorn.metrics.client.models.api_error_type import ApiErrorType
45
45
  from crypticorn.metrics.client.models.exception_detail import ExceptionDetail
46
+ from crypticorn.metrics.client.models.exchange_availability import ExchangeAvailability
46
47
  from crypticorn.metrics.client.models.exchange_mapping import ExchangeMapping
47
48
  from crypticorn.metrics.client.models.internal_exchange import InternalExchange
48
49
  from crypticorn.metrics.client.models.log_level import LogLevel
49
50
  from crypticorn.metrics.client.models.market_type import MarketType
50
51
  from crypticorn.metrics.client.models.marketcap_ranking import MarketcapRanking
52
+ from crypticorn.metrics.client.models.marketcap_symbol_ranking import (
53
+ MarketcapSymbolRanking,
54
+ )
51
55
  from crypticorn.metrics.client.models.ohlcv import OHLCV
52
56
  from crypticorn.metrics.client.models.severity import Severity
53
57
  from crypticorn.metrics.client.models.time_interval import TimeInterval
@@ -17,8 +17,9 @@ from typing import Any, Dict, List, Optional, Tuple, Union
17
17
  from typing_extensions import Annotated
18
18
 
19
19
  from pydantic import Field, StrictInt, StrictStr
20
- from typing import Any, Dict, List, Optional
20
+ from typing import List, Optional
21
21
  from typing_extensions import Annotated
22
+ from crypticorn.metrics.client.models.exchange_availability import ExchangeAvailability
22
23
  from crypticorn.metrics.client.models.exchange_mapping import ExchangeMapping
23
24
  from crypticorn.metrics.client.models.internal_exchange import InternalExchange
24
25
  from crypticorn.metrics.client.models.market_type import MarketType
@@ -88,7 +89,7 @@ class ExchangesApi:
88
89
  _content_type: Optional[StrictStr] = None,
89
90
  _headers: Optional[Dict[StrictStr, Any]] = None,
90
91
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
91
- ) -> List[Dict[str, object]]:
92
+ ) -> List[ExchangeAvailability]:
92
93
  """Get Available Exchanges
93
94
 
94
95
  Get available exchanges for a symbol with various filtering options.
@@ -144,7 +145,7 @@ class ExchangesApi:
144
145
  )
145
146
 
146
147
  _response_types_map: Dict[str, Optional[str]] = {
147
- "200": "List[Dict[str, object]]",
148
+ "200": "List[ExchangeAvailability]",
148
149
  }
149
150
  response_data = await self.api_client.call_api(
150
151
  *_param, _request_timeout=_request_timeout
@@ -201,7 +202,7 @@ class ExchangesApi:
201
202
  _content_type: Optional[StrictStr] = None,
202
203
  _headers: Optional[Dict[StrictStr, Any]] = None,
203
204
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
204
- ) -> ApiResponse[List[Dict[str, object]]]:
205
+ ) -> ApiResponse[List[ExchangeAvailability]]:
205
206
  """Get Available Exchanges
206
207
 
207
208
  Get available exchanges for a symbol with various filtering options.
@@ -257,7 +258,7 @@ class ExchangesApi:
257
258
  )
258
259
 
259
260
  _response_types_map: Dict[str, Optional[str]] = {
260
- "200": "List[Dict[str, object]]",
261
+ "200": "List[ExchangeAvailability]",
261
262
  }
262
263
  response_data = await self.api_client.call_api(
263
264
  *_param, _request_timeout=_request_timeout
@@ -370,7 +371,7 @@ class ExchangesApi:
370
371
  )
371
372
 
372
373
  _response_types_map: Dict[str, Optional[str]] = {
373
- "200": "List[Dict[str, object]]",
374
+ "200": "List[ExchangeAvailability]",
374
375
  }
375
376
  response_data = await self.api_client.call_api(
376
377
  *_param, _request_timeout=_request_timeout
@@ -44,7 +44,9 @@ class IndicatorsApi:
44
44
  symbol: Annotated[
45
45
  StrictStr, Field(description="Symbol to fetch KER indicator for")
46
46
  ],
47
- market: Annotated[Optional[MarketType], Field(description="Market")] = None,
47
+ market: Annotated[
48
+ Optional[MarketType], Field(description="Market. Defaults to futures.")
49
+ ] = None,
48
50
  period: Annotated[
49
51
  Optional[StrictInt], Field(description="KER indicator period")
50
52
  ] = None,
@@ -70,7 +72,7 @@ class IndicatorsApi:
70
72
 
71
73
  :param symbol: Symbol to fetch KER indicator for (required)
72
74
  :type symbol: str
73
- :param market: Market
75
+ :param market: Market. Defaults to futures.
74
76
  :type market: MarketType
75
77
  :param period: KER indicator period
76
78
  :type period: int
@@ -127,7 +129,9 @@ class IndicatorsApi:
127
129
  symbol: Annotated[
128
130
  StrictStr, Field(description="Symbol to fetch KER indicator for")
129
131
  ],
130
- market: Annotated[Optional[MarketType], Field(description="Market")] = None,
132
+ market: Annotated[
133
+ Optional[MarketType], Field(description="Market. Defaults to futures.")
134
+ ] = None,
131
135
  period: Annotated[
132
136
  Optional[StrictInt], Field(description="KER indicator period")
133
137
  ] = None,
@@ -153,7 +157,7 @@ class IndicatorsApi:
153
157
 
154
158
  :param symbol: Symbol to fetch KER indicator for (required)
155
159
  :type symbol: str
156
- :param market: Market
160
+ :param market: Market. Defaults to futures.
157
161
  :type market: MarketType
158
162
  :param period: KER indicator period
159
163
  :type period: int
@@ -210,7 +214,9 @@ class IndicatorsApi:
210
214
  symbol: Annotated[
211
215
  StrictStr, Field(description="Symbol to fetch KER indicator for")
212
216
  ],
213
- market: Annotated[Optional[MarketType], Field(description="Market")] = None,
217
+ market: Annotated[
218
+ Optional[MarketType], Field(description="Market. Defaults to futures.")
219
+ ] = None,
214
220
  period: Annotated[
215
221
  Optional[StrictInt], Field(description="KER indicator period")
216
222
  ] = None,
@@ -236,7 +242,7 @@ class IndicatorsApi:
236
242
 
237
243
  :param symbol: Symbol to fetch KER indicator for (required)
238
244
  :type symbol: str
239
- :param market: Market
245
+ :param market: Market. Defaults to futures.
240
246
  :type market: MarketType
241
247
  :param period: KER indicator period
242
248
  :type period: int
@@ -21,6 +21,9 @@ from typing import Any, Dict, List, Optional
21
21
  from typing_extensions import Annotated
22
22
  from crypticorn.metrics.client.models.market_type import MarketType
23
23
  from crypticorn.metrics.client.models.marketcap_ranking import MarketcapRanking
24
+ from crypticorn.metrics.client.models.marketcap_symbol_ranking import (
25
+ MarketcapSymbolRanking,
26
+ )
24
27
  from crypticorn.metrics.client.models.ohlcv import OHLCV
25
28
 
26
29
  from crypticorn.metrics.client.api_client import ApiClient, RequestSerialized
@@ -313,7 +316,7 @@ class MarketcapApi:
313
316
  _content_type: Optional[StrictStr] = None,
314
317
  _headers: Optional[Dict[StrictStr, Any]] = None,
315
318
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
316
- ) -> List[Dict[str, object]]:
319
+ ) -> List[MarketcapRanking]:
317
320
  """Get Marketcap Between Timestamps
318
321
 
319
322
  Retrieve marketcap data between timestamps.
@@ -354,7 +357,7 @@ class MarketcapApi:
354
357
  )
355
358
 
356
359
  _response_types_map: Dict[str, Optional[str]] = {
357
- "200": "List[Dict[str, object]]",
360
+ "200": "List[MarketcapRanking]",
358
361
  }
359
362
  response_data = await self.api_client.call_api(
360
363
  *_param, _request_timeout=_request_timeout
@@ -385,7 +388,7 @@ class MarketcapApi:
385
388
  _content_type: Optional[StrictStr] = None,
386
389
  _headers: Optional[Dict[StrictStr, Any]] = None,
387
390
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
388
- ) -> ApiResponse[List[Dict[str, object]]]:
391
+ ) -> ApiResponse[List[MarketcapRanking]]:
389
392
  """Get Marketcap Between Timestamps
390
393
 
391
394
  Retrieve marketcap data between timestamps.
@@ -426,7 +429,7 @@ class MarketcapApi:
426
429
  )
427
430
 
428
431
  _response_types_map: Dict[str, Optional[str]] = {
429
- "200": "List[Dict[str, object]]",
432
+ "200": "List[MarketcapRanking]",
430
433
  }
431
434
  response_data = await self.api_client.call_api(
432
435
  *_param, _request_timeout=_request_timeout
@@ -498,7 +501,7 @@ class MarketcapApi:
498
501
  )
499
502
 
500
503
  _response_types_map: Dict[str, Optional[str]] = {
501
- "200": "List[Dict[str, object]]",
504
+ "200": "List[MarketcapRanking]",
502
505
  }
503
506
  response_data = await self.api_client.call_api(
504
507
  *_param, _request_timeout=_request_timeout
@@ -581,11 +584,15 @@ class MarketcapApi:
581
584
  ] = None,
582
585
  market: Annotated[
583
586
  Optional[MarketType],
584
- Field(description="Market for which to fetch symbols and marketcap data"),
587
+ Field(
588
+ description="Market for which to fetch symbols and marketcap data. Defaults to futures."
589
+ ),
585
590
  ] = None,
586
591
  exchange: Annotated[
587
592
  Optional[StrictStr],
588
- Field(description="Exchange for which to fetch symbols and marketcap data"),
593
+ Field(
594
+ description="Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned."
595
+ ),
589
596
  ] = None,
590
597
  _request_timeout: Union[
591
598
  None,
@@ -598,10 +605,10 @@ class MarketcapApi:
598
605
  _content_type: Optional[StrictStr] = None,
599
606
  _headers: Optional[Dict[StrictStr, Any]] = None,
600
607
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
601
- ) -> List[MarketcapRanking]:
608
+ ) -> List[MarketcapSymbolRanking]:
602
609
  """Get Symbols Marketcap Between Timestamps
603
610
 
604
- Retrieve marketcap data for symbols between timestamps with optional filtering.
611
+ Retrieve a ranking of symbols by marketcap between timestamps.
605
612
 
606
613
  :param start_timestamp: Start timestamp
607
614
  :type start_timestamp: int
@@ -609,9 +616,9 @@ class MarketcapApi:
609
616
  :type end_timestamp: int
610
617
  :param interval: Interval for which to fetch symbols and marketcap data
611
618
  :type interval: str
612
- :param market: Market for which to fetch symbols and marketcap data
619
+ :param market: Market for which to fetch symbols and marketcap data. Defaults to futures.
613
620
  :type market: MarketType
614
- :param exchange: Exchange for which to fetch symbols and marketcap data
621
+ :param exchange: Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned.
615
622
  :type exchange: str
616
623
  :param _request_timeout: timeout setting for this request. If one
617
624
  number provided, it will be total request
@@ -648,7 +655,7 @@ class MarketcapApi:
648
655
  )
649
656
 
650
657
  _response_types_map: Dict[str, Optional[str]] = {
651
- "200": "List[MarketcapRanking]",
658
+ "200": "List[MarketcapSymbolRanking]",
652
659
  }
653
660
  response_data = await self.api_client.call_api(
654
661
  *_param, _request_timeout=_request_timeout
@@ -674,11 +681,15 @@ class MarketcapApi:
674
681
  ] = None,
675
682
  market: Annotated[
676
683
  Optional[MarketType],
677
- Field(description="Market for which to fetch symbols and marketcap data"),
684
+ Field(
685
+ description="Market for which to fetch symbols and marketcap data. Defaults to futures."
686
+ ),
678
687
  ] = None,
679
688
  exchange: Annotated[
680
689
  Optional[StrictStr],
681
- Field(description="Exchange for which to fetch symbols and marketcap data"),
690
+ Field(
691
+ description="Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned."
692
+ ),
682
693
  ] = None,
683
694
  _request_timeout: Union[
684
695
  None,
@@ -691,10 +702,10 @@ class MarketcapApi:
691
702
  _content_type: Optional[StrictStr] = None,
692
703
  _headers: Optional[Dict[StrictStr, Any]] = None,
693
704
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
694
- ) -> ApiResponse[List[MarketcapRanking]]:
705
+ ) -> ApiResponse[List[MarketcapSymbolRanking]]:
695
706
  """Get Symbols Marketcap Between Timestamps
696
707
 
697
- Retrieve marketcap data for symbols between timestamps with optional filtering.
708
+ Retrieve a ranking of symbols by marketcap between timestamps.
698
709
 
699
710
  :param start_timestamp: Start timestamp
700
711
  :type start_timestamp: int
@@ -702,9 +713,9 @@ class MarketcapApi:
702
713
  :type end_timestamp: int
703
714
  :param interval: Interval for which to fetch symbols and marketcap data
704
715
  :type interval: str
705
- :param market: Market for which to fetch symbols and marketcap data
716
+ :param market: Market for which to fetch symbols and marketcap data. Defaults to futures.
706
717
  :type market: MarketType
707
- :param exchange: Exchange for which to fetch symbols and marketcap data
718
+ :param exchange: Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned.
708
719
  :type exchange: str
709
720
  :param _request_timeout: timeout setting for this request. If one
710
721
  number provided, it will be total request
@@ -741,7 +752,7 @@ class MarketcapApi:
741
752
  )
742
753
 
743
754
  _response_types_map: Dict[str, Optional[str]] = {
744
- "200": "List[MarketcapRanking]",
755
+ "200": "List[MarketcapSymbolRanking]",
745
756
  }
746
757
  response_data = await self.api_client.call_api(
747
758
  *_param, _request_timeout=_request_timeout
@@ -767,11 +778,15 @@ class MarketcapApi:
767
778
  ] = None,
768
779
  market: Annotated[
769
780
  Optional[MarketType],
770
- Field(description="Market for which to fetch symbols and marketcap data"),
781
+ Field(
782
+ description="Market for which to fetch symbols and marketcap data. Defaults to futures."
783
+ ),
771
784
  ] = None,
772
785
  exchange: Annotated[
773
786
  Optional[StrictStr],
774
- Field(description="Exchange for which to fetch symbols and marketcap data"),
787
+ Field(
788
+ description="Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned."
789
+ ),
775
790
  ] = None,
776
791
  _request_timeout: Union[
777
792
  None,
@@ -787,7 +802,7 @@ class MarketcapApi:
787
802
  ) -> RESTResponseType:
788
803
  """Get Symbols Marketcap Between Timestamps
789
804
 
790
- Retrieve marketcap data for symbols between timestamps with optional filtering.
805
+ Retrieve a ranking of symbols by marketcap between timestamps.
791
806
 
792
807
  :param start_timestamp: Start timestamp
793
808
  :type start_timestamp: int
@@ -795,9 +810,9 @@ class MarketcapApi:
795
810
  :type end_timestamp: int
796
811
  :param interval: Interval for which to fetch symbols and marketcap data
797
812
  :type interval: str
798
- :param market: Market for which to fetch symbols and marketcap data
813
+ :param market: Market for which to fetch symbols and marketcap data. Defaults to futures.
799
814
  :type market: MarketType
800
- :param exchange: Exchange for which to fetch symbols and marketcap data
815
+ :param exchange: Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned.
801
816
  :type exchange: str
802
817
  :param _request_timeout: timeout setting for this request. If one
803
818
  number provided, it will be total request
@@ -834,7 +849,7 @@ class MarketcapApi:
834
849
  )
835
850
 
836
851
  _response_types_map: Dict[str, Optional[str]] = {
837
- "200": "List[MarketcapRanking]",
852
+ "200": "List[MarketcapSymbolRanking]",
838
853
  }
839
854
  response_data = await self.api_client.call_api(
840
855
  *_param, _request_timeout=_request_timeout
@@ -928,7 +943,8 @@ class MarketcapApi:
928
943
  Optional[StrictStr], Field(description="Timeframe for OHLCV data")
929
944
  ] = None,
930
945
  market: Annotated[
931
- Optional[MarketType], Field(description="Market for OHLCV data")
946
+ Optional[MarketType],
947
+ Field(description="Market for OHLCV data. Defaults to futures."),
932
948
  ] = None,
933
949
  top_n: Annotated[
934
950
  Optional[StrictInt], Field(description="Number of symbols to fetch")
@@ -957,7 +973,7 @@ class MarketcapApi:
957
973
  :type timestamp: int
958
974
  :param timeframe: Timeframe for OHLCV data
959
975
  :type timeframe: str
960
- :param market: Market for OHLCV data
976
+ :param market: Market for OHLCV data. Defaults to futures.
961
977
  :type market: MarketType
962
978
  :param top_n: Number of symbols to fetch
963
979
  :type top_n: int
@@ -1020,7 +1036,8 @@ class MarketcapApi:
1020
1036
  Optional[StrictStr], Field(description="Timeframe for OHLCV data")
1021
1037
  ] = None,
1022
1038
  market: Annotated[
1023
- Optional[MarketType], Field(description="Market for OHLCV data")
1039
+ Optional[MarketType],
1040
+ Field(description="Market for OHLCV data. Defaults to futures."),
1024
1041
  ] = None,
1025
1042
  top_n: Annotated[
1026
1043
  Optional[StrictInt], Field(description="Number of symbols to fetch")
@@ -1049,7 +1066,7 @@ class MarketcapApi:
1049
1066
  :type timestamp: int
1050
1067
  :param timeframe: Timeframe for OHLCV data
1051
1068
  :type timeframe: str
1052
- :param market: Market for OHLCV data
1069
+ :param market: Market for OHLCV data. Defaults to futures.
1053
1070
  :type market: MarketType
1054
1071
  :param top_n: Number of symbols to fetch
1055
1072
  :type top_n: int
@@ -1112,7 +1129,8 @@ class MarketcapApi:
1112
1129
  Optional[StrictStr], Field(description="Timeframe for OHLCV data")
1113
1130
  ] = None,
1114
1131
  market: Annotated[
1115
- Optional[MarketType], Field(description="Market for OHLCV data")
1132
+ Optional[MarketType],
1133
+ Field(description="Market for OHLCV data. Defaults to futures."),
1116
1134
  ] = None,
1117
1135
  top_n: Annotated[
1118
1136
  Optional[StrictInt], Field(description="Number of symbols to fetch")
@@ -1141,7 +1159,7 @@ class MarketcapApi:
1141
1159
  :type timestamp: int
1142
1160
  :param timeframe: Timeframe for OHLCV data
1143
1161
  :type timeframe: str
1144
- :param market: Market for OHLCV data
1162
+ :param market: Market for OHLCV data. Defaults to futures.
1145
1163
  :type market: MarketType
1146
1164
  :param top_n: Number of symbols to fetch
1147
1165
  :type top_n: int
@@ -215,7 +215,7 @@ class Configuration:
215
215
  debug: Optional[bool] = None,
216
216
  ) -> None:
217
217
  """Constructor"""
218
- self._base_path = "http://127.0.0.1:8000/v1/metrics" if host is None else host
218
+ self._base_path = "http://localhost/v1/metrics" 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://127.0.0.1:8000/v1/metrics",
560
+ "url": "http://localhost/v1/metrics",
561
561
  "description": "No description provided",
562
562
  }
563
563
  ]
@@ -18,11 +18,15 @@ from crypticorn.metrics.client.models.api_error_identifier import ApiErrorIdenti
18
18
  from crypticorn.metrics.client.models.api_error_level import ApiErrorLevel
19
19
  from crypticorn.metrics.client.models.api_error_type import ApiErrorType
20
20
  from crypticorn.metrics.client.models.exception_detail import ExceptionDetail
21
+ from crypticorn.metrics.client.models.exchange_availability import ExchangeAvailability
21
22
  from crypticorn.metrics.client.models.exchange_mapping import ExchangeMapping
22
23
  from crypticorn.metrics.client.models.internal_exchange import InternalExchange
23
24
  from crypticorn.metrics.client.models.log_level import LogLevel
24
25
  from crypticorn.metrics.client.models.market_type import MarketType
25
26
  from crypticorn.metrics.client.models.marketcap_ranking import MarketcapRanking
27
+ from crypticorn.metrics.client.models.marketcap_symbol_ranking import (
28
+ MarketcapSymbolRanking,
29
+ )
26
30
  from crypticorn.metrics.client.models.ohlcv import OHLCV
27
31
  from crypticorn.metrics.client.models.severity import Severity
28
32
  from crypticorn.metrics.client.models.time_interval import TimeInterval
@@ -0,0 +1,88 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Marketcap Service API
5
+
6
+ API for retrieving historical marketcap data, available exchanges, and indicators.
7
+
8
+ The version of the OpenAPI document: 1.0.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictInt
21
+ from typing import Any, ClassVar, Dict, List
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+
26
+ class ExchangeAvailability(BaseModel):
27
+ """
28
+ ExchangeAvailability
29
+ """ # noqa: E501
30
+
31
+ timestamp: StrictInt = Field(description="The timestamp of the availability")
32
+ exchanges: Dict[str, StrictBool] = Field(
33
+ description="The availability of the exchange. Returns a dictionary of exchange names and their availability as a boolean."
34
+ )
35
+ __properties: ClassVar[List[str]] = ["timestamp", "exchanges"]
36
+
37
+ model_config = ConfigDict(
38
+ populate_by_name=True,
39
+ validate_assignment=True,
40
+ protected_namespaces=(),
41
+ )
42
+
43
+ def to_str(self) -> str:
44
+ """Returns the string representation of the model using alias"""
45
+ return pprint.pformat(self.model_dump(by_alias=True))
46
+
47
+ def to_json(self) -> str:
48
+ """Returns the JSON representation of the model using alias"""
49
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
50
+ return json.dumps(self.to_dict())
51
+
52
+ @classmethod
53
+ def from_json(cls, json_str: str) -> Optional[Self]:
54
+ """Create an instance of ExchangeAvailability from a JSON string"""
55
+ return cls.from_dict(json.loads(json_str))
56
+
57
+ def to_dict(self) -> Dict[str, Any]:
58
+ """Return the dictionary representation of the model using alias.
59
+
60
+ This has the following differences from calling pydantic's
61
+ `self.model_dump(by_alias=True)`:
62
+
63
+ * `None` is only added to the output dict for nullable fields that
64
+ were set at model initialization. Other fields with value `None`
65
+ are ignored.
66
+ """
67
+ excluded_fields: Set[str] = set([])
68
+
69
+ _dict = self.model_dump(
70
+ by_alias=True,
71
+ exclude=excluded_fields,
72
+ exclude_none=True,
73
+ )
74
+ return _dict
75
+
76
+ @classmethod
77
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
78
+ """Create an instance of ExchangeAvailability from a dict"""
79
+ if obj is None:
80
+ return None
81
+
82
+ if not isinstance(obj, dict):
83
+ return cls.model_validate(obj)
84
+
85
+ _obj = cls.model_validate(
86
+ {"timestamp": obj.get("timestamp"), "exchanges": obj.get("exchanges")}
87
+ )
88
+ return _obj
@@ -17,20 +17,20 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr
21
- from typing import Any, ClassVar, Dict, List, Optional
20
+ from pydantic import BaseModel, ConfigDict, StrictFloat, StrictInt
21
+ from typing import Any, ClassVar, Dict, List, Optional, Union
22
22
  from typing import Optional, Set
23
23
  from typing_extensions import Self
24
24
 
25
25
 
26
26
  class MarketcapRanking(BaseModel):
27
27
  """
28
- MarketcapRanking
28
+ A ranking of symbols by marketcap at a given timestamp.
29
29
  """ # noqa: E501
30
30
 
31
31
  timestamp: StrictInt
32
- symbols: List[Optional[StrictStr]]
33
- __properties: ClassVar[List[str]] = ["timestamp", "symbols"]
32
+ marketcap_values: List[Optional[Union[StrictFloat, StrictInt]]]
33
+ __properties: ClassVar[List[str]] = ["timestamp", "marketcap_values"]
34
34
 
35
35
  model_config = ConfigDict(
36
36
  populate_by_name=True,
@@ -81,6 +81,9 @@ class MarketcapRanking(BaseModel):
81
81
  return cls.model_validate(obj)
82
82
 
83
83
  _obj = cls.model_validate(
84
- {"timestamp": obj.get("timestamp"), "symbols": obj.get("symbols")}
84
+ {
85
+ "timestamp": obj.get("timestamp"),
86
+ "marketcap_values": obj.get("marketcap_values"),
87
+ }
85
88
  )
86
89
  return _obj
@@ -0,0 +1,86 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Marketcap Service API
5
+
6
+ API for retrieving historical marketcap data, available exchanges, and indicators.
7
+
8
+ The version of the OpenAPI document: 1.0.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+
26
+ class MarketcapSymbolRanking(BaseModel):
27
+ """
28
+ A ranking of marketcap values at a given timestamp.
29
+ """ # noqa: E501
30
+
31
+ timestamp: StrictInt
32
+ symbols: List[Optional[StrictStr]]
33
+ __properties: ClassVar[List[str]] = ["timestamp", "symbols"]
34
+
35
+ model_config = ConfigDict(
36
+ populate_by_name=True,
37
+ validate_assignment=True,
38
+ protected_namespaces=(),
39
+ )
40
+
41
+ def to_str(self) -> str:
42
+ """Returns the string representation of the model using alias"""
43
+ return pprint.pformat(self.model_dump(by_alias=True))
44
+
45
+ def to_json(self) -> str:
46
+ """Returns the JSON representation of the model using alias"""
47
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
48
+ return json.dumps(self.to_dict())
49
+
50
+ @classmethod
51
+ def from_json(cls, json_str: str) -> Optional[Self]:
52
+ """Create an instance of MarketcapSymbolRanking from a JSON string"""
53
+ return cls.from_dict(json.loads(json_str))
54
+
55
+ def to_dict(self) -> Dict[str, Any]:
56
+ """Return the dictionary representation of the model using alias.
57
+
58
+ This has the following differences from calling pydantic's
59
+ `self.model_dump(by_alias=True)`:
60
+
61
+ * `None` is only added to the output dict for nullable fields that
62
+ were set at model initialization. Other fields with value `None`
63
+ are ignored.
64
+ """
65
+ excluded_fields: Set[str] = set([])
66
+
67
+ _dict = self.model_dump(
68
+ by_alias=True,
69
+ exclude=excluded_fields,
70
+ exclude_none=True,
71
+ )
72
+ return _dict
73
+
74
+ @classmethod
75
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
76
+ """Create an instance of MarketcapSymbolRanking from a dict"""
77
+ if obj is None:
78
+ return None
79
+
80
+ if not isinstance(obj, dict):
81
+ return cls.model_validate(obj)
82
+
83
+ _obj = cls.model_validate(
84
+ {"timestamp": obj.get("timestamp"), "symbols": obj.get("symbols")}
85
+ )
86
+ return _obj
@@ -54,7 +54,7 @@ class MarketcapApiWrapper(MarketcapApi):
54
54
  rows = []
55
55
  for item in response:
56
56
  row = {"timestamp": item.timestamp}
57
- row.update({i+1: sym for i, sym in enumerate(item.symbols)})
57
+ row.update({i + 1: sym for i, sym in enumerate(item.symbols)})
58
58
  rows.append(row)
59
59
  df = pd.DataFrame(rows)
60
60
  return df
@@ -93,22 +93,15 @@ class ExchangesApiWrapper(ExchangesApi):
93
93
  """
94
94
  pd = optional_import("pandas", "extra")
95
95
  response = await self.get_available_exchanges(*args, **kwargs)
96
- processed_results = []
97
- for row in response:
98
- data = {"timestamp": row["timestamp"]}
99
- data.update(row["exchanges"])
100
- processed_results.append(data)
101
-
102
- # Create DataFrame and sort columns
103
- df = pd.DataFrame(processed_results)
104
- cols = ["timestamp"] + sorted([col for col in df.columns if col != "timestamp"])
105
- df = df[cols]
106
-
107
- # Convert exchange availability to boolean integers (0/1)
108
- df = df.astype(
109
- {
110
- "timestamp": "int64",
111
- **{col: "int8" for col in df.columns if col != "timestamp"},
112
- }
113
- )
96
+
97
+ # Create list of dictionaries with timestamp and flattened exchange data
98
+ rows = []
99
+ for item in response:
100
+ row = {"timestamp": item.timestamp}
101
+ row.update(
102
+ item.exchanges
103
+ ) # This spreads the exchanges dict into individual columns
104
+ rows.append(row)
105
+
106
+ df = pd.DataFrame(rows)
114
107
  return df
@@ -1,23 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crypticorn
3
- Version: 2.11.0
3
+ Version: 2.11.4
4
4
  Summary: Maximise Your Crypto Trading Profits with Machine Learning
5
5
  Author-email: Crypticorn <timon@crypticorn.com>
6
- License: Copyright © 2025 Crypticorn
7
-
8
- All rights reserved. This software and accompanying documentation files (collectively referred to as "the Software") are the proprietary property of Crypticorn. Any unauthorised reproduction, modification, integration, publication, distribution, sublicensing, sale, or enabling access to the Software without explicit written permission from Crypticorn is strictly prohibited, subject to the conditions outlined herein:
9
-
10
- 1. The aforementioned copyright notice and this permission notice must be included unaltered in all copies, or significant portions, of the Software.
11
-
12
- 2. The Software is provided "AS IS", without any warranty, whether express or implied. Crypticorn expressly disclaims any guarantees, including but not limited to those of satisfactory quality, fitness for a particular purpose, or non-infringement of third-party rights.
13
-
14
- 3. In no event shall Crypticorn, its authors, or copyright holders be held liable for any claim, damages, or other liability arising from or associated with the use of the Software or any other dealings involving the Software, to the extent that such liability can be limited or excluded by applicable law.
15
-
16
- Changes to this agreement may be made without notice, and it is the user's responsibility to keep abreast of any changes. This agreement and its interpretation are subject to the laws of the Federal Republic of Germany.
17
-
18
- If any provision of this license agreement is held to be invalid or unenforceable under applicable law, the remaining provisions will continue in full force and effect. Crypticorn's failure to enforce any provision of this agreement does not constitute a waiver of its right to do so in the future.
19
-
20
- This agreement is written in English. In the event of any discrepancy between the English version and any translation, the English version shall prevail.
6
+ License-Expression: MIT
21
7
  Project-URL: Homepage, https://crypticorn.com
22
8
  Project-URL: Documentation, https://docs.crypticorn.com
23
9
  Project-URL: Dashboard, https://app.crypticorn.com
@@ -26,7 +12,6 @@ Classifier: Topic :: Scientific/Engineering
26
12
  Classifier: Development Status :: 4 - Beta
27
13
  Classifier: Intended Audience :: Developers
28
14
  Classifier: Operating System :: OS Independent
29
- Classifier: License :: OSI Approved :: MIT License
30
15
  Classifier: Programming Language :: Python :: 3.10
31
16
  Classifier: Programming Language :: Python :: 3.11
32
17
  Classifier: Programming Language :: Python :: 3.12
@@ -99,7 +84,7 @@ from crypticorn import ApiClient
99
84
  ```
100
85
  The ApiClient serves as the central interface for API operations. It instantiates multiple API wrappers corresponding to our micro services. These are structured the following:
101
86
 
102
- <img src="pip-structure.svg" alt="pip package structure" />
87
+ <img src="static/pip-structure.svg" alt="pip package structure" />
103
88
 
104
89
  You can either explore each API by clicking through the library or checkout the [API Documentation](https://docs.crypticorn.com/api).
105
90
 
@@ -116,7 +101,12 @@ from crypticorn.common import Scope, Exchange
116
101
 
117
102
  ## Authentication
118
103
 
119
- To get started, [create an API key in your dashboard](https://app.crypticorn.com/account/developer). Then instantiate the `ApiClient` class with your copied key.
104
+ To get started, [create an API key in your dashboard](https://app.crypticorn.com/account/developer).
105
+
106
+ The scopes you can assign, resemble the [package structure](#structure). The first part defines if the scopes is for reading or writing a ressource, the second matches the API, the third the ROUTER being used. `read` scopes gives access to GET, `write` to PUT, PATCH, POST, DELETE endpoints.
107
+
108
+ There are scopes which don't follow this structure. Those are either scopes that must be purchased (e.g. `read:predictions`), give access to endpoints existing in all APIs (e.g. `read:admin`) or provide access to an entire service (e.g. `read:sentiment`).
109
+
120
110
 
121
111
  ## Basic Usage
122
112
 
@@ -1,11 +1,11 @@
1
1
  crypticorn/__init__.py,sha256=ctrwe5CQtYhnetHYPgSmC0CIHa4xbDsLZvpY38tfEow,423
2
- crypticorn/client.py,sha256=XcJhgMoNSFQZJU3AoYuvxRMh-HPBPBlugKMpGSHxbIE,4700
2
+ crypticorn/client.py,sha256=G3b0O27ETRqmyPMxx1tKMUTSu3JkevcuJf3mTKaZ5XM,4673
3
3
  crypticorn/auth/__init__.py,sha256=JAl1tBLK9pYLr_-YKaj581c-c94PWLoqnatTIVAVvMM,81
4
4
  crypticorn/auth/main.py,sha256=j8eRGN2gUWyeOCnWnUPe3mCAfaidGnOMnZRiSQy-yzM,720
5
5
  crypticorn/auth/client/__init__.py,sha256=do16xS84uXvVoJuWERjb9RwlOaLy4UF4uKBZWczFC3c,5291
6
6
  crypticorn/auth/client/api_client.py,sha256=YumNsoI1ROiukpmDloiSfy7ZTd207khTmNLa7Dien5o,26888
7
7
  crypticorn/auth/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
8
- crypticorn/auth/client/configuration.py,sha256=eBiet9rc3ok09IltEbCX14DhQGEOc0_sPHrRLKNSmCo,18034
8
+ crypticorn/auth/client/configuration.py,sha256=hsdlmSIReQLV_-IlrOOZ7zI3XJ_8IrnkjWvNcKIBH18,18054
9
9
  crypticorn/auth/client/exceptions.py,sha256=h0Uf70boJaADhffgwDC5bXtOneCeiRyaxWZXgE8OlgM,6393
10
10
  crypticorn/auth/client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  crypticorn/auth/client/rest.py,sha256=7ykLyiCyjtTiC1F-9JfrD79vaA831O_irNDmaRArnGg,6994
@@ -22,9 +22,9 @@ crypticorn/auth/client/models/authorize_user200_response.py,sha256=fstTaffARzCe7
22
22
  crypticorn/auth/client/models/authorize_user200_response_auth.py,sha256=OQzmKNICdr7tHrlhEDIxagDZx7XuW8VO2U3OMsWIJOA,3208
23
23
  crypticorn/auth/client/models/authorize_user_request.py,sha256=o_1Ms6npD_1dJQ6aYshEk9JPV7JIkmAmuRawDDPUoTc,3205
24
24
  crypticorn/auth/client/models/create_api_key200_response.py,sha256=UGjZwITv2EdS7bbt55D0w2an6_uO4u6gYr-GihL9m80,2459
25
- crypticorn/auth/client/models/create_api_key_request.py,sha256=VaxptajDgoPPIfkkF1qh_wU3a7aTSc5wcjqvDcR5mnQ,5577
25
+ crypticorn/auth/client/models/create_api_key_request.py,sha256=mCdGZ4C7u73et_bv0pcRZgf1TU0cTmKty5idj9VaOqI,5627
26
26
  crypticorn/auth/client/models/create_user_request.py,sha256=nq4t2R4ldqSsJUoVhLw9YocdUwatH4gQ-jdFz3jaqrg,3481
27
- crypticorn/auth/client/models/get_api_keys200_response_inner.py,sha256=DiNnVej8GasK09PorQCk4jS_LWzwCxtjHEVH42cOA4U,5965
27
+ crypticorn/auth/client/models/get_api_keys200_response_inner.py,sha256=6JGaM7NXn6C55s6VmAZSfzZHTFx5I5BCJ8eMJF1GlG4,6015
28
28
  crypticorn/auth/client/models/list_wallets200_response.py,sha256=G2LQiThhtynkuDGFvIs-BowR38ut7cRbIeCzK4wMnPw,4732
29
29
  crypticorn/auth/client/models/list_wallets200_response_balances_inner.py,sha256=acTJa8B5U8j3_wS1TUYXnprptqF_T4dlV-wVaQ5ZXig,4023
30
30
  crypticorn/auth/client/models/list_wallets200_response_balances_inner_sale_round.py,sha256=KrCHFXXfc6U61nDFsq26gRtQQnc2_tSjL2fwQOnBfzI,3603
@@ -63,24 +63,24 @@ crypticorn/cli/templates/Dockerfile,sha256=89KlphaXJH51L7Vs4B928WmwYcMtpvLmKGyoD
63
63
  crypticorn/cli/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
64
  crypticorn/cli/templates/auth.py,sha256=Q1TxlA7qzhjvrqp1xz1aV2vGnj3DKFNN-VSl3o0B-dI,983
65
65
  crypticorn/cli/templates/dependabot.yml,sha256=ct5ieB8KAV1KLzoYKUNm6dZ9wKG_P_JQHgRjZUfT54w,861
66
- crypticorn/cli/templates/merge-env.sh,sha256=Q6d_RKcp2h6fOifYid8AsCvVGuUdleXkY3AxOVQ5psw,501
66
+ crypticorn/cli/templates/merge-env.sh,sha256=BNPrDTihII0yG2gehBkWwWj0GqHmb6xwmrAgwFpl8dA,554
67
67
  crypticorn/cli/templates/ruff.yml,sha256=gWicFFTzC4nToSmRkIIGipos8CZ447YG0kebBCJhtJE,319
68
68
  crypticorn/common/__init__.py,sha256=DXEuUU_kaLBSBcvpiFie_ROuK5XEZuTMIfsg-BZE0iE,752
69
- crypticorn/common/ansi_colors.py,sha256=IA-3_wujtpniJuaZJdAkc0gYX0tkN7RMk5XfLcKJsfI,1391
70
- crypticorn/common/auth.py,sha256=u_p2kiS3G2PfE4UZPZ2TuWvLkLkS00C3WnaLcMOvJlM,8807
69
+ crypticorn/common/ansi_colors.py,sha256=-tMlUTE8NI7TPv7uj0kGRe-SI2hGaUNPKBFI_dfiZy0,1392
70
+ crypticorn/common/auth.py,sha256=HxiAEej315qQGbX0p8WmQI50blUTOWsMWpCtguMx-A4,8786
71
71
  crypticorn/common/decorators.py,sha256=t5Y3vSJ-gt0n2vOYYjYN0dtzNXvZxrJs2SEItpzG8oo,1127
72
72
  crypticorn/common/enums.py,sha256=md7C_p2gAu6BbDboLm-DYYuJWjCHgRdk68iC1H5ZqPg,755
73
- crypticorn/common/errors.py,sha256=f109l0Xz-R8QfvRLw4ce7j5enQaqc9fTPBW1tgoY58I,28022
74
- crypticorn/common/exceptions.py,sha256=DdBWUYPtojuhzkbRMzvKxh5g0ieQfMWP9p6cEH4wSTM,6097
73
+ crypticorn/common/errors.py,sha256=cAxMlHLLR-StgMmSdUwhnN0eUh0aBQmW0BIXYfa1GOI,28023
74
+ crypticorn/common/exceptions.py,sha256=31WcS1OEcGBAMc3FnPrtb6jFbh6Ni1v9Kciz7Av4y84,6098
75
75
  crypticorn/common/logging.py,sha256=3ZTFB9j8Mqy_AlNYABUFQ_134OH0YtophJkP4_GDJ9w,4408
76
76
  crypticorn/common/middleware.py,sha256=O7XiXPimNYUhF9QTv6yFUTVlb91-SK-3CfTrWMNP6Ck,1011
77
77
  crypticorn/common/mixins.py,sha256=l7XQrBISaee6fDZXy96k0HnQ18XYocjTUXlNpVxhaOY,2206
78
78
  crypticorn/common/openapi.py,sha256=D8bCpCVVzYQptHrJ7SYOgCxI3R_d0cjW9KMOBq-x0xk,279
79
79
  crypticorn/common/pagination.py,sha256=BYMNB4JUW9eeiTw1q3CyHXaT_-hk_BrSXAOqvif08Ek,2334
80
- crypticorn/common/scopes.py,sha256=1hSrB0EHhO2aYC1A0Rvc0hdjdihyHM2nl-DGKQWHl3U,2517
80
+ crypticorn/common/scopes.py,sha256=H-ow744XhArgN2Zb7SESP5ZZ6fNjA5oY1eHuZsuF4Gw,2827
81
81
  crypticorn/common/urls.py,sha256=v23H2gevTNZ6HMRXDPiuc8znBbNdNqj0JTAdm5Hhms8,1223
82
82
  crypticorn/common/utils.py,sha256=LcWudhcjZtULg87yYghh5muTYdHvk3UmkEAXmX7xgLk,3073
83
- crypticorn/common/warnings.py,sha256=yEDsj8FNla9QMR_DOtD4lyEJInXdygY4sqVJEp5hgjU,2425
83
+ crypticorn/common/warnings.py,sha256=TNDiIbwFYh18zs20QnrYHYL9pB20Ip1tTzv5KlnDSUE,2426
84
84
  crypticorn/common/router/admin_router.py,sha256=x81s1gxhH7nLf7txqAIjVxrNgQmXsA1YG7g9v9KJwHA,3740
85
85
  crypticorn/common/router/status_router.py,sha256=it6kfvx_Pn4Rv06fmViwhwr-m6f4WuSgcZwc6VTaMz4,868
86
86
  crypticorn/hive/__init__.py,sha256=hRfTlEzEql4msytdUC_04vfaHzVKG5CGZle1M-9QFgY,81
@@ -122,7 +122,7 @@ crypticorn/hive/client/models/target.py,sha256=otOJK8s5WVUen6J1AQZpRiD330RIpaJU6
122
122
  crypticorn/hive/client/models/target_info.py,sha256=hFaOMZlirH2B68DQstL_c4WvtejwXyOk67lxIaeuh3Q,2857
123
123
  crypticorn/hive/client/models/target_type.py,sha256=FUMaEFkPM7EvStPJE1auimDJ9mxDf6pbsFf-dF3coGw,684
124
124
  crypticorn/klines/__init__.py,sha256=9UUW013uZ5x4evz5zRUxbNid-6O9WAPPYvPZIHpAwms,87
125
- crypticorn/klines/main.py,sha256=AHeV-qiAyebV6n_vLPJCV3CliK2N85fXm7dXjjY6TNE,2347
125
+ crypticorn/klines/main.py,sha256=s93aizwJVVdtFw6_NbnuG5rJDWzXvPoQSKMwJwbrTcs,2695
126
126
  crypticorn/klines/client/__init__.py,sha256=KAwR6kMFkKap_1Un_HsT8LqYLsTIKUNIJe9JI6Acprg,2792
127
127
  crypticorn/klines/client/api_client.py,sha256=XYk_eoVRHxQDoTKJJwMpO__LbU1DQtpMikBTyulJrvE,26925
128
128
  crypticorn/klines/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
@@ -159,34 +159,36 @@ crypticorn/klines/client/models/symbol_type.py,sha256=uOEqlQJ714fa0SEYOxzCOx9cG-
159
159
  crypticorn/klines/client/models/timeframe.py,sha256=bSZJz3Q78V1RAnm3ZDtGBzFOnDKE3Pc5A0eP3ky3KaI,760
160
160
  crypticorn/klines/client/models/udf_config.py,sha256=cVSxnJrkwnS4p0fEUgZMekueDv28k-p58bZwvHMSmqc,5152
161
161
  crypticorn/metrics/__init__.py,sha256=t7FrHV5PaVTka90eIxDgOaWvOiyznSStcUanSbLov2o,126
162
- crypticorn/metrics/main.py,sha256=KK7HazbkBEXSUUB4PRiNDV9-8r_p5Z4Znqt_SIr_jII,3575
163
- crypticorn/metrics/client/__init__.py,sha256=zp5tyfddEBfFrCqp9YEAwObC60lZ0GnqO3dvsAOt1zE,2530
162
+ crypticorn/metrics/main.py,sha256=pNR7sYh7YarA_4kHtVyQQ1afsfbUfLFAxdFBxxcNYG0,3304
163
+ crypticorn/metrics/client/__init__.py,sha256=bu9LdJkG7vljgmLVKhoSY08ooOuEo0AhoHt7-zDVyek,2720
164
164
  crypticorn/metrics/client/api_client.py,sha256=pGWJuO-mgxlUdhJGwkScf7CviGzjDrmUAiU0LXasQY4,26934
165
165
  crypticorn/metrics/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
166
- crypticorn/metrics/client/configuration.py,sha256=2GqHs-vx7bW_3S-bXMz_2RV-Z-HhdC8J_lQW2T8R3T8,19168
166
+ crypticorn/metrics/client/configuration.py,sha256=wA1hBWEINMM_AlZg-DAv1AelmkjBERB5d2gA66aEwSM,19158
167
167
  crypticorn/metrics/client/exceptions.py,sha256=UegnYftFlQDXAQv8BmD20yRzTtWpjTHcuOymTBWmgeE,6421
168
168
  crypticorn/metrics/client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
169
169
  crypticorn/metrics/client/rest.py,sha256=pWeYnpTfTV7L5U6Kli3b7i8VrmqdG8sskqSnTHPIoQo,7025
170
170
  crypticorn/metrics/client/api/__init__.py,sha256=nNmEy9XBH8jQboMzedrzeGl8OVuDo_iylCaFw4Fgysg,649
171
171
  crypticorn/metrics/client/api/admin_api.py,sha256=_YobvzUaNfv0CohQdAndUH2HPw5u6FbHwVaUATvsFyU,59843
172
- crypticorn/metrics/client/api/exchanges_api.py,sha256=BZiJH8hxxSnI9SXydgErM6gzvIR-t9vNXbh9fFotpQQ,40455
173
- crypticorn/metrics/client/api/indicators_api.py,sha256=gltFmv_EorYbeWMnp-N0QkgdVKrkvi1iOZUP_ewkXZ0,26748
172
+ crypticorn/metrics/client/api/exchanges_api.py,sha256=Ft_Lgit-tx_X0uwMBDKv5tXk_zCKV6lONqTRiBo87VA,40547
173
+ crypticorn/metrics/client/api/indicators_api.py,sha256=jjSeTZe_o1_TJx_S3m-qngXRhAuGifk_MAqZXYedbns,26946
174
174
  crypticorn/metrics/client/api/logs_api.py,sha256=lDOixn5hn3DWc6HjExWtKZfy7U4NfcSLsO1bNFrx4GE,13550
175
- crypticorn/metrics/client/api/marketcap_api.py,sha256=28lQlBJh5hdW7fULJl55bAJy_HWZWEdouds63YJIwAQ,51106
175
+ crypticorn/metrics/client/api/marketcap_api.py,sha256=WYkg5AptRtU_aUXiqqig8RHS7FQc79qhC1mM5EObfL8,51965
176
176
  crypticorn/metrics/client/api/markets_api.py,sha256=NbPtD5bQK_Nt73hlVd6cd1pAZ7HO1QQgNl_abNoN00s,14739
177
177
  crypticorn/metrics/client/api/quote_currencies_api.py,sha256=H4c3zOp5eTTUrRMlMH-H8aIIBpV4Ioj8c65UUt_BEuE,11259
178
178
  crypticorn/metrics/client/api/status_api.py,sha256=_Ou_EGmjPyv32G-S4QKfRemdpGG6FUsgOkbGDfYaFp0,19633
179
179
  crypticorn/metrics/client/api/tokens_api.py,sha256=x5a-YAeAgFJm-pN4K3-lOM-WPVYAxoBr-AYb-oxhysM,19522
180
- crypticorn/metrics/client/models/__init__.py,sha256=Voa1tj-CTpvzF6UmGJf0h0zFqG-7wFV8TSwH_lst0WY,1285
180
+ crypticorn/metrics/client/models/__init__.py,sha256=hPPLh2kQc3KNHCLeOT7AS2HXu04LEeSp_G4ME7BCmW4,1475
181
181
  crypticorn/metrics/client/models/api_error_identifier.py,sha256=f_GdLo9HUcWPlXw8U8jDpjlKCj2mtuB3Ik9owJl_wJU,4962
182
182
  crypticorn/metrics/client/models/api_error_level.py,sha256=soxtGExzlBja-Jux_jguro-1taLAGcKmGSHlxTKTYR4,772
183
183
  crypticorn/metrics/client/models/api_error_type.py,sha256=Y8pCAtdcS4zfTetTZj9x60BFJwSXD6ro-8NU38aEDyQ,811
184
184
  crypticorn/metrics/client/models/exception_detail.py,sha256=GIIa_LNZrtXlWCMLh1OAgEO6UoBo3m0kiCk788wMbuA,3853
185
+ crypticorn/metrics/client/models/exchange_availability.py,sha256=d_Ysv-DnSiHT_qXqj1ZxOPg7wxS564SJm21dOD7QnmI,2785
185
186
  crypticorn/metrics/client/models/exchange_mapping.py,sha256=SJkMHO-ZZfnnjWNHAgmLOyJyDIGV8t1T3AF_3PukXBs,4104
186
187
  crypticorn/metrics/client/models/internal_exchange.py,sha256=aWc3gPt1TSQ74y5tivLAVOu-qySo9djgIWwsB8nYass,864
187
188
  crypticorn/metrics/client/models/log_level.py,sha256=u_1h06MyyyfV5PYYh8Xjgq9ySF2CfU_clZbkww6aJk4,769
188
189
  crypticorn/metrics/client/models/market_type.py,sha256=1fLJIuDO5wK5JABFxtnJzHMwJw1mSqf21-QVAP102xk,711
189
- crypticorn/metrics/client/models/marketcap_ranking.py,sha256=4oF7Ul76yDHxBEmAsgINd9g5UEKQesDT0TVJd6xiXmM,2563
190
+ crypticorn/metrics/client/models/marketcap_ranking.py,sha256=rLNBBnaE1qn1Zgqi64CoZnIbw7vkLHEr3r3xDHMv3vQ,2714
191
+ crypticorn/metrics/client/models/marketcap_symbol_ranking.py,sha256=5fTbEJAasj5L-zIOX5cK5_h_ZAp1jvMwTKVkjnM9Upc,2616
190
192
  crypticorn/metrics/client/models/ohlcv.py,sha256=xEpqWy1XwC1JwyUM6yvJCgpVTJiCWvxm0HJnnzvKawM,3339
191
193
  crypticorn/metrics/client/models/severity.py,sha256=Bwls2jjCMP2lKc-_67d5WZbGPAebUEPge7a82iUf4Qs,731
192
194
  crypticorn/metrics/client/models/time_interval.py,sha256=8bHhMNt56xVGvJi5xNFMrAkAZFRKfym1UkeGoM2H0j8,772
@@ -259,9 +261,9 @@ crypticorn/trade/client/models/strategy_model_input.py,sha256=ala19jARyfA5ysys5D
259
261
  crypticorn/trade/client/models/strategy_model_output.py,sha256=2o2lhbgUSTznowpMLEHF1Ex9TG9oRmzlCIb-gXqo7_s,5643
260
262
  crypticorn/trade/client/models/tpsl.py,sha256=C2KgTIZs-a8W4msdaXgBKJcwtA-o5wR4rBauRP-iQxU,4317
261
263
  crypticorn/trade/client/models/trading_action_type.py,sha256=pGq_TFLMPfYFizYP-xKgEC1ZF4U3lGdJYoGa_ZH2x-Q,769
262
- crypticorn-2.11.0.dist-info/licenses/LICENSE,sha256=HonAVvzFXkP2C1d7D3ByIKPwjGH8NcHTAQvKH7uvOHQ,1856
263
- crypticorn-2.11.0.dist-info/METADATA,sha256=Tpe2gUY6o3_ECAirH9pyvsF5XvXk9fpIu44guCdaqFA,10146
264
- crypticorn-2.11.0.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
265
- crypticorn-2.11.0.dist-info/entry_points.txt,sha256=d_xHsGvUTebPveVUK0SrpDFQ5ZRSjlI7lNCc11sn2PM,59
266
- crypticorn-2.11.0.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
267
- crypticorn-2.11.0.dist-info/RECORD,,
264
+ crypticorn-2.11.4.dist-info/licenses/LICENSE,sha256=HonAVvzFXkP2C1d7D3ByIKPwjGH8NcHTAQvKH7uvOHQ,1856
265
+ crypticorn-2.11.4.dist-info/METADATA,sha256=HWeN0esFv-9WixvK9p3DHDzm_PBZyXfKyt1mKxHfH5g,8640
266
+ crypticorn-2.11.4.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
267
+ crypticorn-2.11.4.dist-info/entry_points.txt,sha256=d_xHsGvUTebPveVUK0SrpDFQ5ZRSjlI7lNCc11sn2PM,59
268
+ crypticorn-2.11.4.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
269
+ crypticorn-2.11.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.4.0)
2
+ Generator: setuptools (80.7.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5