django-cfg 1.3.5__py3-none-any.whl → 1.3.9__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 (252) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/__init__.py +24 -8
  3. django_cfg/apps/accounts/admin/activity_admin.py +146 -0
  4. django_cfg/apps/accounts/admin/filters.py +98 -22
  5. django_cfg/apps/accounts/admin/group_admin.py +86 -0
  6. django_cfg/apps/accounts/admin/inlines.py +42 -13
  7. django_cfg/apps/accounts/admin/otp_admin.py +115 -0
  8. django_cfg/apps/accounts/admin/registration_admin.py +173 -0
  9. django_cfg/apps/accounts/admin/resources.py +123 -19
  10. django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
  11. django_cfg/apps/accounts/admin/user_admin.py +362 -0
  12. django_cfg/apps/agents/admin/__init__.py +17 -4
  13. django_cfg/apps/agents/admin/execution_admin.py +204 -183
  14. django_cfg/apps/agents/admin/registry_admin.py +230 -255
  15. django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
  16. django_cfg/apps/agents/core/__init__.py +1 -1
  17. django_cfg/apps/agents/core/django_agent.py +221 -0
  18. django_cfg/apps/agents/core/exceptions.py +14 -0
  19. django_cfg/apps/agents/core/orchestrator.py +18 -3
  20. django_cfg/apps/knowbase/admin/__init__.py +1 -1
  21. django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
  22. django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
  23. django_cfg/apps/knowbase/admin/document_admin.py +269 -262
  24. django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
  25. django_cfg/apps/knowbase/config/settings.py +21 -4
  26. django_cfg/apps/knowbase/views/chat_views.py +3 -0
  27. django_cfg/apps/leads/admin/__init__.py +3 -1
  28. django_cfg/apps/leads/admin/leads_admin.py +235 -35
  29. django_cfg/apps/maintenance/admin/__init__.py +2 -2
  30. django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
  31. django_cfg/apps/maintenance/admin/log_admin.py +143 -61
  32. django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
  33. django_cfg/apps/maintenance/admin/site_admin.py +213 -352
  34. django_cfg/apps/newsletter/admin/__init__.py +29 -2
  35. django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
  36. django_cfg/apps/payments/admin/__init__.py +18 -27
  37. django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
  38. django_cfg/apps/payments/admin/balance_admin.py +166 -632
  39. django_cfg/apps/payments/admin/currencies_admin.py +235 -607
  40. django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
  41. django_cfg/apps/payments/admin/filters.py +83 -3
  42. django_cfg/apps/payments/admin/networks_admin.py +258 -0
  43. django_cfg/apps/payments/admin/payments_admin.py +171 -461
  44. django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
  45. django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
  46. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +105 -34
  47. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +12 -16
  48. django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
  49. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +13 -18
  50. django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
  51. django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
  52. django_cfg/apps/payments/middleware/api_access.py +32 -6
  53. django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +26 -0
  54. django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +28 -0
  55. django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +30 -0
  56. django_cfg/apps/payments/models/balance.py +12 -0
  57. django_cfg/apps/payments/models/currencies.py +106 -32
  58. django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
  59. django_cfg/apps/payments/services/core/currency_service.py +35 -28
  60. django_cfg/apps/payments/services/core/payment_service.py +1 -1
  61. django_cfg/apps/payments/services/providers/__init__.py +3 -0
  62. django_cfg/apps/payments/services/providers/base.py +95 -39
  63. django_cfg/apps/payments/services/providers/models/__init__.py +40 -0
  64. django_cfg/apps/payments/services/providers/models/base.py +122 -0
  65. django_cfg/apps/payments/services/providers/models/providers.py +87 -0
  66. django_cfg/apps/payments/services/providers/models/universal.py +48 -0
  67. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
  68. django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
  69. django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
  70. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
  71. django_cfg/apps/payments/services/providers/{nowpayments.py → nowpayments/provider.py} +240 -209
  72. django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
  73. django_cfg/apps/payments/services/providers/registry.py +4 -32
  74. django_cfg/apps/payments/services/providers/sync_service.py +277 -0
  75. django_cfg/apps/payments/static/payments/js/api-client.js +23 -5
  76. django_cfg/apps/payments/static/payments/js/payment-form.js +65 -8
  77. django_cfg/apps/payments/tasks/__init__.py +39 -0
  78. django_cfg/apps/payments/tasks/types.py +73 -0
  79. django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
  80. django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
  81. django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
  82. django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
  83. django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
  84. django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
  85. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
  86. django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
  87. django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
  88. django_cfg/apps/payments/urls_admin.py +1 -1
  89. django_cfg/apps/payments/views/api/currencies.py +5 -5
  90. django_cfg/apps/payments/views/overview/services.py +2 -2
  91. django_cfg/apps/payments/views/serializers/currencies.py +4 -3
  92. django_cfg/apps/support/admin/__init__.py +10 -1
  93. django_cfg/apps/support/admin/support_admin.py +338 -141
  94. django_cfg/apps/tasks/admin/__init__.py +11 -0
  95. django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
  96. django_cfg/apps/urls.py +1 -2
  97. django_cfg/config.py +1 -1
  98. django_cfg/core/config.py +10 -5
  99. django_cfg/core/generation.py +1 -1
  100. django_cfg/management/commands/__init__.py +13 -1
  101. django_cfg/management/commands/app_agent_diagnose.py +470 -0
  102. django_cfg/management/commands/app_agent_generate.py +342 -0
  103. django_cfg/management/commands/app_agent_info.py +308 -0
  104. django_cfg/management/commands/migrate_all.py +9 -3
  105. django_cfg/management/commands/migrator.py +11 -6
  106. django_cfg/management/commands/rundramatiq.py +3 -2
  107. django_cfg/middleware/__init__.py +0 -2
  108. django_cfg/models/api_keys.py +115 -0
  109. django_cfg/modules/django_admin/__init__.py +64 -0
  110. django_cfg/modules/django_admin/decorators/__init__.py +13 -0
  111. django_cfg/modules/django_admin/decorators/actions.py +106 -0
  112. django_cfg/modules/django_admin/decorators/display.py +106 -0
  113. django_cfg/modules/django_admin/mixins/__init__.py +14 -0
  114. django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
  115. django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
  116. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
  117. django_cfg/modules/django_admin/models/__init__.py +20 -0
  118. django_cfg/modules/django_admin/models/action_models.py +33 -0
  119. django_cfg/modules/django_admin/models/badge_models.py +20 -0
  120. django_cfg/modules/django_admin/models/base.py +26 -0
  121. django_cfg/modules/django_admin/models/display_models.py +31 -0
  122. django_cfg/modules/django_admin/utils/badges.py +159 -0
  123. django_cfg/modules/django_admin/utils/displays.py +247 -0
  124. django_cfg/modules/django_app_agent/__init__.py +87 -0
  125. django_cfg/modules/django_app_agent/agents/__init__.py +40 -0
  126. django_cfg/modules/django_app_agent/agents/base/__init__.py +24 -0
  127. django_cfg/modules/django_app_agent/agents/base/agent.py +354 -0
  128. django_cfg/modules/django_app_agent/agents/base/context.py +236 -0
  129. django_cfg/modules/django_app_agent/agents/base/executor.py +430 -0
  130. django_cfg/modules/django_app_agent/agents/generation/__init__.py +12 -0
  131. django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +15 -0
  132. django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +147 -0
  133. django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +99 -0
  134. django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +32 -0
  135. django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +290 -0
  136. django_cfg/modules/django_app_agent/agents/interfaces.py +376 -0
  137. django_cfg/modules/django_app_agent/core/__init__.py +33 -0
  138. django_cfg/modules/django_app_agent/core/config.py +300 -0
  139. django_cfg/modules/django_app_agent/core/exceptions.py +359 -0
  140. django_cfg/modules/django_app_agent/models/__init__.py +71 -0
  141. django_cfg/modules/django_app_agent/models/base.py +283 -0
  142. django_cfg/modules/django_app_agent/models/context.py +496 -0
  143. django_cfg/modules/django_app_agent/models/enums.py +481 -0
  144. django_cfg/modules/django_app_agent/models/requests.py +500 -0
  145. django_cfg/modules/django_app_agent/models/responses.py +585 -0
  146. django_cfg/modules/django_app_agent/pytest.ini +6 -0
  147. django_cfg/modules/django_app_agent/services/__init__.py +42 -0
  148. django_cfg/modules/django_app_agent/services/app_generator/__init__.py +30 -0
  149. django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +133 -0
  150. django_cfg/modules/django_app_agent/services/app_generator/context.py +40 -0
  151. django_cfg/modules/django_app_agent/services/app_generator/main.py +202 -0
  152. django_cfg/modules/django_app_agent/services/app_generator/structure.py +316 -0
  153. django_cfg/modules/django_app_agent/services/app_generator/validation.py +125 -0
  154. django_cfg/modules/django_app_agent/services/base.py +437 -0
  155. django_cfg/modules/django_app_agent/services/context_builder/__init__.py +34 -0
  156. django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +141 -0
  157. django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +276 -0
  158. django_cfg/modules/django_app_agent/services/context_builder/main.py +272 -0
  159. django_cfg/modules/django_app_agent/services/context_builder/models.py +40 -0
  160. django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +85 -0
  161. django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +31 -0
  162. django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +311 -0
  163. django_cfg/modules/django_app_agent/services/project_scanner/main.py +221 -0
  164. django_cfg/modules/django_app_agent/services/project_scanner/models.py +59 -0
  165. django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +94 -0
  166. django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +28 -0
  167. django_cfg/modules/django_app_agent/services/questioning_service/main.py +273 -0
  168. django_cfg/modules/django_app_agent/services/questioning_service/models.py +111 -0
  169. django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +251 -0
  170. django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +347 -0
  171. django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +356 -0
  172. django_cfg/modules/django_app_agent/services/report_service.py +332 -0
  173. django_cfg/modules/django_app_agent/services/template_manager/__init__.py +18 -0
  174. django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +236 -0
  175. django_cfg/modules/django_app_agent/services/template_manager/main.py +159 -0
  176. django_cfg/modules/django_app_agent/services/template_manager/models.py +36 -0
  177. django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +100 -0
  178. django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +105 -0
  179. django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +31 -0
  180. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +44 -0
  181. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +81 -0
  182. django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +107 -0
  183. django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +139 -0
  184. django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +91 -0
  185. django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +195 -0
  186. django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +35 -0
  187. django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +211 -0
  188. django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +200 -0
  189. django_cfg/modules/django_app_agent/services/validation_service/__init__.py +25 -0
  190. django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +333 -0
  191. django_cfg/modules/django_app_agent/services/validation_service/main.py +242 -0
  192. django_cfg/modules/django_app_agent/services/validation_service/models.py +66 -0
  193. django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +352 -0
  194. django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +272 -0
  195. django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +203 -0
  196. django_cfg/modules/django_app_agent/ui/__init__.py +25 -0
  197. django_cfg/modules/django_app_agent/ui/cli.py +419 -0
  198. django_cfg/modules/django_app_agent/ui/rich_components.py +622 -0
  199. django_cfg/modules/django_app_agent/utils/__init__.py +38 -0
  200. django_cfg/modules/django_app_agent/utils/logging.py +360 -0
  201. django_cfg/modules/django_app_agent/utils/validation.py +417 -0
  202. django_cfg/modules/django_currency/__init__.py +2 -2
  203. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  204. django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
  205. django_cfg/modules/django_currency/core/converter.py +12 -12
  206. django_cfg/modules/django_currency/database/__init__.py +2 -2
  207. django_cfg/modules/django_currency/database/database_loader.py +93 -42
  208. django_cfg/modules/django_llm/llm/client.py +10 -2
  209. django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
  210. django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
  211. django_cfg/modules/django_unfold/dashboard.py +14 -13
  212. django_cfg/modules/django_unfold/models/config.py +1 -1
  213. django_cfg/registry/core.py +3 -0
  214. django_cfg/registry/third_party.py +2 -2
  215. django_cfg/template_archive/django_sample.zip +0 -0
  216. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/METADATA +2 -1
  217. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/RECORD +224 -118
  218. django_cfg/apps/accounts/admin/activity.py +0 -96
  219. django_cfg/apps/accounts/admin/group.py +0 -17
  220. django_cfg/apps/accounts/admin/otp.py +0 -59
  221. django_cfg/apps/accounts/admin/registration_source.py +0 -97
  222. django_cfg/apps/accounts/admin/twilio_response.py +0 -227
  223. django_cfg/apps/accounts/admin/user.py +0 -300
  224. django_cfg/apps/agents/core/agent.py +0 -281
  225. django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
  226. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
  227. django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
  228. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
  229. django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
  230. django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
  231. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
  232. django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
  233. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
  234. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
  235. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
  236. django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
  237. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
  238. django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
  239. django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
  240. django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
  241. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
  242. django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
  243. django_cfg/apps/tasks/admin.py +0 -320
  244. django_cfg/middleware/static_nocache.py +0 -55
  245. django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
  246. /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
  247. /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
  248. /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
  249. /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
  250. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/WHEEL +0 -0
  251. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/entry_points.txt +0 -0
  252. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,879 @@
1
+ """
2
+ NowPayments currency parsers.
3
+
4
+ Handles parsing and normalization of NowPayments currency data.
5
+ """
6
+
7
+ from typing import Optional, Dict, Any, List
8
+ from django_cfg.modules.django_logger import get_logger
9
+
10
+ logger = get_logger("nowpayments_parsers")
11
+
12
+
13
+ class NowPaymentsCurrencyParser:
14
+ """Parser for NowPayments currency data."""
15
+
16
+ def __init__(self):
17
+ """Initialize currency parser."""
18
+ self.precise_patterns = self._get_precise_patterns()
19
+ self.fallback_patterns = self._get_fallback_patterns()
20
+ self.provider_code_patterns = self._get_provider_code_patterns()
21
+ self.network_suffixes = self._get_network_suffixes()
22
+
23
+ def parse_currency_code(
24
+ self,
25
+ provider_code: str,
26
+ currency_name: str,
27
+ network_code: Optional[str] = None,
28
+ ticker: str = ''
29
+ ) -> tuple[str, Optional[str]]:
30
+ """
31
+ Smart parsing using API data, prioritizing ticker field.
32
+
33
+ Uses ticker as primary source for base currency, then falls back to name parsing.
34
+
35
+ Examples:
36
+ - "1INCHBSC", "1Inch Network (BSC)", "bsc", "1inch" → ("1INCH", "bsc")
37
+ - "USDTERC20", "Tether USD (ERC-20)", "eth", "usdt" → ("USDT", "eth")
38
+ - "BTC", "Bitcoin", "btc", "btc" → ("BTC", "btc")
39
+ """
40
+ # Skip currencies with empty network - they are duplicates
41
+ if network_code is not None and network_code.strip() == "":
42
+ return None, None # Skip this currency
43
+
44
+ # Priority 1: Use ticker if available and meaningful
45
+ if ticker and len(ticker.strip()) > 0:
46
+ base_currency = ticker.upper().strip()
47
+ return base_currency, network_code
48
+
49
+ # Priority 2: Extract from provider code patterns
50
+ base_currency = self.extract_base_currency_from_provider_code(provider_code)
51
+ if base_currency != provider_code:
52
+ return base_currency, network_code
53
+
54
+ # Priority 3: Extract from name using patterns
55
+ base_currency = self.extract_base_currency_from_name(currency_name, provider_code)
56
+ return base_currency, network_code
57
+
58
+ def extract_base_currency_from_name(self, currency_name: str, fallback_code: str) -> str:
59
+ """Extract base currency from human-readable name using real API patterns."""
60
+ if not currency_name:
61
+ return fallback_code
62
+
63
+ name_lower = currency_name.lower()
64
+
65
+ # Check precise patterns first (most reliable)
66
+ for pattern, base in self.precise_patterns.items():
67
+ if pattern in name_lower:
68
+ return base
69
+
70
+ # Fallback patterns for edge cases
71
+ for pattern, base in self.fallback_patterns.items():
72
+ if pattern in name_lower:
73
+ return base
74
+
75
+ # Last resort: use the provider code as-is
76
+ return fallback_code
77
+
78
+ def extract_base_currency_from_provider_code(self, provider_code: str) -> str:
79
+ """Extract base currency from NowPayments provider code patterns."""
80
+ if not provider_code:
81
+ return provider_code
82
+
83
+ code_upper = provider_code.upper()
84
+
85
+ # Check exact matches first
86
+ if code_upper in self.provider_code_patterns:
87
+ return self.provider_code_patterns[code_upper]
88
+
89
+ # Pattern matching for common suffixes
90
+ for suffix in self.network_suffixes:
91
+ if code_upper.endswith(suffix):
92
+ base_part = code_upper[:-len(suffix)]
93
+ if len(base_part) >= 2: # Ensure we have a meaningful base
94
+ return base_part
95
+
96
+ # Return original if no pattern matches
97
+ return provider_code
98
+
99
+ def generate_currency_name(
100
+ self,
101
+ base_currency_code: str,
102
+ network_code: Optional[str],
103
+ original_name: str
104
+ ) -> str:
105
+ """Generate proper currency name based on base currency and network."""
106
+
107
+ # Base currency display names
108
+ base_names = {
109
+ 'BTC': 'Bitcoin',
110
+ 'ETH': 'Ethereum',
111
+ 'USDT': 'Tether USD',
112
+ 'USDC': 'USD Coin',
113
+ 'BNB': 'Binance Coin',
114
+ 'ADA': 'Cardano',
115
+ 'DOT': 'Polkadot',
116
+ 'MATIC': 'Polygon',
117
+ 'AVAX': 'Avalanche',
118
+ 'SOL': 'Solana',
119
+ 'LTC': 'Litecoin',
120
+ 'BCH': 'Bitcoin Cash',
121
+ 'XRP': 'Ripple',
122
+ 'DOGE': 'Dogecoin',
123
+ 'ATOM': 'Cosmos',
124
+ 'LINK': 'Chainlink',
125
+ 'UNI': 'Uniswap',
126
+ 'AAVE': 'Aave',
127
+ 'COMP': 'Compound',
128
+ 'MKR': 'Maker',
129
+ 'SNX': 'Synthetix',
130
+ 'YFI': 'yearn.finance',
131
+ 'SUSHI': 'SushiSwap',
132
+ 'CRV': 'Curve DAO Token',
133
+ 'BAL': 'Balancer',
134
+ 'REN': 'Ren',
135
+ 'KNC': 'Kyber Network',
136
+ 'ZRX': '0x',
137
+ 'BAT': 'Basic Attention Token',
138
+ 'ENJ': 'Enjin Coin',
139
+ 'MANA': 'Decentraland',
140
+ 'SAND': 'The Sandbox',
141
+ 'AXS': 'Axie Infinity',
142
+ 'FTM': 'Fantom',
143
+ 'ONE': 'Harmony',
144
+ 'NEAR': 'NEAR Protocol',
145
+ 'ALGO': 'Algorand',
146
+ 'XTZ': 'Tezos',
147
+ 'EOS': 'EOS',
148
+ 'TRX': 'TRON',
149
+ 'VET': 'VeChain',
150
+ 'THETA': 'Theta Network',
151
+ 'FIL': 'Filecoin',
152
+ 'ICP': 'Internet Computer',
153
+ 'HBAR': 'Hedera',
154
+ 'EGLD': 'MultiversX',
155
+ 'FLOW': 'Flow',
156
+ 'XLM': 'Stellar',
157
+ 'IOTA': 'IOTA',
158
+ 'XMR': 'Monero',
159
+ 'ZEC': 'Zcash',
160
+ 'DASH': 'Dash',
161
+ 'ETC': 'Ethereum Classic',
162
+ 'BSV': 'Bitcoin SV',
163
+ 'NEO': 'Neo',
164
+ 'QTUM': 'Qtum',
165
+ 'ZIL': 'Zilliqa',
166
+ 'ONT': 'Ontology',
167
+ 'ICX': 'ICON',
168
+ 'WAVES': 'Waves',
169
+ 'LSK': 'Lisk',
170
+ 'NANO': 'Nano',
171
+ 'DGB': 'DigiByte',
172
+ 'RVN': 'Ravencoin',
173
+ 'SC': 'Siacoin',
174
+ 'DCR': 'Decred',
175
+ 'ZEN': 'Horizen',
176
+ 'KMD': 'Komodo',
177
+ 'STRAT': 'Stratis',
178
+ 'ARK': 'Ark',
179
+ 'NXT': 'Nxt',
180
+ 'BTS': 'BitShares',
181
+ 'STEEM': 'Steem',
182
+ 'SBD': 'Steem Dollars',
183
+ 'GNT': 'Golem',
184
+ 'REP': 'Augur',
185
+ 'CVC': 'Civic',
186
+ 'STORJ': 'Storj',
187
+ 'FUN': 'FunFair',
188
+ 'DNT': 'district0x',
189
+ 'MCO': 'Monaco',
190
+ 'MTL': 'Metal',
191
+ 'PAY': 'TenX',
192
+ 'REQ': 'Request Network',
193
+ 'SALT': 'SALT',
194
+ 'SUB': 'Substratum',
195
+ 'POWR': 'Power Ledger',
196
+ 'ENG': 'Enigma',
197
+ 'BNT': 'Bancor',
198
+ 'FUEL': 'Etherparty',
199
+ 'MAID': 'MaidSafeCoin',
200
+ 'AMP': 'Synereo',
201
+ 'XAS': 'Asch',
202
+ 'PPT': 'Populous',
203
+ 'PART': 'Particl',
204
+ 'CLOAK': 'CloakCoin',
205
+ 'BLOCK': 'Blocknet',
206
+ 'NAV': 'NavCoin',
207
+ 'VIBE': 'VIBE',
208
+ 'LUN': 'Lunyr',
209
+ 'KIN': 'Kin',
210
+ 'TUSD': 'TrueUSD',
211
+ 'PAX': 'Paxos Standard',
212
+ 'GUSD': 'Gemini Dollar',
213
+ 'HUSD': 'HUSD',
214
+ 'BUSD': 'Binance USD',
215
+ 'DAI': 'Dai Stablecoin',
216
+ 'FRAX': 'Frax',
217
+ 'LUSD': 'Liquity USD',
218
+ 'SUSD': 'sUSD',
219
+ 'USDN': 'Neutrino USD',
220
+ 'RSR': 'Reserve Rights',
221
+ 'AMPL': 'Ampleforth',
222
+ 'TRIBE': 'Tribe',
223
+ 'FEI': 'Fei USD',
224
+ }
225
+
226
+ # Network display names
227
+ network_names = {
228
+ 'eth': 'Ethereum',
229
+ 'bsc': 'Binance Smart Chain',
230
+ 'matic': 'Polygon',
231
+ 'arbitrum': 'Arbitrum',
232
+ 'optimism': 'Optimism',
233
+ 'avalanche': 'Avalanche',
234
+ 'fantom': 'Fantom',
235
+ 'harmony': 'Harmony',
236
+ 'moonbeam': 'Moonbeam',
237
+ 'moonriver': 'Moonriver',
238
+ 'celo': 'Celo',
239
+ 'gnosis': 'Gnosis Chain',
240
+ 'aurora': 'Aurora',
241
+ 'cronos': 'Cronos',
242
+ 'evmos': 'Evmos',
243
+ 'milkomeda': 'Milkomeda',
244
+ 'syscoin': 'Syscoin NEVM',
245
+ 'metis': 'Metis',
246
+ 'boba': 'Boba Network',
247
+ 'fuse': 'Fuse',
248
+ 'telos': 'Telos EVM',
249
+ 'kcc': 'KuCoin Community Chain',
250
+ 'heco': 'Huobi ECO Chain',
251
+ 'okexchain': 'OKEx Chain',
252
+ 'xdai': 'xDai',
253
+ 'tron': 'TRON',
254
+ 'trx': 'TRON',
255
+ 'solana': 'Solana',
256
+ 'sol': 'Solana',
257
+ 'near': 'NEAR Protocol',
258
+ 'algorand': 'Algorand',
259
+ 'algo': 'Algorand',
260
+ 'cardano': 'Cardano',
261
+ 'ada': 'Cardano',
262
+ 'polkadot': 'Polkadot',
263
+ 'dot': 'Polkadot',
264
+ 'kusama': 'Kusama',
265
+ 'ksm': 'Kusama',
266
+ 'cosmos': 'Cosmos Hub',
267
+ 'atom': 'Cosmos Hub',
268
+ 'osmosis': 'Osmosis',
269
+ 'osmo': 'Osmosis',
270
+ 'terra': 'Terra',
271
+ 'luna': 'Terra',
272
+ 'avalanche': 'Avalanche C-Chain',
273
+ 'avax': 'Avalanche C-Chain',
274
+ 'bitcoin': 'Bitcoin',
275
+ 'btc': 'Bitcoin',
276
+ 'litecoin': 'Litecoin',
277
+ 'ltc': 'Litecoin',
278
+ 'bitcoincash': 'Bitcoin Cash',
279
+ 'bch': 'Bitcoin Cash',
280
+ 'dogecoin': 'Dogecoin',
281
+ 'doge': 'Dogecoin',
282
+ 'zcash': 'Zcash',
283
+ 'zec': 'Zcash',
284
+ 'monero': 'Monero',
285
+ 'xmr': 'Monero',
286
+ 'dash': 'Dash',
287
+ 'stellar': 'Stellar',
288
+ 'xlm': 'Stellar',
289
+ 'ripple': 'Ripple',
290
+ 'xrp': 'Ripple',
291
+ 'eos': 'EOS',
292
+ 'tezos': 'Tezos',
293
+ 'xtz': 'Tezos',
294
+ 'iota': 'IOTA',
295
+ 'miota': 'IOTA',
296
+ 'neo': 'Neo',
297
+ 'waves': 'Waves',
298
+ 'lisk': 'Lisk',
299
+ 'lsk': 'Lisk',
300
+ 'nano': 'Nano',
301
+ 'digibyte': 'DigiByte',
302
+ 'dgb': 'DigiByte',
303
+ 'ravencoin': 'Ravencoin',
304
+ 'rvn': 'Ravencoin',
305
+ 'siacoin': 'Siacoin',
306
+ 'sc': 'Siacoin',
307
+ 'decred': 'Decred',
308
+ 'dcr': 'Decred',
309
+ 'horizen': 'Horizen',
310
+ 'zen': 'Horizen',
311
+ 'komodo': 'Komodo',
312
+ 'kmd': 'Komodo',
313
+ 'stratis': 'Stratis',
314
+ 'strat': 'Stratis',
315
+ 'ark': 'Ark',
316
+ 'nxt': 'Nxt',
317
+ 'bitshares': 'BitShares',
318
+ 'bts': 'BitShares',
319
+ 'steem': 'Steem',
320
+ 'vechain': 'VeChain',
321
+ 'vet': 'VeChain',
322
+ 'theta': 'Theta Network',
323
+ 'filecoin': 'Filecoin',
324
+ 'fil': 'Filecoin',
325
+ 'internetcomputer': 'Internet Computer',
326
+ 'icp': 'Internet Computer',
327
+ 'hedera': 'Hedera',
328
+ 'hbar': 'Hedera',
329
+ 'elrond': 'MultiversX',
330
+ 'egld': 'MultiversX',
331
+ 'flow': 'Flow',
332
+ 'zilliqa': 'Zilliqa',
333
+ 'zil': 'Zilliqa',
334
+ 'ontology': 'Ontology',
335
+ 'ont': 'Ontology',
336
+ 'icon': 'ICON',
337
+ 'icx': 'ICON',
338
+ 'qtum': 'Qtum',
339
+ 'ethereumclassic': 'Ethereum Classic',
340
+ 'etc': 'Ethereum Classic',
341
+ 'bitcoinsv': 'Bitcoin SV',
342
+ 'bsv': 'Bitcoin SV',
343
+ }
344
+
345
+ base_name = base_names.get(base_currency_code, base_currency_code)
346
+
347
+ if not network_code or network_code == base_currency_code.lower():
348
+ # Native currency on its own network
349
+ return base_name
350
+
351
+ network_name = network_names.get(network_code.lower(), network_code.title())
352
+ return f"{base_name} ({network_name})"
353
+
354
+ def _get_precise_patterns(self) -> Dict[str, str]:
355
+ """Get precise patterns from real NowPayments API data."""
356
+ return {
357
+ # Stablecoins - most common
358
+ 'tether usd': 'USDT',
359
+ 'tether (': 'USDT', # "Tether (Arbitrum One)"
360
+ 'tether ': 'USDT', # "Tether USD (Algorand)"
361
+ 'usd coin': 'USDC', # "USD Coin (Ethereum)"
362
+ 'usd coin bridged': 'USDC', # "USD Coin Bridged (Polygon)"
363
+ 'trueusd': 'TUSD', # "TrueUSD (Tron)"
364
+ 'binance usd': 'BUSD', # "Binance USD (Polygon)"
365
+ 'paxos standard': 'PAX', # "Paxos Standard"
366
+ 'gemini dollar': 'GUSD', # "Gemini Dollar"
367
+
368
+ # Major cryptocurrencies
369
+ 'bitcoin': 'BTC',
370
+ 'ethereum': 'ETH',
371
+ 'cardano': 'ADA',
372
+ 'dogecoin': 'DOGE',
373
+ 'litecoin': 'LTC',
374
+ 'bitcoin cash': 'BCH',
375
+ 'ripple': 'XRP',
376
+ 'polkadot': 'DOT',
377
+ 'avalanche': 'AVAX',
378
+ 'chainlink': 'LINK',
379
+ 'uniswap': 'UNI',
380
+ 'ethereum classic': 'ETC',
381
+ 'stellar': 'XLM',
382
+ 'monero': 'XMR',
383
+ 'zcash': 'ZEC',
384
+ 'dash': 'DASH',
385
+ 'tezos': 'XTZ',
386
+ 'cosmos': 'ATOM',
387
+ 'algorand': 'ALGO',
388
+ 'eos': 'EOS',
389
+ 'tron': 'TRX',
390
+ 'vechain': 'VET',
391
+ 'theta network': 'THETA',
392
+ 'filecoin': 'FIL',
393
+ 'internet computer': 'ICP',
394
+ 'hedera': 'HBAR',
395
+ 'multiversx': 'EGLD',
396
+ 'elrond': 'EGLD',
397
+ 'flow': 'FLOW',
398
+ 'near protocol': 'NEAR',
399
+ 'solana': 'SOL',
400
+ 'fantom': 'FTM',
401
+ 'harmony': 'ONE',
402
+ 'zilliqa': 'ZIL',
403
+ 'ontology': 'ONT',
404
+ 'icon': 'ICX',
405
+ 'qtum': 'QTUM',
406
+ 'waves': 'WAVES',
407
+ 'lisk': 'LSK',
408
+ 'nano': 'NANO',
409
+ 'digibyte': 'DGB',
410
+ 'ravencoin': 'RVN',
411
+ 'siacoin': 'SC',
412
+ 'decred': 'DCR',
413
+ 'horizen': 'ZEN',
414
+ 'komodo': 'KMD',
415
+ 'stratis': 'STRAT',
416
+ 'ark': 'ARK',
417
+ 'nxt': 'NXT',
418
+ 'bitshares': 'BTS',
419
+ 'steem': 'STEEM',
420
+
421
+ # Exchange tokens
422
+ 'binance coin': 'BNB',
423
+ 'bnb': 'BNB',
424
+ 'kucoin shares': 'KCS',
425
+ 'huobi token': 'HT',
426
+ 'okb': 'OKB',
427
+ 'crypto.com coin': 'CRO',
428
+ 'ftx token': 'FTT',
429
+ 'binance usd': 'BUSD',
430
+
431
+ # Layer 1/2 tokens
432
+ 'polygon': 'MATIC',
433
+ 'matic network': 'MATIC',
434
+ 'avalanche': 'AVAX',
435
+ 'solana': 'SOL',
436
+ 'chainlink': 'LINK',
437
+ 'uniswap': 'UNI',
438
+ 'aave': 'AAVE',
439
+ 'compound': 'COMP',
440
+ 'maker': 'MKR',
441
+ 'synthetix': 'SNX',
442
+ 'yearn.finance': 'YFI',
443
+ 'sushiswap': 'SUSHI',
444
+ 'curve dao token': 'CRV',
445
+ 'balancer': 'BAL',
446
+ 'ren': 'REN',
447
+ 'kyber network': 'KNC',
448
+ '0x': 'ZRX',
449
+ 'basic attention token': 'BAT',
450
+ 'enjin coin': 'ENJ',
451
+ 'decentraland': 'MANA',
452
+ 'the sandbox': 'SAND',
453
+ 'axie infinity': 'AXS',
454
+
455
+ # Other stablecoins
456
+ 'dai stablecoin': 'DAI',
457
+ 'frax': 'FRAX',
458
+ 'liquity usd': 'LUSD',
459
+ 'susd': 'SUSD',
460
+ 'neutrino usd': 'USDN',
461
+ 'reserve rights': 'RSR',
462
+ 'ampleforth': 'AMPL',
463
+ 'tribe': 'TRIBE',
464
+ 'fei usd': 'FEI',
465
+
466
+ # Meme coins
467
+ 'shiba inu': 'SHIB',
468
+ 'dogecoin': 'DOGE',
469
+ 'safemoon': 'SAFEMOON',
470
+ 'floki inu': 'FLOKI',
471
+ 'baby doge coin': 'BABYDOGE',
472
+
473
+ # Gaming tokens
474
+ 'axie infinity': 'AXS',
475
+ 'smooth love potion': 'SLP',
476
+ 'the sandbox': 'SAND',
477
+ 'decentraland': 'MANA',
478
+ 'enjin coin': 'ENJ',
479
+ 'gala': 'GALA',
480
+ 'illuvium': 'ILV',
481
+ 'star atlas': 'ATLAS',
482
+ 'yield guild games': 'YGG',
483
+
484
+ # NFT tokens
485
+ 'opensea': 'OS',
486
+ 'looks rare': 'LOOKS',
487
+ 'x2y2': 'X2Y2',
488
+
489
+ # Privacy coins
490
+ 'monero': 'XMR',
491
+ 'zcash': 'ZEC',
492
+ 'dash': 'DASH',
493
+ 'verge': 'XVG',
494
+ 'beam': 'BEAM',
495
+ 'grin': 'GRIN',
496
+
497
+ # Oracle tokens
498
+ 'chainlink': 'LINK',
499
+ 'band protocol': 'BAND',
500
+ 'api3': 'API3',
501
+ 'tellor': 'TRB',
502
+
503
+ # Storage tokens
504
+ 'filecoin': 'FIL',
505
+ 'storj': 'STORJ',
506
+ 'siacoin': 'SC',
507
+ 'arweave': 'AR',
508
+
509
+ # Cross-chain tokens
510
+ 'thorchain': 'RUNE',
511
+ 'cosmos': 'ATOM',
512
+ 'polkadot': 'DOT',
513
+ 'kusama': 'KSM',
514
+ 'ren': 'REN',
515
+ 'anyswap': 'ANY',
516
+
517
+ # Yield farming tokens
518
+ 'yearn.finance': 'YFI',
519
+ 'harvest finance': 'FARM',
520
+ 'pickle finance': 'PICKLE',
521
+ 'cream finance': 'CREAM',
522
+ 'alpha finance lab': 'ALPHA',
523
+
524
+ # Lending tokens
525
+ 'aave': 'AAVE',
526
+ 'compound': 'COMP',
527
+ 'maker': 'MKR',
528
+ 'venus': 'XVS',
529
+ 'justlend': 'JST',
530
+
531
+ # Insurance tokens
532
+ 'nexus mutual': 'NXM',
533
+ 'cover protocol': 'COVER',
534
+ 'nsure network': 'NSURE',
535
+
536
+ # Prediction market tokens
537
+ 'augur': 'REP',
538
+ 'gnosis': 'GNO',
539
+ 'polymarket': 'POLY',
540
+
541
+ # Social tokens
542
+ 'rally': 'RLY',
543
+ 'whale': 'WHALE',
544
+ 'friends with benefits': 'FWB',
545
+
546
+ # Fan tokens
547
+ 'chiliz': 'CHZ',
548
+ 'socios.com': 'CHZ',
549
+
550
+ # Metaverse tokens
551
+ 'decentraland': 'MANA',
552
+ 'the sandbox': 'SAND',
553
+ 'enjin coin': 'ENJ',
554
+ 'bloktopia': 'BLOK',
555
+ 'star atlas': 'ATLAS',
556
+ 'illuvium': 'ILV',
557
+ 'gala': 'GALA',
558
+ 'axie infinity': 'AXS',
559
+ 'smooth love potion': 'SLP',
560
+ 'yield guild games': 'YGG',
561
+ 'merit circle': 'MC',
562
+ 'ultra': 'UOS',
563
+ 'wax': 'WAXP',
564
+ 'alien worlds': 'TLM',
565
+ 'my neighbor alice': 'ALICE',
566
+ 'radio caca': 'RACA',
567
+ 'derace': 'DERC',
568
+ 'vulcan forged': 'PYR',
569
+ 'mobox': 'MBOX',
570
+ 'cryptoblades': 'SKILL',
571
+ 'thetan arena': 'THG',
572
+ 'gods unchained': 'GODS',
573
+ 'immutable x': 'IMX',
574
+ 'ecomi': 'OMI',
575
+ 'veve': 'VVV',
576
+ 'efinity token': 'EFI',
577
+ 'chromia': 'CHR',
578
+ 'phantasma': 'SOUL',
579
+ 'wax': 'WAXP',
580
+ 'enjin coin': 'ENJ',
581
+ 'flow': 'FLOW',
582
+ 'dapper labs': 'FLOW',
583
+ 'nba top shot': 'FLOW',
584
+ 'cryptokitties': 'ETH',
585
+ 'cryptopunks': 'ETH',
586
+ 'bored ape yacht club': 'ETH',
587
+ 'mutant ape yacht club': 'ETH',
588
+ 'cool cats': 'ETH',
589
+ 'world of women': 'ETH',
590
+ 'pudgy penguins': 'ETH',
591
+ 'azuki': 'ETH',
592
+ 'clone x': 'ETH',
593
+ 'moonbirds': 'ETH',
594
+ 'otherdeeds for otherside': 'ETH',
595
+ 'yuga labs': 'ETH',
596
+ }
597
+
598
+ def _get_fallback_patterns(self) -> Dict[str, str]:
599
+ """Get fallback patterns for edge cases."""
600
+ return {
601
+ 'usdt': 'USDT',
602
+ 'usdc': 'USDC',
603
+ 'tusd': 'TUSD',
604
+ 'busd': 'BUSD',
605
+ 'dai': 'DAI',
606
+ 'frax': 'FRAX',
607
+ 'btc': 'BTC',
608
+ 'eth ': 'ETH',
609
+ 'ada': 'ADA',
610
+ 'doge': 'DOGE',
611
+ 'matic': 'MATIC',
612
+ 'avax': 'AVAX',
613
+ 'sol': 'SOL',
614
+ 'dot': 'DOT',
615
+ 'atom': 'ATOM',
616
+ 'near': 'NEAR',
617
+ 'algo': 'ALGO',
618
+ 'xtz': 'XTZ',
619
+ 'eos': 'EOS',
620
+ 'trx': 'TRX',
621
+ 'xlm': 'XLM',
622
+ 'xrp': 'XRP',
623
+ 'ltc': 'LTC',
624
+ 'bch': 'BCH',
625
+ 'etc': 'ETC',
626
+ 'xmr': 'XMR',
627
+ 'zec': 'ZEC',
628
+ 'dash': 'DASH',
629
+ 'bnb': 'BNB',
630
+ 'link': 'LINK',
631
+ 'uni': 'UNI',
632
+ 'aave': 'AAVE',
633
+ 'comp': 'COMP',
634
+ 'mkr': 'MKR',
635
+ 'snx': 'SNX',
636
+ 'yfi': 'YFI',
637
+ 'sushi': 'SUSHI',
638
+ 'crv': 'CRV',
639
+ 'bal': 'BAL',
640
+ 'ren': 'REN',
641
+ 'knc': 'KNC',
642
+ 'zrx': 'ZRX',
643
+ 'bat': 'BAT',
644
+ 'enj': 'ENJ',
645
+ 'mana': 'MANA',
646
+ 'sand': 'SAND',
647
+ 'axs': 'AXS',
648
+ 'ftm': 'FTM',
649
+ 'one': 'ONE',
650
+ 'zil': 'ZIL',
651
+ 'ont': 'ONT',
652
+ 'icx': 'ICX',
653
+ 'qtum': 'QTUM',
654
+ 'waves': 'WAVES',
655
+ 'lsk': 'LSK',
656
+ 'nano': 'NANO',
657
+ 'dgb': 'DGB',
658
+ 'rvn': 'RVN',
659
+ 'sc': 'SC',
660
+ 'dcr': 'DCR',
661
+ 'zen': 'ZEN',
662
+ 'kmd': 'KMD',
663
+ 'strat': 'STRAT',
664
+ 'ark': 'ARK',
665
+ 'nxt': 'NXT',
666
+ 'bts': 'BTS',
667
+ 'steem': 'STEEM',
668
+ 'vet': 'VET',
669
+ 'theta': 'THETA',
670
+ 'fil': 'FIL',
671
+ 'icp': 'ICP',
672
+ 'hbar': 'HBAR',
673
+ 'egld': 'EGLD',
674
+ 'flow': 'FLOW',
675
+ 'iota': 'IOTA',
676
+ 'shib': 'SHIB',
677
+ 'floki': 'FLOKI',
678
+ 'safemoon': 'SAFEMOON',
679
+ 'babydoge': 'BABYDOGE',
680
+ 'slp': 'SLP',
681
+ 'gala': 'GALA',
682
+ 'ilv': 'ILV',
683
+ 'atlas': 'ATLAS',
684
+ 'ygg': 'YGG',
685
+ 'rune': 'RUNE',
686
+ 'ksm': 'KSM',
687
+ 'any': 'ANY',
688
+ 'farm': 'FARM',
689
+ 'pickle': 'PICKLE',
690
+ 'cream': 'CREAM',
691
+ 'alpha': 'ALPHA',
692
+ 'xvs': 'XVS',
693
+ 'jst': 'JST',
694
+ 'nxm': 'NXM',
695
+ 'cover': 'COVER',
696
+ 'nsure': 'NSURE',
697
+ 'rep': 'REP',
698
+ 'gno': 'GNO',
699
+ 'poly': 'POLY',
700
+ 'rly': 'RLY',
701
+ 'whale': 'WHALE',
702
+ 'fwb': 'FWB',
703
+ 'chz': 'CHZ',
704
+ 'blok': 'BLOK',
705
+ 'mc': 'MC',
706
+ 'uos': 'UOS',
707
+ 'waxp': 'WAXP',
708
+ 'tlm': 'TLM',
709
+ 'alice': 'ALICE',
710
+ 'raca': 'RACA',
711
+ 'derc': 'DERC',
712
+ 'pyr': 'PYR',
713
+ 'mbox': 'MBOX',
714
+ 'skill': 'SKILL',
715
+ 'thg': 'THG',
716
+ 'gods': 'GODS',
717
+ 'imx': 'IMX',
718
+ 'omi': 'OMI',
719
+ 'vvv': 'VVV',
720
+ 'efi': 'EFI',
721
+ 'chr': 'CHR',
722
+ 'soul': 'SOUL',
723
+ }
724
+
725
+ def _get_provider_code_patterns(self) -> Dict[str, str]:
726
+ """Get NowPayments provider code patterns."""
727
+ return {
728
+ # Stablecoins with network suffixes
729
+ 'USDTERC20': 'USDT',
730
+ 'USDTTRC20': 'USDT',
731
+ 'USDTBSC': 'USDT',
732
+ 'USDTMATIC': 'USDT',
733
+ 'USDTARB': 'USDT',
734
+ 'USDTALGO': 'USDT',
735
+ 'USDTARC20': 'USDT', # Avalanche
736
+ 'USDTOP': 'USDT', # Optimism
737
+ 'USDTSOL': 'USDT', # Solana
738
+ 'USDTTON': 'USDT', # TON
739
+ 'USDTNEAR': 'USDT', # NEAR
740
+ 'USDTEOS': 'USDT', # EOS
741
+ 'USDTDOT': 'USDT', # Polkadot
742
+ 'USDTCELO': 'USDT', # Celo
743
+ 'USDTKAVA': 'USDT', # Kava
744
+ 'USDTXTZ': 'USDT', # Tezos
745
+
746
+ # USDC variants
747
+ 'USDCERC20': 'USDC',
748
+ 'USDCBSC': 'USDC',
749
+ 'USDCMATIC': 'USDC',
750
+ 'USDCARB': 'USDC',
751
+ 'USDCALGO': 'USDC',
752
+ 'USDCARC20': 'USDC', # Avalanche
753
+ 'USDCOP': 'USDC', # Optimism
754
+ 'USDCSOL': 'USDC', # Solana
755
+ 'USDCBASE': 'USDC', # Base
756
+ 'USDCKCC': 'USDC', # KCC
757
+ 'USDCXLM': 'USDC', # Stellar
758
+
759
+ # ETH variants
760
+ 'ETHBSC': 'ETH',
761
+ 'ETHARB': 'ETH',
762
+ 'ETHBASE': 'ETH',
763
+ 'ETHLNA': 'ETH', # Linea
764
+
765
+ # Other common patterns
766
+ 'BTCBSC': 'BTC', # Wrapped BTC
767
+ 'WBTC': 'BTC', # Wrapped Bitcoin
768
+ 'WETH': 'ETH', # Wrapped Ethereum
769
+
770
+ # Network-specific tokens with suffixes
771
+ 'BNBBSC': 'BNB',
772
+ 'MATICMATIC': 'MATIC',
773
+ 'AVAXARC20': 'AVAX',
774
+ 'SOLANASOL': 'SOL',
775
+
776
+ # Additional patterns from NowPayments
777
+ '1INCHBSC': '1INCH',
778
+ '1INCHERC20': '1INCH',
779
+ 'AAVEERC20': 'AAVE',
780
+ 'AAVEBSC': 'AAVE',
781
+ 'ADABSC': 'ADA',
782
+ 'ALGOERC20': 'ALGO',
783
+ 'APEERC20': 'APE',
784
+ 'APEBSC': 'APE',
785
+ 'ATOMCOSMOS': 'ATOM',
786
+ 'AVAXBSC': 'AVAX',
787
+ 'AXSERC20': 'AXS',
788
+ 'AXSBSC': 'AXS',
789
+ 'BATERC20': 'BAT',
790
+ 'BATBSC': 'BAT',
791
+ 'BCHBSC': 'BCH',
792
+ 'BNBERC20': 'BNB',
793
+ 'BUSDBSC': 'BUSD',
794
+ 'BUSDERC20': 'BUSD',
795
+ 'CAKEBSC': 'CAKE',
796
+ 'COMPBSC': 'COMP',
797
+ 'COMPERC20': 'COMP',
798
+ 'CRVERC20': 'CRV',
799
+ 'CRVBSC': 'CRV',
800
+ 'DAIBSC': 'DAI',
801
+ 'DAIERC20': 'DAI',
802
+ 'DOGEERC20': 'DOGE',
803
+ 'DOGEBSC': 'DOGE',
804
+ 'DOTBSC': 'DOT',
805
+ 'DOTERC20': 'DOT',
806
+ 'ENJERC20': 'ENJ',
807
+ 'ENJBSC': 'ENJ',
808
+ 'ETCBSC': 'ETC',
809
+ 'ETCERC20': 'ETC',
810
+ 'FILBSC': 'FIL',
811
+ 'FILERC20': 'FIL',
812
+ 'FTMBSC': 'FTM',
813
+ 'FTMERC20': 'FTM',
814
+ 'GALAERC20': 'GALA',
815
+ 'GALABSC': 'GALA',
816
+ 'GRTERC20': 'GRT',
817
+ 'GRTBSC': 'GRT',
818
+ 'ICPERC20': 'ICP',
819
+ 'ICPBSC': 'ICP',
820
+ 'LINKERC20': 'LINK',
821
+ 'LINKBSC': 'LINK',
822
+ 'LTCBSC': 'LTC',
823
+ 'LTCERC20': 'LTC',
824
+ 'MANAERC20': 'MANA',
825
+ 'MANABSC': 'MANA',
826
+ 'MKRBSC': 'MKR',
827
+ 'MKRERC20': 'MKR',
828
+ 'NEARERC20': 'NEAR',
829
+ 'NEARBSC': 'NEAR',
830
+ 'ONEERC20': 'ONE',
831
+ 'ONEBSC': 'ONE',
832
+ 'SANDERC20': 'SAND',
833
+ 'SANDBSC': 'SAND',
834
+ 'SHIBERC20': 'SHIB',
835
+ 'SHIBBSC': 'SHIB',
836
+ 'SNXERC20': 'SNX',
837
+ 'SNXBSC': 'SNX',
838
+ 'SOLERC20': 'SOL',
839
+ 'SOLBSC': 'SOL',
840
+ 'SUSHIERC20': 'SUSHI',
841
+ 'SUSHIBSC': 'SUSHI',
842
+ 'TRXBSC': 'TRX',
843
+ 'TRXERC20': 'TRX',
844
+ 'TUSDTRC20': 'TUSD',
845
+ 'TUSDBSC': 'TUSD',
846
+ 'TUSDERC20': 'TUSD',
847
+ 'UNIERC20': 'UNI',
848
+ 'UNIBSC': 'UNI',
849
+ 'VETBSC': 'VET',
850
+ 'VETERC20': 'VET',
851
+ 'XLMBSC': 'XLM',
852
+ 'XLMERC20': 'XLM',
853
+ 'XRPBSC': 'XRP',
854
+ 'XRPERC20': 'XRP',
855
+ 'XTZXTZ': 'XTZ',
856
+ 'YFIIERC20': 'YFI',
857
+ 'YFIIBSC': 'YFI',
858
+ 'ZRXERC20': 'ZRX',
859
+ 'ZRXBSC': 'ZRX',
860
+ }
861
+
862
+ def _get_network_suffixes(self) -> List[str]:
863
+ """Get common network suffixes for pattern matching."""
864
+ return [
865
+ 'ERC20', 'TRC20', 'BSC', 'MATIC', 'ARB', 'ALGO', 'ARC20',
866
+ 'OP', 'SOL', 'TON', 'NEAR', 'EOS', 'DOT', 'CELO', 'KAVA',
867
+ 'XTZ', 'BASE', 'KCC', 'XLM', 'LNA', 'AVAX', 'FTM', 'ONE',
868
+ 'HARMONY', 'MOONBEAM', 'MOONRIVER', 'GNOSIS', 'AURORA',
869
+ 'CRONOS', 'EVMOS', 'MILKOMEDA', 'SYSCOIN', 'METIS', 'BOBA',
870
+ 'FUSE', 'TELOS', 'HECO', 'OKEX', 'XDAI', 'COSMOS', 'OSMOSIS',
871
+ 'TERRA', 'KUSAMA', 'POLKADOT', 'CARDANO', 'STELLAR', 'RIPPLE',
872
+ 'BITCOIN', 'LITECOIN', 'BITCOINCASH', 'DOGECOIN', 'ZCASH',
873
+ 'MONERO', 'DASH', 'TEZOS', 'IOTA', 'NEO', 'WAVES', 'LISK',
874
+ 'NANO', 'DIGIBYTE', 'RAVENCOIN', 'SIACOIN', 'DECRED',
875
+ 'HORIZEN', 'KOMODO', 'STRATIS', 'ARK', 'NXT', 'BITSHARES',
876
+ 'STEEM', 'VECHAIN', 'THETA', 'FILECOIN', 'INTERNETCOMPUTER',
877
+ 'HEDERA', 'ELROND', 'FLOW', 'ZILLIQA', 'ONTOLOGY', 'ICON',
878
+ 'QTUM', 'ETHEREUMCLASSIC', 'BITCOINSV'
879
+ ]