graphsense-python 2.18.1__tar.gz → 2.19.0__tar.gz

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 (236) hide show
  1. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/PKG-INFO +4 -13
  2. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/README.md +3 -12
  3. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/__init__.py +5 -7
  4. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/address_scan/validators.py +93 -24
  5. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/__init__.py +0 -1
  6. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/addresses_api.py +0 -303
  7. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/general_api.py +3 -3
  8. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api_client.py +1 -1
  9. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/raw.py +21 -1
  10. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/configuration.py +2 -2
  11. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/ext/client.py +10 -6
  12. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/ext/output.py +2 -2
  13. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/__init__.py +1 -2
  14. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/address.py +1 -1
  15. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/capabilities.py +14 -4
  16. graphsense_python-2.19.0/graphsense/models/service_info.py +98 -0
  17. graphsense_python-2.19.0/graphsense/removed.py +146 -0
  18. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense_python.egg-info/PKG-INFO +4 -13
  19. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense_python.egg-info/SOURCES.txt +4 -6
  20. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/pyproject.toml +1 -1
  21. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_cli_raw_mirror.py +9 -15
  22. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_ext_client.py +6 -3
  23. graphsense_python-2.19.0/tests/test_removed.py +73 -0
  24. graphsense_python-2.18.1/graphsense/api/entities_api.py +0 -2773
  25. graphsense_python-2.18.1/graphsense/model/entity_addresses.py +0 -3
  26. graphsense_python-2.18.1/graphsense/model/neighbor_entities.py +0 -3
  27. graphsense_python-2.18.1/graphsense/models/entity_addresses.py +0 -96
  28. graphsense_python-2.18.1/graphsense/models/neighbor_entities.py +0 -96
  29. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/address_scan/__init__.py +0 -0
  30. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/address_scan/decompress.py +0 -0
  31. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/address_scan/detectors.py +0 -0
  32. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/address_scan/scanner.py +0 -0
  33. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/blocks_api.py +0 -0
  34. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/bulk_api.py +0 -0
  35. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/clusters_api.py +0 -0
  36. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/graph_api.py +0 -0
  37. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/rates_api.py +0 -0
  38. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/tags_api.py +0 -0
  39. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/tokens_api.py +0 -0
  40. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api/txs_api.py +0 -0
  41. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/api_response.py +0 -0
  42. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/__init__.py +0 -0
  43. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/__main__.py +0 -0
  44. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/bulk_cmd.py +0 -0
  45. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/context.py +0 -0
  46. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/convenience.py +0 -0
  47. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/errors.py +0 -0
  48. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/gs.py +0 -0
  49. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/main.py +0 -0
  50. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/cli/scan.py +0 -0
  51. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/compat.py +0 -0
  52. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/exceptions.py +0 -0
  53. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/ext/__init__.py +0 -0
  54. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/ext/bulk.py +0 -0
  55. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/ext/deprecation.py +0 -0
  56. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/ext/io.py +0 -0
  57. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/ext/selectors.py +0 -0
  58. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/gs_files/__init__.py +0 -0
  59. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/gs_files/encoder.py +0 -0
  60. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/gs_files/layout.py +0 -0
  61. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/gs_files/parser.py +0 -0
  62. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/gs_files/summary.py +0 -0
  63. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/gs_files/writer.py +0 -0
  64. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/__init__.py +0 -0
  65. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/actor.py +0 -0
  66. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/actor_context.py +0 -0
  67. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/address.py +0 -0
  68. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/address_tag.py +0 -0
  69. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/address_tags.py +0 -0
  70. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/address_tx.py +0 -0
  71. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/address_tx_utxo.py +0 -0
  72. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/address_txs.py +0 -0
  73. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/block.py +0 -0
  74. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/block_at_date.py +0 -0
  75. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/concept.py +0 -0
  76. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/currency_stats.py +0 -0
  77. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/entity.py +0 -0
  78. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/external_conversion.py +0 -0
  79. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/http_validation_error.py +0 -0
  80. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/label_summary.py +0 -0
  81. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/labeled_item_ref.py +0 -0
  82. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/link.py +0 -0
  83. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/link_utxo.py +0 -0
  84. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/links.py +0 -0
  85. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/links_inner.py +0 -0
  86. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/location_inner.py +0 -0
  87. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/neighbor_address.py +0 -0
  88. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/neighbor_addresses.py +0 -0
  89. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/neighbor_entity.py +0 -0
  90. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/rate.py +0 -0
  91. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/rates.py +0 -0
  92. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/related_address.py +0 -0
  93. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/related_addresses.py +0 -0
  94. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/search_result.py +0 -0
  95. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/search_result_by_currency.py +0 -0
  96. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/search_result_level1.py +0 -0
  97. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/search_result_level2.py +0 -0
  98. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/search_result_level3.py +0 -0
  99. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/search_result_level4.py +0 -0
  100. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/search_result_level5.py +0 -0
  101. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/search_result_level6.py +0 -0
  102. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/stats.py +0 -0
  103. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/tag.py +0 -0
  104. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/tag_cloud_entry.py +0 -0
  105. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/tag_summary.py +0 -0
  106. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/taxonomy.py +0 -0
  107. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/token_config.py +0 -0
  108. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/token_configs.py +0 -0
  109. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/tx.py +0 -0
  110. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/tx_account.py +0 -0
  111. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/tx_ref.py +0 -0
  112. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/tx_summary.py +0 -0
  113. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/tx_utxo.py +0 -0
  114. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/tx_value.py +0 -0
  115. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/user_reported_tag.py +0 -0
  116. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/user_tag_report_response.py +0 -0
  117. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/validation_error.py +0 -0
  118. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/model/values.py +0 -0
  119. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/actor.py +0 -0
  120. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/actor_context.py +0 -0
  121. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/address_output.py +0 -0
  122. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/address_tag.py +0 -0
  123. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/address_tags.py +0 -0
  124. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/address_tx.py +0 -0
  125. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/address_tx_utxo.py +0 -0
  126. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/address_txs.py +0 -0
  127. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/aggregate_cutoff.py +0 -0
  128. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/block.py +0 -0
  129. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/block_at_date.py +0 -0
  130. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/change_heuristics.py +0 -0
  131. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/cluster.py +0 -0
  132. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/cluster_addresses.py +0 -0
  133. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/coin_join_consensus.py +0 -0
  134. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/coin_join_heuristics.py +0 -0
  135. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/comparison_signal.py +0 -0
  136. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/comparison_verdict.py +0 -0
  137. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/concept.py +0 -0
  138. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/consensus_entry.py +0 -0
  139. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/currency_stats.py +0 -0
  140. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/direct_change_heuristic.py +0 -0
  141. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/entity.py +0 -0
  142. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/external_conversion.py +0 -0
  143. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_address_network_summary.py +0 -0
  144. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_address_overall.py +0 -0
  145. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_address_ref.py +0 -0
  146. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_address_summary.py +0 -0
  147. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_compare_note.py +0 -0
  148. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_compare_request.py +0 -0
  149. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_compare_signal.py +0 -0
  150. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_compare_verdict.py +0 -0
  151. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_compared_tx.py +0 -0
  152. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_comparison.py +0 -0
  153. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_lineage_edge.py +0 -0
  154. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_note.py +0 -0
  155. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_summary.py +0 -0
  156. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_summary_request.py +0 -0
  157. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_tx_characteristics.py +0 -0
  158. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_tx_network_summary.py +0 -0
  159. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_tx_overall.py +0 -0
  160. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_tx_ref.py +0 -0
  161. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/graph_tx_summary.py +0 -0
  162. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/http_validation_error.py +0 -0
  163. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/join_market_heuristic.py +0 -0
  164. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/label_summary.py +0 -0
  165. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/labeled_item_ref.py +0 -0
  166. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/lineage_edge.py +0 -0
  167. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/link.py +0 -0
  168. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/link_utxo.py +0 -0
  169. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/links.py +0 -0
  170. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/links_inner.py +0 -0
  171. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/location_inner.py +0 -0
  172. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/multi_input_change_heuristic.py +0 -0
  173. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/neighbor_address.py +0 -0
  174. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/neighbor_addresses.py +0 -0
  175. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/neighbor_cluster.py +0 -0
  176. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/neighbor_clusters.py +0 -0
  177. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/neighbor_entity.py +0 -0
  178. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/network_capabilities.py +0 -0
  179. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/one_time_change_heuristic.py +0 -0
  180. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/per_tx_inner.py +0 -0
  181. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/rate.py +0 -0
  182. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/rates.py +0 -0
  183. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/related_address.py +0 -0
  184. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/related_addresses.py +0 -0
  185. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/search_result.py +0 -0
  186. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/search_result_by_currency.py +0 -0
  187. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/search_result_level1.py +0 -0
  188. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/search_result_level2.py +0 -0
  189. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/search_result_level3.py +0 -0
  190. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/search_result_level4.py +0 -0
  191. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/search_result_level5.py +0 -0
  192. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/search_result_level6.py +0 -0
  193. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/stats.py +0 -0
  194. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tag.py +0 -0
  195. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tag_cloud_entry.py +0 -0
  196. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tag_summary.py +0 -0
  197. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/taxonomy.py +0 -0
  198. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/token_config.py +0 -0
  199. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/token_configs.py +0 -0
  200. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/transaction_comparison.py +0 -0
  201. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tx.py +0 -0
  202. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tx_account.py +0 -0
  203. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tx_characteristics.py +0 -0
  204. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tx_compared_item.py +0 -0
  205. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tx_ref.py +0 -0
  206. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tx_summary.py +0 -0
  207. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tx_utxo.py +0 -0
  208. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/tx_value.py +0 -0
  209. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/user_reported_tag.py +0 -0
  210. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/user_tag_report_response.py +0 -0
  211. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/utxo_heuristics.py +0 -0
  212. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/validation_error.py +0 -0
  213. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/values.py +0 -0
  214. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/wasabi_heuristic.py +0 -0
  215. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/whirlpool_coin_join_heuristic.py +0 -0
  216. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/models/whirlpool_tx0_heuristic.py +0 -0
  217. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/py.typed +0 -0
  218. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense/rest.py +0 -0
  219. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense_python.egg-info/dependency_links.txt +0 -0
  220. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense_python.egg-info/entry_points.txt +0 -0
  221. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense_python.egg-info/requires.txt +0 -0
  222. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/graphsense_python.egg-info/top_level.txt +0 -0
  223. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/setup.cfg +0 -0
  224. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_cli_bulk.py +0 -0
  225. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_cli_convenience.py +0 -0
  226. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_cli_errors.py +0 -0
  227. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_cli_gs.py +0 -0
  228. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_cli_io_pipes.py +0 -0
  229. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_cli_scan.py +0 -0
  230. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_cli_tags_and_dates.py +0 -0
  231. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_ext_bulk.py +0 -0
  232. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_ext_io.py +0 -0
  233. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_ext_output.py +0 -0
  234. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_ext_selectors.py +0 -0
  235. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_readme_template.py +0 -0
  236. {graphsense_python-2.18.1 → graphsense_python-2.19.0}/tests/test_regen_survives.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphsense-python
3
- Version: 2.18.1
3
+ Version: 2.19.0
4
4
  Summary: GraphSense API
5
5
  Author-email: Iknaio Cryptoasset Analytics GmbH <contact@iknaio.com>
6
6
  License-Expression: MIT
@@ -63,8 +63,8 @@ connector or tool source; the assistant then handles the rest.
63
63
 
64
64
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
65
65
 
66
- - API version: 2.18.1
67
- - Package version: 2.18.1
66
+ - API version: 2.19.0
67
+ - Package version: 2.19.0
68
68
  - Generator version: 7.19.0
69
69
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
70
70
  For more information, please visit [https://www.iknaio.com/](https://www.iknaio.com/)
@@ -162,7 +162,6 @@ Class | Method | HTTP request | Description
162
162
  ------------ | ------------- | ------------- | -------------
163
163
  *AddressesApi* | [**get_address**](docs/AddressesApi.md#get_address) | **GET** /{currency}/addresses/{address} | Get an address
164
164
  *AddressesApi* | [**get_address_cluster**](docs/AddressesApi.md#get_address_cluster) | **GET** /{currency}/addresses/{address}/cluster | Get the cluster for an address
165
- *AddressesApi* | [**get_address_entity**](docs/AddressesApi.md#get_address_entity) | **GET** /{currency}/addresses/{address}/entity | Get the entity for an address
166
165
  *AddressesApi* | [**get_tag_summary_by_address**](docs/AddressesApi.md#get_tag_summary_by_address) | **GET** /{currency}/addresses/{address}/tag_summary | Get address attribution tag summary
167
166
  *AddressesApi* | [**list_address_links**](docs/AddressesApi.md#list_address_links) | **GET** /{currency}/addresses/{address}/links | List transactions between two addresses
168
167
  *AddressesApi* | [**list_address_neighbors**](docs/AddressesApi.md#list_address_neighbors) | **GET** /{currency}/addresses/{address}/neighbors | List neighboring addresses
@@ -181,13 +180,6 @@ Class | Method | HTTP request | Description
181
180
  *ClustersApi* | [**list_cluster_neighbors**](docs/ClustersApi.md#list_cluster_neighbors) | **GET** /{currency}/clusters/{cluster}/neighbors | List neighboring clusters
182
181
  *ClustersApi* | [**list_cluster_txs**](docs/ClustersApi.md#list_cluster_txs) | **GET** /{currency}/clusters/{cluster}/txs | List cluster transactions
183
182
  *ClustersApi* | [**search_cluster_neighbors**](docs/ClustersApi.md#search_cluster_neighbors) | **GET** /{currency}/clusters/{cluster}/search | Search cluster neighborhood
184
- *EntitiesApi* | [**get_entity**](docs/EntitiesApi.md#get_entity) | **GET** /{currency}/entities/{entity} | Get entity details
185
- *EntitiesApi* | [**list_address_tags_by_entity**](docs/EntitiesApi.md#list_address_tags_by_entity) | **GET** /{currency}/entities/{entity}/tags | List entity address tags
186
- *EntitiesApi* | [**list_entity_addresses**](docs/EntitiesApi.md#list_entity_addresses) | **GET** /{currency}/entities/{entity}/addresses | List entity addresses
187
- *EntitiesApi* | [**list_entity_links**](docs/EntitiesApi.md#list_entity_links) | **GET** /{currency}/entities/{entity}/links | List transactions between entities
188
- *EntitiesApi* | [**list_entity_neighbors**](docs/EntitiesApi.md#list_entity_neighbors) | **GET** /{currency}/entities/{entity}/neighbors | List neighboring entities
189
- *EntitiesApi* | [**list_entity_txs**](docs/EntitiesApi.md#list_entity_txs) | **GET** /{currency}/entities/{entity}/txs | List entity transactions
190
- *EntitiesApi* | [**search_entity_neighbors**](docs/EntitiesApi.md#search_entity_neighbors) | **GET** /{currency}/entities/{entity}/search | Search entity neighborhood
191
183
  *GeneralApi* | [**get_capabilities**](docs/GeneralApi.md#get_capabilities) | **GET** /capabilities | Get per-network feature availability
192
184
  *GeneralApi* | [**get_statistics**](docs/GeneralApi.md#get_statistics) | **GET** /stats | Get platform statistics for supported currencies
193
185
  *GeneralApi* | [**search**](docs/GeneralApi.md#search) | **GET** /search | Search addresses, transactions, actors, and labels
@@ -235,7 +227,6 @@ Class | Method | HTTP request | Description
235
227
  - [CurrencyStats](docs/CurrencyStats.md)
236
228
  - [DirectChangeHeuristic](docs/DirectChangeHeuristic.md)
237
229
  - [Entity](docs/Entity.md)
238
- - [EntityAddresses](docs/EntityAddresses.md)
239
230
  - [ExternalConversion](docs/ExternalConversion.md)
240
231
  - [GraphAddressNetworkSummary](docs/GraphAddressNetworkSummary.md)
241
232
  - [GraphAddressOverall](docs/GraphAddressOverall.md)
@@ -270,7 +261,6 @@ Class | Method | HTTP request | Description
270
261
  - [NeighborAddresses](docs/NeighborAddresses.md)
271
262
  - [NeighborCluster](docs/NeighborCluster.md)
272
263
  - [NeighborClusters](docs/NeighborClusters.md)
273
- - [NeighborEntities](docs/NeighborEntities.md)
274
264
  - [NeighborEntity](docs/NeighborEntity.md)
275
265
  - [NetworkCapabilities](docs/NetworkCapabilities.md)
276
266
  - [OneTimeChangeHeuristic](docs/OneTimeChangeHeuristic.md)
@@ -287,6 +277,7 @@ Class | Method | HTTP request | Description
287
277
  - [SearchResultLevel4](docs/SearchResultLevel4.md)
288
278
  - [SearchResultLevel5](docs/SearchResultLevel5.md)
289
279
  - [SearchResultLevel6](docs/SearchResultLevel6.md)
280
+ - [ServiceInfo](docs/ServiceInfo.md)
290
281
  - [Stats](docs/Stats.md)
291
282
  - [Tag](docs/Tag.md)
292
283
  - [TagCloudEntry](docs/TagCloudEntry.md)
@@ -41,8 +41,8 @@ connector or tool source; the assistant then handles the rest.
41
41
 
42
42
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
43
43
 
44
- - API version: 2.18.1
45
- - Package version: 2.18.1
44
+ - API version: 2.19.0
45
+ - Package version: 2.19.0
46
46
  - Generator version: 7.19.0
47
47
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
48
48
  For more information, please visit [https://www.iknaio.com/](https://www.iknaio.com/)
@@ -140,7 +140,6 @@ Class | Method | HTTP request | Description
140
140
  ------------ | ------------- | ------------- | -------------
141
141
  *AddressesApi* | [**get_address**](docs/AddressesApi.md#get_address) | **GET** /{currency}/addresses/{address} | Get an address
142
142
  *AddressesApi* | [**get_address_cluster**](docs/AddressesApi.md#get_address_cluster) | **GET** /{currency}/addresses/{address}/cluster | Get the cluster for an address
143
- *AddressesApi* | [**get_address_entity**](docs/AddressesApi.md#get_address_entity) | **GET** /{currency}/addresses/{address}/entity | Get the entity for an address
144
143
  *AddressesApi* | [**get_tag_summary_by_address**](docs/AddressesApi.md#get_tag_summary_by_address) | **GET** /{currency}/addresses/{address}/tag_summary | Get address attribution tag summary
145
144
  *AddressesApi* | [**list_address_links**](docs/AddressesApi.md#list_address_links) | **GET** /{currency}/addresses/{address}/links | List transactions between two addresses
146
145
  *AddressesApi* | [**list_address_neighbors**](docs/AddressesApi.md#list_address_neighbors) | **GET** /{currency}/addresses/{address}/neighbors | List neighboring addresses
@@ -159,13 +158,6 @@ Class | Method | HTTP request | Description
159
158
  *ClustersApi* | [**list_cluster_neighbors**](docs/ClustersApi.md#list_cluster_neighbors) | **GET** /{currency}/clusters/{cluster}/neighbors | List neighboring clusters
160
159
  *ClustersApi* | [**list_cluster_txs**](docs/ClustersApi.md#list_cluster_txs) | **GET** /{currency}/clusters/{cluster}/txs | List cluster transactions
161
160
  *ClustersApi* | [**search_cluster_neighbors**](docs/ClustersApi.md#search_cluster_neighbors) | **GET** /{currency}/clusters/{cluster}/search | Search cluster neighborhood
162
- *EntitiesApi* | [**get_entity**](docs/EntitiesApi.md#get_entity) | **GET** /{currency}/entities/{entity} | Get entity details
163
- *EntitiesApi* | [**list_address_tags_by_entity**](docs/EntitiesApi.md#list_address_tags_by_entity) | **GET** /{currency}/entities/{entity}/tags | List entity address tags
164
- *EntitiesApi* | [**list_entity_addresses**](docs/EntitiesApi.md#list_entity_addresses) | **GET** /{currency}/entities/{entity}/addresses | List entity addresses
165
- *EntitiesApi* | [**list_entity_links**](docs/EntitiesApi.md#list_entity_links) | **GET** /{currency}/entities/{entity}/links | List transactions between entities
166
- *EntitiesApi* | [**list_entity_neighbors**](docs/EntitiesApi.md#list_entity_neighbors) | **GET** /{currency}/entities/{entity}/neighbors | List neighboring entities
167
- *EntitiesApi* | [**list_entity_txs**](docs/EntitiesApi.md#list_entity_txs) | **GET** /{currency}/entities/{entity}/txs | List entity transactions
168
- *EntitiesApi* | [**search_entity_neighbors**](docs/EntitiesApi.md#search_entity_neighbors) | **GET** /{currency}/entities/{entity}/search | Search entity neighborhood
169
161
  *GeneralApi* | [**get_capabilities**](docs/GeneralApi.md#get_capabilities) | **GET** /capabilities | Get per-network feature availability
170
162
  *GeneralApi* | [**get_statistics**](docs/GeneralApi.md#get_statistics) | **GET** /stats | Get platform statistics for supported currencies
171
163
  *GeneralApi* | [**search**](docs/GeneralApi.md#search) | **GET** /search | Search addresses, transactions, actors, and labels
@@ -213,7 +205,6 @@ Class | Method | HTTP request | Description
213
205
  - [CurrencyStats](docs/CurrencyStats.md)
214
206
  - [DirectChangeHeuristic](docs/DirectChangeHeuristic.md)
215
207
  - [Entity](docs/Entity.md)
216
- - [EntityAddresses](docs/EntityAddresses.md)
217
208
  - [ExternalConversion](docs/ExternalConversion.md)
218
209
  - [GraphAddressNetworkSummary](docs/GraphAddressNetworkSummary.md)
219
210
  - [GraphAddressOverall](docs/GraphAddressOverall.md)
@@ -248,7 +239,6 @@ Class | Method | HTTP request | Description
248
239
  - [NeighborAddresses](docs/NeighborAddresses.md)
249
240
  - [NeighborCluster](docs/NeighborCluster.md)
250
241
  - [NeighborClusters](docs/NeighborClusters.md)
251
- - [NeighborEntities](docs/NeighborEntities.md)
252
242
  - [NeighborEntity](docs/NeighborEntity.md)
253
243
  - [NetworkCapabilities](docs/NetworkCapabilities.md)
254
244
  - [OneTimeChangeHeuristic](docs/OneTimeChangeHeuristic.md)
@@ -265,6 +255,7 @@ Class | Method | HTTP request | Description
265
255
  - [SearchResultLevel4](docs/SearchResultLevel4.md)
266
256
  - [SearchResultLevel5](docs/SearchResultLevel5.md)
267
257
  - [SearchResultLevel6](docs/SearchResultLevel6.md)
258
+ - [ServiceInfo](docs/ServiceInfo.md)
268
259
  - [Stats](docs/Stats.md)
269
260
  - [Tag](docs/Tag.md)
270
261
  - [TagCloudEntry](docs/TagCloudEntry.md)
@@ -12,7 +12,7 @@
12
12
  """
13
13
 
14
14
 
15
- __version__ = "2.18.1"
15
+ __version__ = "2.19.0"
16
16
 
17
17
  # Define package exports
18
18
  __all__ = [
@@ -20,7 +20,6 @@ __all__ = [
20
20
  "BlocksApi",
21
21
  "BulkApi",
22
22
  "ClustersApi",
23
- "EntitiesApi",
24
23
  "GeneralApi",
25
24
  "GraphApi",
26
25
  "RatesApi",
@@ -59,7 +58,6 @@ __all__ = [
59
58
  "CurrencyStats",
60
59
  "DirectChangeHeuristic",
61
60
  "Entity",
62
- "EntityAddresses",
63
61
  "ExternalConversion",
64
62
  "GraphAddressNetworkSummary",
65
63
  "GraphAddressOverall",
@@ -94,7 +92,6 @@ __all__ = [
94
92
  "NeighborAddresses",
95
93
  "NeighborCluster",
96
94
  "NeighborClusters",
97
- "NeighborEntities",
98
95
  "NeighborEntity",
99
96
  "NetworkCapabilities",
100
97
  "OneTimeChangeHeuristic",
@@ -111,6 +108,7 @@ __all__ = [
111
108
  "SearchResultLevel4",
112
109
  "SearchResultLevel5",
113
110
  "SearchResultLevel6",
111
+ "ServiceInfo",
114
112
  "Stats",
115
113
  "Tag",
116
114
  "TagCloudEntry",
@@ -142,7 +140,6 @@ from graphsense.api.addresses_api import AddressesApi as AddressesApi
142
140
  from graphsense.api.blocks_api import BlocksApi as BlocksApi
143
141
  from graphsense.api.bulk_api import BulkApi as BulkApi
144
142
  from graphsense.api.clusters_api import ClustersApi as ClustersApi
145
- from graphsense.api.entities_api import EntitiesApi as EntitiesApi
146
143
  from graphsense.api.general_api import GeneralApi as GeneralApi
147
144
  from graphsense.api.graph_api import GraphApi as GraphApi
148
145
  from graphsense.api.rates_api import RatesApi as RatesApi
@@ -185,7 +182,6 @@ from graphsense.models.consensus_entry import ConsensusEntry as ConsensusEntry
185
182
  from graphsense.models.currency_stats import CurrencyStats as CurrencyStats
186
183
  from graphsense.models.direct_change_heuristic import DirectChangeHeuristic as DirectChangeHeuristic
187
184
  from graphsense.models.entity import Entity as Entity
188
- from graphsense.models.entity_addresses import EntityAddresses as EntityAddresses
189
185
  from graphsense.models.external_conversion import ExternalConversion as ExternalConversion
190
186
  from graphsense.models.graph_address_network_summary import GraphAddressNetworkSummary as GraphAddressNetworkSummary
191
187
  from graphsense.models.graph_address_overall import GraphAddressOverall as GraphAddressOverall
@@ -220,7 +216,6 @@ from graphsense.models.neighbor_address import NeighborAddress as NeighborAddres
220
216
  from graphsense.models.neighbor_addresses import NeighborAddresses as NeighborAddresses
221
217
  from graphsense.models.neighbor_cluster import NeighborCluster as NeighborCluster
222
218
  from graphsense.models.neighbor_clusters import NeighborClusters as NeighborClusters
223
- from graphsense.models.neighbor_entities import NeighborEntities as NeighborEntities
224
219
  from graphsense.models.neighbor_entity import NeighborEntity as NeighborEntity
225
220
  from graphsense.models.network_capabilities import NetworkCapabilities as NetworkCapabilities
226
221
  from graphsense.models.one_time_change_heuristic import OneTimeChangeHeuristic as OneTimeChangeHeuristic
@@ -237,6 +232,7 @@ from graphsense.models.search_result_level3 import SearchResultLevel3 as SearchR
237
232
  from graphsense.models.search_result_level4 import SearchResultLevel4 as SearchResultLevel4
238
233
  from graphsense.models.search_result_level5 import SearchResultLevel5 as SearchResultLevel5
239
234
  from graphsense.models.search_result_level6 import SearchResultLevel6 as SearchResultLevel6
235
+ from graphsense.models.service_info import ServiceInfo as ServiceInfo
240
236
  from graphsense.models.stats import Stats as Stats
241
237
  from graphsense.models.tag import Tag as Tag
242
238
  from graphsense.models.tag_cloud_entry import TagCloudEntry as TagCloudEntry
@@ -259,3 +255,5 @@ from graphsense.models.wasabi_heuristic import WasabiHeuristic as WasabiHeuristi
259
255
  from graphsense.models.whirlpool_coin_join_heuristic import WhirlpoolCoinJoinHeuristic as WhirlpoolCoinJoinHeuristic
260
256
  from graphsense.models.whirlpool_tx0_heuristic import WhirlpoolTx0Heuristic as WhirlpoolTx0Heuristic
261
257
 
258
+ # Pointers for removed client names (hand-written)
259
+ import graphsense.removed # noqa: F401, E402
@@ -258,6 +258,83 @@ def _keccak256(data: bytes) -> bytes:
258
258
  # btc/ltc/zec/trx copied verbatim from utils/address.py (pure already).
259
259
 
260
260
 
261
+ def base58_check_payload(s: str) -> "bytes | None":
262
+ """The payload (version + body, without checksum) of a Base58Check
263
+ string, or None if it is not one."""
264
+ try:
265
+ decoded = base58_check_decode(s)
266
+ except ValueError:
267
+ return None
268
+ if len(decoded) < 5:
269
+ return None
270
+ payload, checksum = decoded[:-4], decoded[-4:]
271
+ if hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4] != checksum:
272
+ return None
273
+ return payload
274
+
275
+
276
+ def base58_version_ok(s: str, versions: dict) -> bool:
277
+ """True if ``s`` is Base58Check with one of ``versions`` (version bytes
278
+ -> allowed body lengths). A valid checksum alone says nothing: private
279
+ keys, extended keys and other chains' addresses have one too."""
280
+ payload = base58_check_payload(s)
281
+ if payload is None:
282
+ return False
283
+ for version, lengths in versions.items():
284
+ if payload.startswith(version) and len(payload) - len(version) in lengths:
285
+ return True
286
+ return False
287
+
288
+
289
+ _BECH32_CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
290
+
291
+
292
+ def bech32_data(s: str, expected_hrp: str) -> "tuple | None":
293
+ """(checksum spec, 5-bit data without checksum) of a bech32/bech32m
294
+ string with ``expected_hrp``, else None. Unlike ``bech32_validate`` no
295
+ segwit rules and no 90-character limit (Zcash addresses are longer)."""
296
+ if s != s.lower() and s != s.upper():
297
+ return None
298
+ s = s.lower()
299
+ pos = s.rfind("1")
300
+ if pos < 1 or pos + 7 > len(s) or s[:pos] != expected_hrp:
301
+ return None
302
+ data_part = s[pos + 1 :]
303
+ if any(c not in _BECH32_CHARSET for c in data_part):
304
+ return None
305
+ data = [_BECH32_CHARSET.find(c) for c in data_part]
306
+ spec = bech32_checksum_spec(expected_hrp, data)
307
+ if spec is None:
308
+ return None
309
+ return spec, data[:-6]
310
+
311
+
312
+ # Base58Check version bytes -> length of the hash that follows.
313
+ _BTC_BASE58_VERSIONS = {
314
+ b"\x00": {20}, # P2PKH
315
+ b"\x05": {20}, # P2SH
316
+ b"\x6f": {20}, # testnet P2PKH
317
+ b"\xc4": {20}, # testnet P2SH
318
+ }
319
+ _LTC_BASE58_VERSIONS = {
320
+ b"\x30": {20}, # L, P2PKH
321
+ b"\x32": {20}, # M, P2SH
322
+ b"\x05": {20}, # 3, P2SH (old, shared with BTC)
323
+ b"\x6f": {20}, # testnet P2PKH
324
+ b"\xc4": {20}, # testnet P2SH (old)
325
+ b"\x3a": {20}, # testnet P2SH
326
+ }
327
+ _ZEC_BASE58_VERSIONS = {
328
+ b"\x1c\xb8": {20}, # t1, P2PKH
329
+ b"\x1c\xbd": {20}, # t3, P2SH
330
+ b"\x1d\x25": {20}, # tm, testnet P2PKH
331
+ b"\x1c\xba": {20}, # t2, testnet P2SH
332
+ b"\x16\x9a": {64}, # zc, Sprout
333
+ b"\x16\xb6": {64}, # zt, testnet Sprout
334
+ }
335
+ _TRX_BASE58_VERSIONS = {b"\x41": {20}}
336
+
337
+
261
338
  def validate_btc_address(address: str) -> bool:
262
339
  if not address:
263
340
  return False
@@ -265,13 +342,7 @@ def validate_btc_address(address: str) -> bool:
265
342
  return bech32_validate(address, "bc")
266
343
  elif address.lower().startswith("tb1"):
267
344
  return bech32_validate(address, "tb")
268
- elif address[0] in "13":
269
- return base58_check_validate(address)
270
- elif address[0] in "2mn":
271
- return base58_check_validate(address)
272
- elif address[0] in "59LKc":
273
- return base58_check_validate(address)
274
- return False
345
+ return base58_version_ok(address, _BTC_BASE58_VERSIONS)
275
346
 
276
347
 
277
348
  def validate_ltc_address(address: str) -> bool:
@@ -279,27 +350,25 @@ def validate_ltc_address(address: str) -> bool:
279
350
  return False
280
351
  if address.lower().startswith("ltc1"):
281
352
  return bech32_validate(address, "ltc")
282
- elif address[0] in "L3M":
283
- return base58_check_validate(address)
284
- elif address[0] in "2mn":
285
- return base58_check_validate(address)
286
- return False
353
+ return base58_version_ok(address, _LTC_BASE58_VERSIONS)
287
354
 
288
355
 
289
356
  def validate_zec_address(address: str) -> bool:
290
357
  if not address:
291
358
  return False
292
- if address.startswith("t1") or address.startswith("t3"):
293
- return base58_check_validate(address)
294
- elif address.startswith("tm"):
295
- return base58_check_validate(address)
296
- elif address.startswith("zc") and len(address) == 95:
297
- return base58_check_validate(address)
298
- elif (address.startswith("zs") or address.startswith("ztestsapling")) and len(
299
- address
300
- ) in [78, 88]:
301
- return base58_check_validate(address)
302
- return False
359
+ lowered = address.lower()
360
+ for hrp in ("zs", "ztestsapling"):
361
+ if lowered.startswith(hrp + "1"):
362
+ decoded = bech32_data(address, hrp)
363
+ if decoded is None or decoded[0] != "bech32":
364
+ return False
365
+ body = bech32_convertbits(decoded[1], 5, 8, False)
366
+ return body is not None and len(body) == 43
367
+ for hrp in ("u", "utest"):
368
+ if lowered.startswith(hrp + "1"):
369
+ decoded = bech32_data(address, hrp)
370
+ return decoded is not None and decoded[0] == "bech32m"
371
+ return base58_version_ok(address, _ZEC_BASE58_VERSIONS)
303
372
 
304
373
 
305
374
  def validate_trx_address(address: str) -> bool:
@@ -307,7 +376,7 @@ def validate_trx_address(address: str) -> bool:
307
376
  return False
308
377
  if not address.startswith("T") or len(address) != 34:
309
378
  return False
310
- return base58_check_validate(address)
379
+ return base58_version_ok(address, _TRX_BASE58_VERSIONS)
311
380
 
312
381
 
313
382
  def validate_eth_address(address: str) -> bool:
@@ -5,7 +5,6 @@ from graphsense.api.addresses_api import AddressesApi
5
5
  from graphsense.api.blocks_api import BlocksApi
6
6
  from graphsense.api.bulk_api import BulkApi
7
7
  from graphsense.api.clusters_api import ClustersApi
8
- from graphsense.api.entities_api import EntitiesApi
9
8
  from graphsense.api.general_api import GeneralApi
10
9
  from graphsense.api.graph_api import GraphApi
11
10
  from graphsense.api.rates_api import RatesApi
@@ -21,7 +21,6 @@ from graphsense.models.address import Address
21
21
  from graphsense.models.address_tags import AddressTags
22
22
  from graphsense.models.address_txs import AddressTxs
23
23
  from graphsense.models.cluster import Cluster
24
- from graphsense.models.entity import Entity
25
24
  from graphsense.models.links import Links
26
25
  from graphsense.models.neighbor_addresses import NeighborAddresses
27
26
  from graphsense.models.related_addresses import RelatedAddresses
@@ -733,308 +732,6 @@ class AddressesApi:
733
732
 
734
733
 
735
734
 
736
- @validate_call_compat
737
- def get_address_entity(
738
- self,
739
- currency: Annotated[StrictStr, Field(description="The cryptocurrency code (e.g., btc)")],
740
- address: Annotated[StrictStr, Field(description="The cryptocurrency address")],
741
- include_actors: Annotated[Optional[StrictBool], Field(description="Whether to include actor information")] = None,
742
- _request_timeout: Union[
743
- None,
744
- Annotated[StrictFloat, Field(gt=0)],
745
- Tuple[
746
- Annotated[StrictFloat, Field(gt=0)],
747
- Annotated[StrictFloat, Field(gt=0)]
748
- ]
749
- ] = None,
750
- _request_auth: Optional[Dict[StrictStr, Any]] = None,
751
- _content_type: Optional[StrictStr] = None,
752
- _headers: Optional[Dict[StrictStr, Any]] = None,
753
- _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
754
- ) -> Entity:
755
- """(Deprecated) Get the entity for an address
756
-
757
- Deprecated alias for `GET /{currency}/addresses/{address}/cluster`. Returns the address cluster that contains the given address.
758
-
759
- :param currency: The cryptocurrency code (e.g., btc) (required)
760
- :type currency: str
761
- :param address: The cryptocurrency address (required)
762
- :type address: str
763
- :param include_actors: Whether to include actor information
764
- :type include_actors: bool
765
- :param _request_timeout: timeout setting for this request. If one
766
- number provided, it will be total request
767
- timeout. It can also be a pair (tuple) of
768
- (connection, read) timeouts.
769
- :type _request_timeout: int, tuple(int, int), optional
770
- :param _request_auth: set to override the auth_settings for an a single
771
- request; this effectively ignores the
772
- authentication in the spec for a single request.
773
- :type _request_auth: dict, optional
774
- :param _content_type: force content-type for the request.
775
- :type _content_type: str, Optional
776
- :param _headers: set to override the headers for a single
777
- request; this effectively ignores the headers
778
- in the spec for a single request.
779
- :type _headers: dict, optional
780
- :param _host_index: set to override the host_index for a single
781
- request; this effectively ignores the host_index
782
- in the spec for a single request.
783
- :type _host_index: int, optional
784
- :return: Returns the result object.
785
- """ # noqa: E501
786
- warnings.warn("GET /{currency}/addresses/{address}/entity is deprecated.", DeprecationWarning)
787
-
788
- _param = self._get_address_entity_serialize(
789
- currency=currency,
790
- address=address,
791
- include_actors=include_actors,
792
- _request_auth=_request_auth,
793
- _content_type=_content_type,
794
- _headers=_headers,
795
- _host_index=_host_index
796
- )
797
-
798
- _response_types_map: Dict[str, Optional[str]] = {
799
- '200': "Entity",
800
- '404': None,
801
- '422': "HTTPValidationError",
802
- }
803
- response_data = self.api_client.call_api(
804
- *_param,
805
- _request_timeout=_request_timeout
806
- )
807
- response_data.read()
808
- return self.api_client.response_deserialize(
809
- response_data=response_data,
810
- response_types_map=_response_types_map,
811
- ).data
812
-
813
-
814
- @validate_call_compat
815
- def get_address_entity_with_http_info(
816
- self,
817
- currency: Annotated[StrictStr, Field(description="The cryptocurrency code (e.g., btc)")],
818
- address: Annotated[StrictStr, Field(description="The cryptocurrency address")],
819
- include_actors: Annotated[Optional[StrictBool], Field(description="Whether to include actor information")] = None,
820
- _request_timeout: Union[
821
- None,
822
- Annotated[StrictFloat, Field(gt=0)],
823
- Tuple[
824
- Annotated[StrictFloat, Field(gt=0)],
825
- Annotated[StrictFloat, Field(gt=0)]
826
- ]
827
- ] = None,
828
- _request_auth: Optional[Dict[StrictStr, Any]] = None,
829
- _content_type: Optional[StrictStr] = None,
830
- _headers: Optional[Dict[StrictStr, Any]] = None,
831
- _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
832
- ) -> ApiResponse[Entity]:
833
- """(Deprecated) Get the entity for an address
834
-
835
- Deprecated alias for `GET /{currency}/addresses/{address}/cluster`. Returns the address cluster that contains the given address.
836
-
837
- :param currency: The cryptocurrency code (e.g., btc) (required)
838
- :type currency: str
839
- :param address: The cryptocurrency address (required)
840
- :type address: str
841
- :param include_actors: Whether to include actor information
842
- :type include_actors: bool
843
- :param _request_timeout: timeout setting for this request. If one
844
- number provided, it will be total request
845
- timeout. It can also be a pair (tuple) of
846
- (connection, read) timeouts.
847
- :type _request_timeout: int, tuple(int, int), optional
848
- :param _request_auth: set to override the auth_settings for an a single
849
- request; this effectively ignores the
850
- authentication in the spec for a single request.
851
- :type _request_auth: dict, optional
852
- :param _content_type: force content-type for the request.
853
- :type _content_type: str, Optional
854
- :param _headers: set to override the headers for a single
855
- request; this effectively ignores the headers
856
- in the spec for a single request.
857
- :type _headers: dict, optional
858
- :param _host_index: set to override the host_index for a single
859
- request; this effectively ignores the host_index
860
- in the spec for a single request.
861
- :type _host_index: int, optional
862
- :return: Returns the result object.
863
- """ # noqa: E501
864
- warnings.warn("GET /{currency}/addresses/{address}/entity is deprecated.", DeprecationWarning)
865
-
866
- _param = self._get_address_entity_serialize(
867
- currency=currency,
868
- address=address,
869
- include_actors=include_actors,
870
- _request_auth=_request_auth,
871
- _content_type=_content_type,
872
- _headers=_headers,
873
- _host_index=_host_index
874
- )
875
-
876
- _response_types_map: Dict[str, Optional[str]] = {
877
- '200': "Entity",
878
- '404': None,
879
- '422': "HTTPValidationError",
880
- }
881
- response_data = self.api_client.call_api(
882
- *_param,
883
- _request_timeout=_request_timeout
884
- )
885
- response_data.read()
886
- return self.api_client.response_deserialize(
887
- response_data=response_data,
888
- response_types_map=_response_types_map,
889
- )
890
-
891
-
892
- @validate_call_compat
893
- def get_address_entity_without_preload_content(
894
- self,
895
- currency: Annotated[StrictStr, Field(description="The cryptocurrency code (e.g., btc)")],
896
- address: Annotated[StrictStr, Field(description="The cryptocurrency address")],
897
- include_actors: Annotated[Optional[StrictBool], Field(description="Whether to include actor information")] = None,
898
- _request_timeout: Union[
899
- None,
900
- Annotated[StrictFloat, Field(gt=0)],
901
- Tuple[
902
- Annotated[StrictFloat, Field(gt=0)],
903
- Annotated[StrictFloat, Field(gt=0)]
904
- ]
905
- ] = None,
906
- _request_auth: Optional[Dict[StrictStr, Any]] = None,
907
- _content_type: Optional[StrictStr] = None,
908
- _headers: Optional[Dict[StrictStr, Any]] = None,
909
- _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
910
- ) -> RESTResponseType:
911
- """(Deprecated) Get the entity for an address
912
-
913
- Deprecated alias for `GET /{currency}/addresses/{address}/cluster`. Returns the address cluster that contains the given address.
914
-
915
- :param currency: The cryptocurrency code (e.g., btc) (required)
916
- :type currency: str
917
- :param address: The cryptocurrency address (required)
918
- :type address: str
919
- :param include_actors: Whether to include actor information
920
- :type include_actors: bool
921
- :param _request_timeout: timeout setting for this request. If one
922
- number provided, it will be total request
923
- timeout. It can also be a pair (tuple) of
924
- (connection, read) timeouts.
925
- :type _request_timeout: int, tuple(int, int), optional
926
- :param _request_auth: set to override the auth_settings for an a single
927
- request; this effectively ignores the
928
- authentication in the spec for a single request.
929
- :type _request_auth: dict, optional
930
- :param _content_type: force content-type for the request.
931
- :type _content_type: str, Optional
932
- :param _headers: set to override the headers for a single
933
- request; this effectively ignores the headers
934
- in the spec for a single request.
935
- :type _headers: dict, optional
936
- :param _host_index: set to override the host_index for a single
937
- request; this effectively ignores the host_index
938
- in the spec for a single request.
939
- :type _host_index: int, optional
940
- :return: Returns the result object.
941
- """ # noqa: E501
942
- warnings.warn("GET /{currency}/addresses/{address}/entity is deprecated.", DeprecationWarning)
943
-
944
- _param = self._get_address_entity_serialize(
945
- currency=currency,
946
- address=address,
947
- include_actors=include_actors,
948
- _request_auth=_request_auth,
949
- _content_type=_content_type,
950
- _headers=_headers,
951
- _host_index=_host_index
952
- )
953
-
954
- _response_types_map: Dict[str, Optional[str]] = {
955
- '200': "Entity",
956
- '404': None,
957
- '422': "HTTPValidationError",
958
- }
959
- response_data = self.api_client.call_api(
960
- *_param,
961
- _request_timeout=_request_timeout
962
- )
963
- return response_data.response
964
-
965
-
966
- def _get_address_entity_serialize(
967
- self,
968
- currency,
969
- address,
970
- include_actors,
971
- _request_auth,
972
- _content_type,
973
- _headers,
974
- _host_index,
975
- ) -> RequestSerialized:
976
-
977
- _host = None
978
-
979
- _collection_formats: Dict[str, str] = {
980
- }
981
-
982
- _path_params: Dict[str, str] = {}
983
- _query_params: List[Tuple[str, str]] = []
984
- _header_params: Dict[str, Optional[str]] = _headers or {}
985
- _form_params: List[Tuple[str, str]] = []
986
- _files: Dict[
987
- str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
988
- ] = {}
989
- _body_params: Optional[bytes] = None
990
-
991
- # process the path parameters
992
- if currency is not None:
993
- _path_params['currency'] = currency
994
- if address is not None:
995
- _path_params['address'] = address
996
- # process the query parameters
997
- if include_actors is not None:
998
-
999
- _query_params.append(('include_actors', include_actors))
1000
-
1001
- # process the header parameters
1002
- # process the form parameters
1003
- # process the body parameter
1004
-
1005
-
1006
- # set the HTTP header `Accept`
1007
- if 'Accept' not in _header_params:
1008
- _header_params['Accept'] = self.api_client.select_header_accept(
1009
- [
1010
- 'application/json'
1011
- ]
1012
- )
1013
-
1014
-
1015
- # authentication setting
1016
- _auth_settings: List[str] = [
1017
- 'api_key'
1018
- ]
1019
-
1020
- return self.api_client.param_serialize(
1021
- method='GET',
1022
- resource_path='/{currency}/addresses/{address}/entity',
1023
- path_params=_path_params,
1024
- query_params=_query_params,
1025
- header_params=_header_params,
1026
- body=_body_params,
1027
- post_params=_form_params,
1028
- files=_files,
1029
- auth_settings=_auth_settings,
1030
- collection_formats=_collection_formats,
1031
- _host=_host,
1032
- _request_auth=_request_auth
1033
- )
1034
-
1035
-
1036
-
1037
-
1038
735
  @validate_call_compat
1039
736
  def get_tag_summary_by_address(
1040
737
  self,