crypticorn 2.1.3__py3-none-any.whl → 2.1.5__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 (32) hide show
  1. crypticorn/common/errors.py +215 -252
  2. crypticorn/common/sorter.py +38 -0
  3. crypticorn/pay/client/__init__.py +1 -0
  4. crypticorn/pay/client/api/now_payments_api.py +3 -16
  5. crypticorn/pay/client/api/payments_api.py +0 -42
  6. crypticorn/pay/client/api/products_api.py +3 -42
  7. crypticorn/pay/client/configuration.py +2 -1
  8. crypticorn/pay/client/models/__init__.py +1 -0
  9. crypticorn/pay/client/models/body_create_now_invoice.py +98 -0
  10. crypticorn/{trade/client/models/update_notification.py → pay/client/models/body_create_product.py} +20 -17
  11. crypticorn/pay/client/models/body_get_products.py +87 -0
  12. crypticorn/pay/client/models/body_handle_now_webhook.py +98 -0
  13. crypticorn/pay/client/models/body_update_product.py +98 -0
  14. crypticorn/pay/client/models/product_model.py +9 -0
  15. crypticorn/pay/client/models/scope.py +56 -0
  16. crypticorn/trade/client/api/api_keys_api.py +5 -70
  17. crypticorn/trade/client/api/bots_api.py +4 -56
  18. crypticorn/trade/client/api/exchanges_api.py +2 -19
  19. crypticorn/trade/client/api/futures_trading_panel_api.py +21 -89
  20. crypticorn/trade/client/api/notifications_api.py +6 -87
  21. crypticorn/trade/client/api/orders_api.py +2 -15
  22. crypticorn/trade/client/api/strategies_api.py +4 -56
  23. crypticorn/trade/client/api/trading_actions_api.py +1 -14
  24. crypticorn/trade/client/configuration.py +2 -1
  25. crypticorn/trade/client/models/api_error_identifier.py +49 -43
  26. crypticorn/trade/client/models/api_error_level.py +2 -2
  27. {crypticorn-2.1.3.dist-info → crypticorn-2.1.5.dist-info}/METADATA +3 -3
  28. {crypticorn-2.1.3.dist-info → crypticorn-2.1.5.dist-info}/RECORD +30 -26
  29. crypticorn/trade/client/models/notification_type.py +0 -37
  30. crypticorn/trade/client/models/strategy_model.py +0 -158
  31. {crypticorn-2.1.3.dist-info → crypticorn-2.1.5.dist-info}/WHEEL +0 -0
  32. {crypticorn-2.1.3.dist-info → crypticorn-2.1.5.dist-info}/top_level.txt +0 -0
@@ -17,218 +17,189 @@ class ApiErrorType(str, Enum):
17
17
  class ApiErrorIdentifier(str, Enum):
18
18
  """API error identifiers"""
19
19
 
20
- SUCCESS = "success"
21
- UNAUTHORIZED = "invalid_api_key"
22
- INVALID_SIGNATURE = "invalid_signature"
23
- INVALID_TIMESTAMP = "invalid_timestamp"
24
- IP_RESTRICTED = "ip_address_is_not_authorized"
25
- PERMISSION_DENIED = "insufficient_permissions_spot_and_futures_required"
26
- USER_FROZEN = "user_account_is_frozen"
27
- RATE_LIMIT = "rate_limit_exceeded"
28
- INVALID_PARAMETER = "invalid_parameter_provided"
29
- REQUEST_SCOPE_EXCEEDED = "request_scope_limit_exceeded"
20
+ API_KEY_ALREADY_EXISTS = "api_key_already_exists"
21
+ BLACK_SWAN = "black_swan"
22
+ BOT_ALREADY_DELETED = "bot_already_deleted"
23
+ BOT_DISABLED = "bot_disabled"
24
+ BOT_STOPPING_COMPLETED = "bot_stopping_completed"
25
+ CLIENT_ORDER_ID_REPEATED = "client_order_id_already_exists"
30
26
  CONTENT_TYPE_ERROR = "invalid_content_type"
31
- URL_NOT_FOUND = "requested_resource_not_found"
32
- ORDER_NOT_FOUND = "order_does_not_exist"
27
+ DELETE_BOT_ERROR = "delete_bot_error"
28
+ EXCHANGE_API_KEY_IN_USE = "exchange_api_key_in_use"
29
+ EXCHANGE_INVALID_SIGNATURE = "exchange_invalid_signature"
30
+ EXCHANGE_INVALID_TIMESTAMP = "exchange_invalid_timestamp"
31
+ EXCHANGE_IP_RESTRICTED = "exchange_ip_address_is_not_authorized"
32
+ EXCHANGE_MAINTENANCE = "exchange_system_under_maintenance"
33
+ EXCHANGE_RATE_LIMIT = "exchange_rate_limit_exceeded"
34
+ EXCHANGE_SERVICE_UNAVAILABLE = "exchange_service_temporarily_unavailable"
35
+ EXCHANGE_SYSTEM_BUSY = "exchange_system_is_busy"
36
+ EXCHANGE_SYSTEM_CONFIG_ERROR = "exchange_system_configuration_error"
37
+ EXCHANGE_SYSTEM_ERROR = "exchange_internal_system_error"
38
+ EXCHANGE_USER_FROZEN = "exchange_user_account_is_frozen"
39
+ EXCHANGE_PERMISSION_DENIED = "insufficient_permissions_spot_and_futures_required"
40
+ HEDGE_MODE_NOT_ACTIVE = "hedge_mode_not_active"
41
+ HTTP_ERROR = "http_request_error"
42
+ INSUFFICIENT_BALANCE = "insufficient_balance"
43
+ INSUFFICIENT_MARGIN = "insufficient_margin"
44
+ INSUFFICIENT_SCOPES = "insufficient_scopes"
45
+ INVALID_API_KEY = "invalid_api_key"
46
+ INVALID_BEARER = "invalid_bearer"
47
+ INVALID_EXCHANGE_API_KEY = "invalid_exchange_api_key"
48
+ INVALID_MARGIN_MODE = "invalid_margin_mode"
49
+ INVALID_PARAMETER = "invalid_parameter_provided"
50
+ JWT_EXPIRED = "jwt_expired"
51
+ LEVERAGE_EXCEEDED = "leverage_limit_exceeded"
52
+ LIQUIDATION_PRICE_VIOLATION = "order_violates_liquidation_price_constraints"
53
+ NO_CREDENTIALS = "no_credentials"
54
+ OBJECT_NOT_FOUND = "object_not_found"
33
55
  ORDER_ALREADY_FILLED = "order_is_already_filled"
34
56
  ORDER_IN_PROCESS = "order_is_being_processed"
35
57
  ORDER_LIMIT_EXCEEDED = "order_quantity_limit_exceeded"
58
+ ORDER_NOT_FOUND = "order_does_not_exist"
36
59
  ORDER_PRICE_INVALID = "order_price_is_invalid"
37
- POST_ONLY_REJECTED = "post_only_order_would_immediately_match"
38
- SYMBOL_NOT_FOUND = "symbol_does_not_exist"
39
- CLIENT_ORDER_ID_REPEATED = "client_order_id_already_exists"
40
-
41
- POSITION_NOT_FOUND = "position_does_not_exist"
60
+ ORDER_SIZE_TOO_LARGE = "order_size_too_large"
61
+ ORDER_SIZE_TOO_SMALL = "order_size_too_small"
42
62
  POSITION_LIMIT_EXCEEDED = "position_limit_exceeded"
63
+ POSITION_NOT_FOUND = "position_does_not_exist"
43
64
  POSITION_SUSPENDED = "position_opening_temporarily_suspended"
44
- INSUFFICIENT_BALANCE = "insufficient_balance"
45
- INSUFFICIENT_MARGIN = "insufficient_margin"
46
-
47
- LEVERAGE_EXCEEDED = "leverage_limit_exceeded"
65
+ POST_ONLY_REJECTED = "post_only_order_would_immediately_match"
66
+ REQUEST_SCOPE_EXCEEDED = "request_scope_limit_exceeded"
48
67
  RISK_LIMIT_EXCEEDED = "risk_limit_exceeded"
49
- LIQUIDATION_PRICE_VIOLATION = "order_violates_liquidation_price_constraints"
50
- INVALID_MARGIN_MODE = "invalid_margin_mode"
51
-
52
- SYSTEM_ERROR = "internal_system_error"
53
- SYSTEM_CONFIG_ERROR = "system_configuration_error"
54
- SERVICE_UNAVAILABLE = "service_temporarily_unavailable"
55
- SYSTEM_BUSY = "system_is_busy_please_try_again_later"
56
- MAINTENANCE = "system_under_maintenance"
57
68
  RPC_TIMEOUT = "rpc_timeout"
58
69
  SETTLEMENT_IN_PROGRESS = "system_settlement_in_process"
59
-
60
- TRADING_SUSPENDED = "trading_is_suspended"
70
+ STRATEGY_DISABLED = "strategy_disabled"
71
+ SUCCESS = "success"
72
+ SYMBOL_NOT_FOUND = "symbol_does_not_exist"
61
73
  TRADING_LOCKED = "trading_has_been_locked"
62
-
74
+ TRADING_ACTION_EXPIRED = "trading_action_expired"
75
+ TRADING_ACTION_SKIPPED = "trading_action_skipped"
76
+ TRADING_SUSPENDED = "trading_is_suspended"
63
77
  UNKNOWN_ERROR = "unknown_error_occurred"
64
- HTTP_ERROR = "http_request_error"
65
- BLACK_SWAN = "black_swan"
66
-
67
- # our bot errors
68
- ACTION_EXPIRED = "trading_action_expired"
69
- ACTION_SKIPPED = "trading_action_skipped"
70
- BOT_DISABLED = "bot_disabled"
71
- ORDER_SIZE_TOO_SMALL = "order_size_too_small"
72
- ORDER_SIZE_TOO_LARGE = "order_size_too_large"
73
- HEDGE_MODE_NOT_ACTIVE = "hedge_mode_not_active"
74
-
75
- # our API errors
76
- API_KEY_ALREADY_EXISTS = "api_key_already_exists"
77
- DELETE_BOT_ERROR = "delete_bot_error"
78
- JWT_EXPIRED = "jwt_expired"
79
- BOT_STOPPING_COMPLETED = "bot_stopping_completed"
80
- OBJECT_NOT_FOUND = "object_not_found"
81
- STRATEGY_DISABLED = "strategy_disabled"
82
- API_KEY_IN_USE = "api_key_in_use_by_bots"
83
- BOT_ALREADY_DELETED = "bot_already_deleted"
84
-
85
- # our auth errors
86
- INVALID_API_KEY = "invalid_api_key"
87
- INVALID_BEARER = "invalid_bearer"
88
- NO_CREDENTIALS = "no_credentials"
89
- INSUFFICIENT_SCOPES = "insufficient_scopes"
78
+ URL_NOT_FOUND = "requested_resource_not_found"
90
79
 
91
80
 
92
81
  class ApiErrorLevel(str, Enum):
82
+ """API error levels"""
83
+
93
84
  ERROR = "error"
94
- SUCCESS = "success"
95
85
  INFO = "info"
86
+ SUCCESS = "success"
96
87
  WARNING = "warning"
97
88
 
98
89
 
99
90
  class ApiError(Enum):
100
91
  """API error codes"""
101
92
 
102
- # Success
103
- SUCCESS = (ApiErrorIdentifier.SUCCESS, ApiErrorType.NO_ERROR, ApiErrorLevel.SUCCESS)
104
- # Authentication/Authorization
105
- UNAUTHORIZED = (
106
- ApiErrorIdentifier.UNAUTHORIZED,
107
- ApiErrorType.SERVER_ERROR,
108
- ApiErrorLevel.ERROR,
109
- )
110
- INVALID_SIGNATURE = (
111
- ApiErrorIdentifier.INVALID_SIGNATURE,
112
- ApiErrorType.SERVER_ERROR,
93
+ API_KEY_ALREADY_EXISTS = (
94
+ ApiErrorIdentifier.API_KEY_ALREADY_EXISTS,
95
+ ApiErrorType.USER_ERROR,
113
96
  ApiErrorLevel.ERROR,
114
97
  )
115
- INVALID_TIMESTAMP = (
116
- ApiErrorIdentifier.INVALID_TIMESTAMP,
117
- ApiErrorType.SERVER_ERROR,
118
- ApiErrorLevel.ERROR,
98
+ BLACK_SWAN = (
99
+ ApiErrorIdentifier.BLACK_SWAN,
100
+ ApiErrorType.USER_ERROR,
101
+ ApiErrorLevel.INFO,
119
102
  )
120
- IP_RESTRICTED = (
121
- ApiErrorIdentifier.IP_RESTRICTED,
103
+ BOT_ALREADY_DELETED = (
104
+ ApiErrorIdentifier.BOT_ALREADY_DELETED,
122
105
  ApiErrorType.SERVER_ERROR,
123
106
  ApiErrorLevel.ERROR,
124
107
  )
125
- PERMISSION_DENIED = (
126
- ApiErrorIdentifier.PERMISSION_DENIED,
127
- ApiErrorType.USER_ERROR,
128
- ApiErrorLevel.ERROR,
129
- )
130
- USER_FROZEN = (
131
- ApiErrorIdentifier.USER_FROZEN,
108
+ BOT_DISABLED = (
109
+ ApiErrorIdentifier.BOT_DISABLED,
132
110
  ApiErrorType.USER_ERROR,
133
- ApiErrorLevel.ERROR,
111
+ ApiErrorLevel.WARNING,
134
112
  )
135
-
136
- # Rate Limiting
137
- RATE_LIMIT = (
138
- ApiErrorIdentifier.RATE_LIMIT,
139
- ApiErrorType.EXCHANGE_ERROR,
140
- ApiErrorLevel.ERROR,
113
+ BOT_STOPPING_COMPLETED = (
114
+ ApiErrorIdentifier.BOT_STOPPING_COMPLETED,
115
+ ApiErrorType.NO_ERROR,
116
+ ApiErrorLevel.INFO,
141
117
  )
142
-
143
- # Invalid Parameters
144
- INVALID_PARAMETER = (
145
- ApiErrorIdentifier.INVALID_PARAMETER,
118
+ CLIENT_ORDER_ID_REPEATED = (
119
+ ApiErrorIdentifier.CLIENT_ORDER_ID_REPEATED,
146
120
  ApiErrorType.SERVER_ERROR,
147
121
  ApiErrorLevel.ERROR,
148
122
  )
149
- REQUEST_SCOPE_EXCEEDED = (
150
- ApiErrorIdentifier.REQUEST_SCOPE_EXCEEDED,
151
- ApiErrorType.EXCHANGE_ERROR,
152
- ApiErrorLevel.ERROR,
153
- )
154
123
  CONTENT_TYPE_ERROR = (
155
124
  ApiErrorIdentifier.CONTENT_TYPE_ERROR,
156
125
  ApiErrorType.SERVER_ERROR,
157
126
  ApiErrorLevel.ERROR,
158
127
  )
159
- URL_NOT_FOUND = (
160
- ApiErrorIdentifier.URL_NOT_FOUND,
128
+ DELETE_BOT_ERROR = (
129
+ ApiErrorIdentifier.DELETE_BOT_ERROR,
161
130
  ApiErrorType.SERVER_ERROR,
162
131
  ApiErrorLevel.ERROR,
163
132
  )
164
- SYMBOL_NOT_FOUND = (
165
- ApiErrorIdentifier.SYMBOL_NOT_FOUND,
133
+ EXCHANGE_INVALID_SIGNATURE = (
134
+ ApiErrorIdentifier.EXCHANGE_INVALID_SIGNATURE,
166
135
  ApiErrorType.SERVER_ERROR,
167
136
  ApiErrorLevel.ERROR,
168
137
  )
169
-
170
- # Order Related
171
- ORDER_NOT_FOUND = (
172
- ApiErrorIdentifier.ORDER_NOT_FOUND,
138
+ EXCHANGE_INVALID_TIMESTAMP = (
139
+ ApiErrorIdentifier.EXCHANGE_INVALID_TIMESTAMP,
173
140
  ApiErrorType.SERVER_ERROR,
174
141
  ApiErrorLevel.ERROR,
175
142
  )
176
- ORDER_ALREADY_FILLED = (
177
- ApiErrorIdentifier.ORDER_ALREADY_FILLED,
143
+ EXCHANGE_IP_RESTRICTED = (
144
+ ApiErrorIdentifier.EXCHANGE_IP_RESTRICTED,
178
145
  ApiErrorType.SERVER_ERROR,
179
- ApiErrorLevel.INFO,
146
+ ApiErrorLevel.ERROR,
180
147
  )
181
- ORDER_IN_PROCESS = (
182
- ApiErrorIdentifier.ORDER_IN_PROCESS,
183
- ApiErrorType.NO_ERROR,
184
- ApiErrorLevel.INFO,
148
+ EXCHANGE_API_KEY_IN_USE = (
149
+ ApiErrorIdentifier.EXCHANGE_API_KEY_IN_USE,
150
+ ApiErrorType.SERVER_ERROR,
151
+ ApiErrorLevel.ERROR,
185
152
  )
186
- ORDER_LIMIT_EXCEEDED = (
187
- ApiErrorIdentifier.ORDER_LIMIT_EXCEEDED,
153
+ EXCHANGE_MAINTENANCE = (
154
+ ApiErrorIdentifier.EXCHANGE_MAINTENANCE,
155
+ ApiErrorType.EXCHANGE_ERROR,
156
+ ApiErrorLevel.ERROR,
157
+ )
158
+ EXCHANGE_PERMISSION_DENIED = (
159
+ ApiErrorIdentifier.EXCHANGE_PERMISSION_DENIED,
188
160
  ApiErrorType.USER_ERROR,
189
161
  ApiErrorLevel.ERROR,
190
162
  )
191
- ORDER_PRICE_INVALID = (
192
- ApiErrorIdentifier.ORDER_PRICE_INVALID,
193
- ApiErrorType.SERVER_ERROR,
163
+ EXCHANGE_RATE_LIMIT = (
164
+ ApiErrorIdentifier.EXCHANGE_RATE_LIMIT,
165
+ ApiErrorType.EXCHANGE_ERROR,
194
166
  ApiErrorLevel.ERROR,
195
167
  )
196
- POST_ONLY_REJECTED = (
197
- ApiErrorIdentifier.POST_ONLY_REJECTED,
198
- ApiErrorType.SERVER_ERROR,
168
+ EXCHANGE_SERVICE_UNAVAILABLE = (
169
+ ApiErrorIdentifier.EXCHANGE_SERVICE_UNAVAILABLE,
170
+ ApiErrorType.EXCHANGE_ERROR,
199
171
  ApiErrorLevel.ERROR,
200
172
  )
201
- BLACK_SWAN = (
202
- ApiErrorIdentifier.BLACK_SWAN,
203
- ApiErrorType.USER_ERROR,
204
- ApiErrorLevel.INFO,
173
+ EXCHANGE_SYSTEM_BUSY = (
174
+ ApiErrorIdentifier.EXCHANGE_SYSTEM_BUSY,
175
+ ApiErrorType.EXCHANGE_ERROR,
176
+ ApiErrorLevel.ERROR,
205
177
  )
206
- CLIENT_ORDER_ID_REPEATED = (
207
- ApiErrorIdentifier.CLIENT_ORDER_ID_REPEATED,
208
- ApiErrorType.SERVER_ERROR,
178
+ EXCHANGE_SYSTEM_CONFIG_ERROR = (
179
+ ApiErrorIdentifier.EXCHANGE_SYSTEM_CONFIG_ERROR,
180
+ ApiErrorType.EXCHANGE_ERROR,
209
181
  ApiErrorLevel.ERROR,
210
182
  )
211
- # CONTRA_ORDER_MISSING = "No contra order available"
212
-
213
- # Position Related
214
- POSITION_NOT_FOUND = (
215
- ApiErrorIdentifier.POSITION_NOT_FOUND,
216
- ApiErrorType.NO_ERROR,
217
- ApiErrorLevel.INFO,
218
- ) # not an error because user can close a position manually which we don't know about
219
- POSITION_LIMIT_EXCEEDED = (
220
- ApiErrorIdentifier.POSITION_LIMIT_EXCEEDED,
183
+ EXCHANGE_SYSTEM_ERROR = (
184
+ ApiErrorIdentifier.EXCHANGE_SYSTEM_ERROR,
185
+ ApiErrorType.EXCHANGE_ERROR,
186
+ ApiErrorLevel.ERROR,
187
+ )
188
+ EXCHANGE_USER_FROZEN = (
189
+ ApiErrorIdentifier.EXCHANGE_USER_FROZEN,
221
190
  ApiErrorType.USER_ERROR,
222
191
  ApiErrorLevel.ERROR,
223
192
  )
224
- POSITION_SUSPENDED = (
225
- ApiErrorIdentifier.POSITION_SUSPENDED,
193
+ HEDGE_MODE_NOT_ACTIVE = (
194
+ ApiErrorIdentifier.HEDGE_MODE_NOT_ACTIVE,
195
+ ApiErrorType.USER_ERROR,
196
+ ApiErrorLevel.ERROR,
197
+ )
198
+ HTTP_ERROR = (
199
+ ApiErrorIdentifier.HTTP_ERROR,
226
200
  ApiErrorType.EXCHANGE_ERROR,
227
201
  ApiErrorLevel.ERROR,
228
202
  )
229
- # FUTURES_BRAWL_RESTRICTED = "Operation restricted for Futures Brawl", ApiErrorType.USER_ERROR
230
-
231
- # Balance/Margin
232
203
  INSUFFICIENT_BALANCE = (
233
204
  ApiErrorIdentifier.INSUFFICIENT_BALANCE,
234
205
  ApiErrorType.USER_ERROR,
@@ -239,20 +210,23 @@ class ApiError(Enum):
239
210
  ApiErrorType.USER_ERROR,
240
211
  ApiErrorLevel.ERROR,
241
212
  )
242
-
243
- # Leverage/Risk
244
- LEVERAGE_EXCEEDED = (
245
- ApiErrorIdentifier.LEVERAGE_EXCEEDED,
246
- ApiErrorType.SERVER_ERROR,
213
+ INSUFFICIENT_SCOPES = (
214
+ ApiErrorIdentifier.INSUFFICIENT_SCOPES,
215
+ ApiErrorType.USER_ERROR,
247
216
  ApiErrorLevel.ERROR,
248
217
  )
249
- RISK_LIMIT_EXCEEDED = (
250
- ApiErrorIdentifier.RISK_LIMIT_EXCEEDED,
251
- ApiErrorType.SERVER_ERROR,
218
+ INVALID_API_KEY = (
219
+ ApiErrorIdentifier.INVALID_API_KEY,
220
+ ApiErrorType.USER_ERROR,
252
221
  ApiErrorLevel.ERROR,
253
222
  )
254
- LIQUIDATION_PRICE_VIOLATION = (
255
- ApiErrorIdentifier.LIQUIDATION_PRICE_VIOLATION,
223
+ INVALID_BEARER = (
224
+ ApiErrorIdentifier.INVALID_BEARER,
225
+ ApiErrorType.USER_ERROR,
226
+ ApiErrorLevel.ERROR,
227
+ )
228
+ INVALID_EXCHANGE_API_KEY = (
229
+ ApiErrorIdentifier.INVALID_EXCHANGE_API_KEY,
256
230
  ApiErrorType.SERVER_ERROR,
257
231
  ApiErrorLevel.ERROR,
258
232
  )
@@ -261,81 +235,63 @@ class ApiError(Enum):
261
235
  ApiErrorType.SERVER_ERROR,
262
236
  ApiErrorLevel.ERROR,
263
237
  )
264
-
265
- # System Status
266
- SYSTEM_ERROR = (
267
- ApiErrorIdentifier.SYSTEM_ERROR,
268
- ApiErrorType.EXCHANGE_ERROR,
238
+ INVALID_PARAMETER = (
239
+ ApiErrorIdentifier.INVALID_PARAMETER,
240
+ ApiErrorType.SERVER_ERROR,
269
241
  ApiErrorLevel.ERROR,
270
242
  )
271
- SYSTEM_CONFIG_ERROR = (
272
- ApiErrorIdentifier.SYSTEM_CONFIG_ERROR,
273
- ApiErrorType.EXCHANGE_ERROR,
243
+ JWT_EXPIRED = (
244
+ ApiErrorIdentifier.JWT_EXPIRED,
245
+ ApiErrorType.SERVER_ERROR,
274
246
  ApiErrorLevel.ERROR,
275
247
  )
276
- SERVICE_UNAVAILABLE = (
277
- ApiErrorIdentifier.SERVICE_UNAVAILABLE,
278
- ApiErrorType.EXCHANGE_ERROR,
248
+ LEVERAGE_EXCEEDED = (
249
+ ApiErrorIdentifier.LEVERAGE_EXCEEDED,
250
+ ApiErrorType.SERVER_ERROR,
279
251
  ApiErrorLevel.ERROR,
280
252
  )
281
- SYSTEM_BUSY = (
282
- ApiErrorIdentifier.SYSTEM_BUSY,
283
- ApiErrorType.EXCHANGE_ERROR,
253
+ LIQUIDATION_PRICE_VIOLATION = (
254
+ ApiErrorIdentifier.LIQUIDATION_PRICE_VIOLATION,
255
+ ApiErrorType.SERVER_ERROR,
284
256
  ApiErrorLevel.ERROR,
285
257
  )
286
- MAINTENANCE = (
287
- ApiErrorIdentifier.MAINTENANCE,
288
- ApiErrorType.EXCHANGE_ERROR,
258
+ NO_CREDENTIALS = (
259
+ ApiErrorIdentifier.NO_CREDENTIALS,
260
+ ApiErrorType.USER_ERROR,
289
261
  ApiErrorLevel.ERROR,
290
262
  )
291
- RPC_TIMEOUT = (
292
- ApiErrorIdentifier.RPC_TIMEOUT,
293
- ApiErrorType.EXCHANGE_ERROR,
263
+ OBJECT_NOT_FOUND = (
264
+ ApiErrorIdentifier.OBJECT_NOT_FOUND,
265
+ ApiErrorType.SERVER_ERROR,
294
266
  ApiErrorLevel.ERROR,
295
267
  )
296
- SETTLEMENT_IN_PROGRESS = (
297
- ApiErrorIdentifier.SETTLEMENT_IN_PROGRESS,
298
- ApiErrorType.EXCHANGE_ERROR,
299
- ApiErrorLevel.ERROR,
268
+ ORDER_ALREADY_FILLED = (
269
+ ApiErrorIdentifier.ORDER_ALREADY_FILLED,
270
+ ApiErrorType.SERVER_ERROR,
271
+ ApiErrorLevel.INFO,
300
272
  )
301
-
302
- # Trading Status
303
- TRADING_SUSPENDED = (
304
- ApiErrorIdentifier.TRADING_SUSPENDED,
305
- ApiErrorType.EXCHANGE_ERROR,
306
- ApiErrorLevel.ERROR,
273
+ ORDER_IN_PROCESS = (
274
+ ApiErrorIdentifier.ORDER_IN_PROCESS,
275
+ ApiErrorType.NO_ERROR,
276
+ ApiErrorLevel.INFO,
307
277
  )
308
- TRADING_LOCKED = (
309
- ApiErrorIdentifier.TRADING_LOCKED,
310
- ApiErrorType.EXCHANGE_ERROR,
278
+ ORDER_LIMIT_EXCEEDED = (
279
+ ApiErrorIdentifier.ORDER_LIMIT_EXCEEDED,
280
+ ApiErrorType.USER_ERROR,
311
281
  ApiErrorLevel.ERROR,
312
282
  )
313
-
314
- # Generic
315
- UNKNOWN_ERROR = (
316
- ApiErrorIdentifier.UNKNOWN_ERROR,
317
- ApiErrorType.EXCHANGE_ERROR,
283
+ ORDER_NOT_FOUND = (
284
+ ApiErrorIdentifier.ORDER_NOT_FOUND,
285
+ ApiErrorType.SERVER_ERROR,
318
286
  ApiErrorLevel.ERROR,
319
287
  )
320
- HTTP_ERROR = (
321
- ApiErrorIdentifier.HTTP_ERROR,
322
- ApiErrorType.EXCHANGE_ERROR,
288
+ ORDER_PRICE_INVALID = (
289
+ ApiErrorIdentifier.ORDER_PRICE_INVALID,
290
+ ApiErrorType.SERVER_ERROR,
323
291
  ApiErrorLevel.ERROR,
324
292
  )
325
-
326
- # Our Bot Errors
327
- ACTION_EXPIRED = (
328
- ApiErrorIdentifier.ACTION_EXPIRED,
329
- ApiErrorType.NO_ERROR,
330
- ApiErrorLevel.INFO,
331
- )
332
- ACTION_SKIPPED = (
333
- ApiErrorIdentifier.ACTION_SKIPPED,
334
- ApiErrorType.NO_ERROR,
335
- ApiErrorLevel.INFO,
336
- )
337
- BOT_DISABLED = (
338
- ApiErrorIdentifier.BOT_DISABLED,
293
+ ORDER_SIZE_TOO_LARGE = (
294
+ ApiErrorIdentifier.ORDER_SIZE_TOO_LARGE,
339
295
  ApiErrorType.USER_ERROR,
340
296
  ApiErrorLevel.WARNING,
341
297
  )
@@ -344,41 +300,44 @@ class ApiError(Enum):
344
300
  ApiErrorType.USER_ERROR,
345
301
  ApiErrorLevel.WARNING,
346
302
  )
347
- ORDER_SIZE_TOO_LARGE = (
348
- ApiErrorIdentifier.ORDER_SIZE_TOO_LARGE,
349
- ApiErrorType.USER_ERROR,
350
- ApiErrorLevel.WARNING,
351
- )
352
- HEDGE_MODE_NOT_ACTIVE = (
353
- ApiErrorIdentifier.HEDGE_MODE_NOT_ACTIVE,
303
+ POSITION_LIMIT_EXCEEDED = (
304
+ ApiErrorIdentifier.POSITION_LIMIT_EXCEEDED,
354
305
  ApiErrorType.USER_ERROR,
355
306
  ApiErrorLevel.ERROR,
356
307
  )
357
-
358
- # our API errors
359
- API_KEY_ALREADY_EXISTS = (
360
- ApiErrorIdentifier.API_KEY_ALREADY_EXISTS,
361
- ApiErrorType.USER_ERROR,
308
+ POSITION_NOT_FOUND = (
309
+ ApiErrorIdentifier.POSITION_NOT_FOUND,
310
+ ApiErrorType.NO_ERROR,
311
+ ApiErrorLevel.INFO,
312
+ )
313
+ POSITION_SUSPENDED = (
314
+ ApiErrorIdentifier.POSITION_SUSPENDED,
315
+ ApiErrorType.EXCHANGE_ERROR,
362
316
  ApiErrorLevel.ERROR,
363
317
  )
364
- DELETE_BOT_ERROR = (
365
- ApiErrorIdentifier.DELETE_BOT_ERROR,
318
+ POST_ONLY_REJECTED = (
319
+ ApiErrorIdentifier.POST_ONLY_REJECTED,
366
320
  ApiErrorType.SERVER_ERROR,
367
321
  ApiErrorLevel.ERROR,
368
322
  )
369
- JWT_EXPIRED = (
370
- ApiErrorIdentifier.JWT_EXPIRED,
323
+ REQUEST_SCOPE_EXCEEDED = (
324
+ ApiErrorIdentifier.REQUEST_SCOPE_EXCEEDED,
325
+ ApiErrorType.EXCHANGE_ERROR,
326
+ ApiErrorLevel.ERROR,
327
+ )
328
+ RISK_LIMIT_EXCEEDED = (
329
+ ApiErrorIdentifier.RISK_LIMIT_EXCEEDED,
371
330
  ApiErrorType.SERVER_ERROR,
372
331
  ApiErrorLevel.ERROR,
373
332
  )
374
- BOT_STOPPING_COMPLETED = (
375
- ApiErrorIdentifier.BOT_STOPPING_COMPLETED,
376
- ApiErrorType.NO_ERROR,
377
- ApiErrorLevel.INFO,
333
+ RPC_TIMEOUT = (
334
+ ApiErrorIdentifier.RPC_TIMEOUT,
335
+ ApiErrorType.EXCHANGE_ERROR,
336
+ ApiErrorLevel.ERROR,
378
337
  )
379
- OBJECT_NOT_FOUND = (
380
- ApiErrorIdentifier.OBJECT_NOT_FOUND,
381
- ApiErrorType.SERVER_ERROR,
338
+ SETTLEMENT_IN_PROGRESS = (
339
+ ApiErrorIdentifier.SETTLEMENT_IN_PROGRESS,
340
+ ApiErrorType.EXCHANGE_ERROR,
382
341
  ApiErrorLevel.ERROR,
383
342
  )
384
343
  STRATEGY_DISABLED = (
@@ -386,36 +345,40 @@ class ApiError(Enum):
386
345
  ApiErrorType.SERVER_ERROR,
387
346
  ApiErrorLevel.ERROR,
388
347
  )
389
- API_KEY_IN_USE = (
390
- ApiErrorIdentifier.API_KEY_IN_USE,
348
+ SUCCESS = (ApiErrorIdentifier.SUCCESS, ApiErrorType.NO_ERROR, ApiErrorLevel.SUCCESS)
349
+ SYMBOL_NOT_FOUND = (
350
+ ApiErrorIdentifier.SYMBOL_NOT_FOUND,
391
351
  ApiErrorType.SERVER_ERROR,
392
352
  ApiErrorLevel.ERROR,
393
353
  )
394
- BOT_ALREADY_DELETED = (
395
- ApiErrorIdentifier.BOT_ALREADY_DELETED,
396
- ApiErrorType.SERVER_ERROR,
397
- ApiErrorLevel.ERROR,
354
+ TRADING_ACTION_EXPIRED = (
355
+ ApiErrorIdentifier.TRADING_ACTION_EXPIRED,
356
+ ApiErrorType.NO_ERROR,
357
+ ApiErrorLevel.INFO,
398
358
  )
399
-
400
- # our auth errors
401
- INVALID_API_KEY = (
402
- ApiErrorIdentifier.INVALID_API_KEY,
403
- ApiErrorType.USER_ERROR,
359
+ TRADING_ACTION_SKIPPED = (
360
+ ApiErrorIdentifier.TRADING_ACTION_SKIPPED,
361
+ ApiErrorType.NO_ERROR,
362
+ ApiErrorLevel.INFO,
363
+ )
364
+ TRADING_LOCKED = (
365
+ ApiErrorIdentifier.TRADING_LOCKED,
366
+ ApiErrorType.EXCHANGE_ERROR,
404
367
  ApiErrorLevel.ERROR,
405
368
  )
406
- INVALID_BEARER = (
407
- ApiErrorIdentifier.INVALID_BEARER,
408
- ApiErrorType.USER_ERROR,
369
+ TRADING_SUSPENDED = (
370
+ ApiErrorIdentifier.TRADING_SUSPENDED,
371
+ ApiErrorType.EXCHANGE_ERROR,
409
372
  ApiErrorLevel.ERROR,
410
373
  )
411
- NO_CREDENTIALS = (
412
- ApiErrorIdentifier.NO_CREDENTIALS,
413
- ApiErrorType.USER_ERROR,
374
+ UNKNOWN_ERROR = (
375
+ ApiErrorIdentifier.UNKNOWN_ERROR,
376
+ ApiErrorType.EXCHANGE_ERROR,
414
377
  ApiErrorLevel.ERROR,
415
378
  )
416
- INSUFFICIENT_SCOPES = (
417
- ApiErrorIdentifier.INSUFFICIENT_SCOPES,
418
- ApiErrorType.USER_ERROR,
379
+ URL_NOT_FOUND = (
380
+ ApiErrorIdentifier.URL_NOT_FOUND,
381
+ ApiErrorType.SERVER_ERROR,
419
382
  ApiErrorLevel.ERROR,
420
383
  )
421
384
 
@@ -0,0 +1,38 @@
1
+ import re
2
+ import pyperclip
3
+
4
+
5
+ def sort_api_errors(file_content):
6
+ # Find the start of the ApiError class definition
7
+ class_start = file_content.find("class ApiErrorIdentifier(str, Enum):")
8
+ if class_start == -1:
9
+ return "Could not find ApiErrorIdentifier class"
10
+
11
+ # Find all enum definitions
12
+ enum_pattern = r' ([A-Z_]+)\s*=\s*"([a-z_]+)"'
13
+ enum_matches = re.finditer(enum_pattern, file_content)
14
+
15
+ # Extract all enum entries
16
+ enum_entries = []
17
+ for match in enum_matches:
18
+ full_match = match.group(0)
19
+ enum_name = match.group(1)
20
+ enum_entries.append((enum_name, full_match.strip()))
21
+
22
+ # Sort entries by enum name
23
+ sorted_entries = sorted(enum_entries, key=lambda x: x[0])
24
+
25
+ # Reconstruct the class content
26
+ class_header = "class ApiErrorIdentifier(str, Enum):\n\n"
27
+ sorted_content = class_header + "\n ".join(entry[1] for entry in sorted_entries)
28
+
29
+ return sorted_content
30
+
31
+
32
+ # Example usage:
33
+ if __name__ == "__main__":
34
+ with open("python/crypticorn/common/errors.py", "r") as f:
35
+ content = f.read()
36
+
37
+ sorted_content = sort_api_errors(content)
38
+ pyperclip.copy(sorted_content)
@@ -44,6 +44,7 @@ from crypticorn.pay.client.models.now_webhook_payload import NowWebhookPayload
44
44
  from crypticorn.pay.client.models.payment_status import PaymentStatus
45
45
  from crypticorn.pay.client.models.product_model import ProductModel
46
46
  from crypticorn.pay.client.models.product_subs_model import ProductSubsModel
47
+ from crypticorn.pay.client.models.scope import Scope
47
48
  from crypticorn.pay.client.models.services import Services
48
49
  from crypticorn.pay.client.models.unified_payment_model import UnifiedPaymentModel
49
50
  from crypticorn.pay.client.models.validation_error import ValidationError