graphsense-python 2.10.0__tar.gz → 2.12.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 (188) hide show
  1. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/PKG-INFO +67 -18
  2. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/README.md +62 -17
  3. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/__init__.py +12 -2
  4. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/__init__.py +1 -0
  5. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/addresses_api.py +310 -7
  6. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/blocks_api.py +1 -1
  7. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/bulk_api.py +1 -1
  8. graphsense_python-2.12.0/graphsense/api/clusters_api.py +2767 -0
  9. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/entities_api.py +19 -13
  10. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/general_api.py +1 -1
  11. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/rates_api.py +1 -1
  12. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/tags_api.py +1 -1
  13. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/tokens_api.py +1 -1
  14. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api/txs_api.py +1 -1
  15. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api_client.py +2 -2
  16. graphsense_python-2.12.0/graphsense/cli/__init__.py +1 -0
  17. graphsense_python-2.12.0/graphsense/cli/__main__.py +4 -0
  18. graphsense_python-2.12.0/graphsense/cli/bulk_cmd.py +95 -0
  19. graphsense_python-2.12.0/graphsense/cli/context.py +64 -0
  20. graphsense_python-2.12.0/graphsense/cli/convenience.py +444 -0
  21. graphsense_python-2.12.0/graphsense/cli/errors.py +74 -0
  22. graphsense_python-2.12.0/graphsense/cli/main.py +216 -0
  23. graphsense_python-2.12.0/graphsense/cli/raw.py +259 -0
  24. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/configuration.py +3 -3
  25. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/exceptions.py +1 -1
  26. graphsense_python-2.12.0/graphsense/ext/__init__.py +6 -0
  27. graphsense_python-2.12.0/graphsense/ext/bulk.py +51 -0
  28. graphsense_python-2.12.0/graphsense/ext/client.py +517 -0
  29. graphsense_python-2.12.0/graphsense/ext/deprecation.py +81 -0
  30. graphsense_python-2.12.0/graphsense/ext/io.py +238 -0
  31. graphsense_python-2.12.0/graphsense/ext/output.py +245 -0
  32. graphsense_python-2.12.0/graphsense/ext/selectors.py +28 -0
  33. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/__init__.py +5 -1
  34. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/actor.py +1 -1
  35. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/actor_context.py +1 -1
  36. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/address.py +10 -6
  37. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/address_output.py +1 -1
  38. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/address_tag.py +9 -5
  39. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/address_tags.py +1 -1
  40. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/address_tx.py +1 -1
  41. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/address_tx_utxo.py +1 -1
  42. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/address_txs.py +1 -1
  43. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/block.py +1 -1
  44. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/block_at_date.py +1 -1
  45. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/change_heuristics.py +1 -1
  46. graphsense_python-2.12.0/graphsense/models/cluster.py +140 -0
  47. graphsense_python-2.12.0/graphsense/models/cluster_addresses.py +96 -0
  48. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/coin_join_consensus.py +1 -1
  49. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/coin_join_heuristics.py +1 -1
  50. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/concept.py +1 -1
  51. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/consensus_entry.py +1 -1
  52. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/currency_stats.py +1 -1
  53. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/direct_change_heuristic.py +1 -1
  54. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/entity.py +2 -2
  55. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/entity_addresses.py +2 -2
  56. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/external_conversion.py +1 -1
  57. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/http_validation_error.py +1 -1
  58. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/join_market_heuristic.py +1 -1
  59. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/label_summary.py +1 -1
  60. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/labeled_item_ref.py +1 -1
  61. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/link.py +1 -1
  62. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/link_utxo.py +1 -1
  63. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/links.py +1 -1
  64. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/links_inner.py +1 -1
  65. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/location_inner.py +1 -1
  66. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/multi_input_change_heuristic.py +1 -1
  67. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/neighbor_address.py +1 -1
  68. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/neighbor_addresses.py +1 -1
  69. graphsense_python-2.10.0/graphsense/models/neighbor_entity.py → graphsense_python-2.12.0/graphsense/models/neighbor_cluster.py +13 -7
  70. graphsense_python-2.12.0/graphsense/models/neighbor_clusters.py +96 -0
  71. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/neighbor_entities.py +2 -2
  72. graphsense_python-2.12.0/graphsense/models/neighbor_entity.py +120 -0
  73. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/one_time_change_heuristic.py +1 -1
  74. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/rate.py +1 -1
  75. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/rates.py +1 -1
  76. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/related_address.py +1 -1
  77. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/related_addresses.py +1 -1
  78. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/search_result.py +1 -1
  79. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/search_result_by_currency.py +1 -1
  80. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/search_result_level1.py +1 -1
  81. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/search_result_level2.py +1 -1
  82. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/search_result_level3.py +1 -1
  83. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/search_result_level4.py +1 -1
  84. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/search_result_level5.py +1 -1
  85. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/search_result_level6.py +1 -1
  86. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/stats.py +1 -1
  87. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/tag.py +1 -1
  88. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/tag_cloud_entry.py +1 -1
  89. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/tag_summary.py +1 -1
  90. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/taxonomy.py +1 -1
  91. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/token_config.py +1 -1
  92. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/token_configs.py +1 -1
  93. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/tx.py +1 -1
  94. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/tx_account.py +1 -1
  95. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/tx_ref.py +1 -1
  96. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/tx_summary.py +1 -1
  97. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/tx_utxo.py +1 -1
  98. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/tx_value.py +1 -1
  99. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/user_reported_tag.py +1 -1
  100. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/user_tag_report_response.py +1 -1
  101. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/utxo_heuristics.py +1 -1
  102. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/validation_error.py +1 -1
  103. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/values.py +1 -1
  104. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/wasabi_heuristic.py +1 -1
  105. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/whirlpool_coin_join_heuristic.py +1 -1
  106. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/models/whirlpool_tx0_heuristic.py +1 -1
  107. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/rest.py +1 -1
  108. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense_python.egg-info/PKG-INFO +67 -18
  109. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense_python.egg-info/SOURCES.txt +35 -1
  110. graphsense_python-2.12.0/graphsense_python.egg-info/entry_points.txt +2 -0
  111. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense_python.egg-info/requires.txt +5 -0
  112. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/pyproject.toml +19 -1
  113. graphsense_python-2.12.0/tests/test_cli_bulk.py +85 -0
  114. graphsense_python-2.12.0/tests/test_cli_convenience.py +295 -0
  115. graphsense_python-2.12.0/tests/test_cli_errors.py +118 -0
  116. graphsense_python-2.12.0/tests/test_cli_io_pipes.py +132 -0
  117. graphsense_python-2.12.0/tests/test_cli_raw_mirror.py +88 -0
  118. graphsense_python-2.12.0/tests/test_cli_tags_and_dates.py +360 -0
  119. graphsense_python-2.12.0/tests/test_ext_bulk.py +53 -0
  120. graphsense_python-2.12.0/tests/test_ext_client.py +217 -0
  121. graphsense_python-2.12.0/tests/test_ext_io.py +157 -0
  122. graphsense_python-2.12.0/tests/test_ext_output.py +168 -0
  123. graphsense_python-2.12.0/tests/test_ext_selectors.py +25 -0
  124. graphsense_python-2.12.0/tests/test_readme_template.py +45 -0
  125. graphsense_python-2.12.0/tests/test_regen_survives.py +60 -0
  126. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/api_response.py +0 -0
  127. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/compat.py +0 -0
  128. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/__init__.py +0 -0
  129. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/actor.py +0 -0
  130. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/actor_context.py +0 -0
  131. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/address.py +0 -0
  132. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/address_tag.py +0 -0
  133. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/address_tags.py +0 -0
  134. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/address_tx.py +0 -0
  135. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/address_tx_utxo.py +0 -0
  136. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/address_txs.py +0 -0
  137. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/block.py +0 -0
  138. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/block_at_date.py +0 -0
  139. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/concept.py +0 -0
  140. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/currency_stats.py +0 -0
  141. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/entity.py +0 -0
  142. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/entity_addresses.py +0 -0
  143. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/external_conversion.py +0 -0
  144. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/http_validation_error.py +0 -0
  145. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/label_summary.py +0 -0
  146. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/labeled_item_ref.py +0 -0
  147. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/link.py +0 -0
  148. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/link_utxo.py +0 -0
  149. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/links.py +0 -0
  150. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/links_inner.py +0 -0
  151. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/location_inner.py +0 -0
  152. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/neighbor_address.py +0 -0
  153. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/neighbor_addresses.py +0 -0
  154. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/neighbor_entities.py +0 -0
  155. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/neighbor_entity.py +0 -0
  156. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/rate.py +0 -0
  157. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/rates.py +0 -0
  158. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/related_address.py +0 -0
  159. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/related_addresses.py +0 -0
  160. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/search_result.py +0 -0
  161. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/search_result_by_currency.py +0 -0
  162. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/search_result_level1.py +0 -0
  163. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/search_result_level2.py +0 -0
  164. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/search_result_level3.py +0 -0
  165. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/search_result_level4.py +0 -0
  166. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/search_result_level5.py +0 -0
  167. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/search_result_level6.py +0 -0
  168. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/stats.py +0 -0
  169. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/tag.py +0 -0
  170. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/tag_cloud_entry.py +0 -0
  171. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/tag_summary.py +0 -0
  172. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/taxonomy.py +0 -0
  173. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/token_config.py +0 -0
  174. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/token_configs.py +0 -0
  175. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/tx.py +0 -0
  176. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/tx_account.py +0 -0
  177. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/tx_ref.py +0 -0
  178. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/tx_summary.py +0 -0
  179. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/tx_utxo.py +0 -0
  180. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/tx_value.py +0 -0
  181. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/user_reported_tag.py +0 -0
  182. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/user_tag_report_response.py +0 -0
  183. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/validation_error.py +0 -0
  184. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/model/values.py +0 -0
  185. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense/py.typed +0 -0
  186. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense_python.egg-info/dependency_links.txt +0 -0
  187. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/graphsense_python.egg-info/top_level.txt +0 -0
  188. {graphsense_python-2.10.0 → graphsense_python-2.12.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphsense-python
3
- Version: 2.10.0
3
+ Version: 2.12.0
4
4
  Summary: GraphSense API
5
5
  Author-email: Iknaio Cryptoasset Analytics GmbH <contact@iknaio.com>
6
6
  License-Expression: MIT
@@ -15,14 +15,50 @@ Requires-Dist: urllib3<3.0.0,>=2.1.0
15
15
  Requires-Dist: python-dateutil>=2.8.2
16
16
  Requires-Dist: pydantic>=2
17
17
  Requires-Dist: typing-extensions>=4.7.1
18
+ Provides-Extra: cli
19
+ Requires-Dist: rich-click>=1.7; extra == "cli"
20
+ Requires-Dist: jmespath>=1.0; extra == "cli"
21
+ Requires-Dist: pygments>=2.15; extra == "cli"
18
22
 
19
23
  # graphsense-python
20
- GraphSense API provides programmatic access to blockchain analytics data across multiple ledgers. Use it to explore addresses, entities, blocks, transactions, tags, token activity, and exchange-rate context, and to integrate investigation workflows into your own applications and automation.
24
+ GraphSense API provides programmatic access to blockchain analytics data across
25
+ multiple ledgers. Use it to explore addresses, clusters, blocks, transactions,
26
+ tags, token activity, and exchange-rate context, and to integrate investigation
27
+ workflows into your own applications and automation.
28
+
29
+ ## Versioning and deprecation policy
30
+
31
+ The API follows semantic versioning. Minor releases are additive and
32
+ backwards-compatible; breaking changes only happen in major releases, which
33
+ are rare and announced in advance.
34
+
35
+ Deprecated endpoints and fields remain fully functional for at least six
36
+ months after they are marked deprecated. During that window they are
37
+ highlighted with a strikethrough in the docs and in generated clients, and
38
+ responses from deprecated endpoints carry a `Deprecation` HTTP header that
39
+ client tooling can detect. Replacement endpoints and fields are always
40
+ introduced before the deprecated surface is removed.
41
+
42
+ See the [full versioning and deprecation policy](https://github.com/graphsense/graphsense-lib/blob/master/README.md#rest-api-evolution-and-deprecation-policy)
43
+ for details.
44
+
45
+
46
+ ## Using the high-level wrapper or CLI
47
+
48
+ Two hand-written convenience layers ride on top of the generated client
49
+ (both protected from regeneration via `.openapi-generator-ignore`):
50
+
51
+ - **Python** — [`README_EXT.md`](README_EXT.md) documents
52
+ `graphsense.ext.GraphSense`, a single facade that removes boilerplate and
53
+ bundles commonly-paired calls (ships with the base install).
54
+ - **Shell** — [`README_CLI.md`](README_CLI.md) documents the `graphsense` CLI
55
+ (installed via `uv add 'graphsense-python[cli]'`): pipe-friendly,
56
+ JSON/CSV I/O, auto-bulk.
21
57
 
22
58
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
23
59
 
24
- - API version: 2.10.0
25
- - Package version: 2.10.0
60
+ - API version: 2.12.0
61
+ - Package version: 2.12.0
26
62
  - Generator version: 7.19.0
27
63
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
28
64
  For more information, please visit [https://www.iknaio.com/](https://www.iknaio.com/)
@@ -32,37 +68,39 @@ For more information, please visit [https://www.iknaio.com/](https://www.iknaio.
32
68
  Python 3.9+
33
69
 
34
70
  ## Installation & Usage
35
- ### pip install
36
71
 
37
- If the python package is hosted on a repository, you can install directly using:
72
+ This project uses [uv](https://docs.astral.sh/uv/) for environment and
73
+ dependency management.
74
+
75
+ ### Add to a uv project
38
76
 
39
77
  ```sh
40
- pip install git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git
78
+ uv add graphsense-python
79
+ # or, to include the optional `[cli]` extra (installs the `graphsense` CLI):
80
+ uv add 'graphsense-python[cli]'
41
81
  ```
42
- (you may need to run `pip` with root permission: `sudo pip install git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git`)
43
82
 
44
- Then import the package:
45
- ```python
46
- import graphsense
47
- ```
83
+ ### Install from git
48
84
 
49
- ### Setuptools
85
+ ```sh
86
+ uv add 'git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git'
87
+ ```
50
88
 
51
- Install via [Setuptools](http://pypi.python.org/pypi/setuptools).
89
+ ### One-off script usage
52
90
 
53
91
  ```sh
54
- python setup.py install --user
92
+ uv run --with graphsense-python python my_script.py
55
93
  ```
56
- (or `sudo python setup.py install` to install the package for all users)
57
94
 
58
95
  Then import the package:
96
+
59
97
  ```python
60
98
  import graphsense
61
99
  ```
62
100
 
63
101
  ### Tests
64
102
 
65
- Execute `pytest` to run the tests.
103
+ Execute `uv run pytest` to run the tests.
66
104
 
67
105
  ## Getting Started
68
106
 
@@ -117,6 +155,7 @@ All URIs are relative to *https://api.iknaio.com*
117
155
  Class | Method | HTTP request | Description
118
156
  ------------ | ------------- | ------------- | -------------
119
157
  *AddressesApi* | [**get_address**](docs/AddressesApi.md#get_address) | **GET** /{currency}/addresses/{address} | Get an address
158
+ *AddressesApi* | [**get_address_cluster**](docs/AddressesApi.md#get_address_cluster) | **GET** /{currency}/addresses/{address}/cluster | Get the cluster for an address
120
159
  *AddressesApi* | [**get_address_entity**](docs/AddressesApi.md#get_address_entity) | **GET** /{currency}/addresses/{address}/entity | Get the entity for an address
121
160
  *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
122
161
  *AddressesApi* | [**list_address_links**](docs/AddressesApi.md#list_address_links) | **GET** /{currency}/addresses/{address}/links | List transactions between two addresses
@@ -129,6 +168,13 @@ Class | Method | HTTP request | Description
129
168
  *BlocksApi* | [**list_block_txs**](docs/BlocksApi.md#list_block_txs) | **GET** /{currency}/blocks/{height}/txs | List transactions in a block
130
169
  *BulkApi* | [**bulk_csv**](docs/BulkApi.md#bulk_csv) | **POST** /{currency}/bulk.csv/{operation} | Stream bulk operation results as CSV
131
170
  *BulkApi* | [**bulk_json**](docs/BulkApi.md#bulk_json) | **POST** /{currency}/bulk.json/{operation} | Stream bulk operation results as JSON
171
+ *ClustersApi* | [**get_cluster**](docs/ClustersApi.md#get_cluster) | **GET** /{currency}/clusters/{cluster} | Get cluster details
172
+ *ClustersApi* | [**list_address_tags_by_cluster**](docs/ClustersApi.md#list_address_tags_by_cluster) | **GET** /{currency}/clusters/{cluster}/tags | List cluster address tags
173
+ *ClustersApi* | [**list_cluster_addresses**](docs/ClustersApi.md#list_cluster_addresses) | **GET** /{currency}/clusters/{cluster}/addresses | List cluster addresses
174
+ *ClustersApi* | [**list_cluster_links**](docs/ClustersApi.md#list_cluster_links) | **GET** /{currency}/clusters/{cluster}/links | List transactions between clusters
175
+ *ClustersApi* | [**list_cluster_neighbors**](docs/ClustersApi.md#list_cluster_neighbors) | **GET** /{currency}/clusters/{cluster}/neighbors | List neighboring clusters
176
+ *ClustersApi* | [**list_cluster_txs**](docs/ClustersApi.md#list_cluster_txs) | **GET** /{currency}/clusters/{cluster}/txs | List cluster transactions
177
+ *ClustersApi* | [**search_cluster_neighbors**](docs/ClustersApi.md#search_cluster_neighbors) | **GET** /{currency}/clusters/{cluster}/search | Search cluster neighborhood
132
178
  *EntitiesApi* | [**get_entity**](docs/EntitiesApi.md#get_entity) | **GET** /{currency}/entities/{entity} | Get entity details
133
179
  *EntitiesApi* | [**list_address_tags_by_entity**](docs/EntitiesApi.md#list_address_tags_by_entity) | **GET** /{currency}/entities/{entity}/tags | List entity address tags
134
180
  *EntitiesApi* | [**list_entity_addresses**](docs/EntitiesApi.md#list_entity_addresses) | **GET** /{currency}/entities/{entity}/addresses | List entity addresses
@@ -169,6 +215,8 @@ Class | Method | HTTP request | Description
169
215
  - [Block](docs/Block.md)
170
216
  - [BlockAtDate](docs/BlockAtDate.md)
171
217
  - [ChangeHeuristics](docs/ChangeHeuristics.md)
218
+ - [Cluster](docs/Cluster.md)
219
+ - [ClusterAddresses](docs/ClusterAddresses.md)
172
220
  - [CoinJoinConsensus](docs/CoinJoinConsensus.md)
173
221
  - [CoinJoinHeuristics](docs/CoinJoinHeuristics.md)
174
222
  - [Concept](docs/Concept.md)
@@ -190,6 +238,8 @@ Class | Method | HTTP request | Description
190
238
  - [MultiInputChangeHeuristic](docs/MultiInputChangeHeuristic.md)
191
239
  - [NeighborAddress](docs/NeighborAddress.md)
192
240
  - [NeighborAddresses](docs/NeighborAddresses.md)
241
+ - [NeighborCluster](docs/NeighborCluster.md)
242
+ - [NeighborClusters](docs/NeighborClusters.md)
193
243
  - [NeighborEntities](docs/NeighborEntities.md)
194
244
  - [NeighborEntity](docs/NeighborEntity.md)
195
245
  - [OneTimeChangeHeuristic](docs/OneTimeChangeHeuristic.md)
@@ -245,4 +295,3 @@ Authentication schemes defined for the API:
245
295
 
246
296
  contact@iknaio.com
247
297
 
248
-
@@ -1,10 +1,42 @@
1
1
  # graphsense-python
2
- GraphSense API provides programmatic access to blockchain analytics data across multiple ledgers. Use it to explore addresses, entities, blocks, transactions, tags, token activity, and exchange-rate context, and to integrate investigation workflows into your own applications and automation.
2
+ GraphSense API provides programmatic access to blockchain analytics data across
3
+ multiple ledgers. Use it to explore addresses, clusters, blocks, transactions,
4
+ tags, token activity, and exchange-rate context, and to integrate investigation
5
+ workflows into your own applications and automation.
6
+
7
+ ## Versioning and deprecation policy
8
+
9
+ The API follows semantic versioning. Minor releases are additive and
10
+ backwards-compatible; breaking changes only happen in major releases, which
11
+ are rare and announced in advance.
12
+
13
+ Deprecated endpoints and fields remain fully functional for at least six
14
+ months after they are marked deprecated. During that window they are
15
+ highlighted with a strikethrough in the docs and in generated clients, and
16
+ responses from deprecated endpoints carry a `Deprecation` HTTP header that
17
+ client tooling can detect. Replacement endpoints and fields are always
18
+ introduced before the deprecated surface is removed.
19
+
20
+ See the [full versioning and deprecation policy](https://github.com/graphsense/graphsense-lib/blob/master/README.md#rest-api-evolution-and-deprecation-policy)
21
+ for details.
22
+
23
+
24
+ ## Using the high-level wrapper or CLI
25
+
26
+ Two hand-written convenience layers ride on top of the generated client
27
+ (both protected from regeneration via `.openapi-generator-ignore`):
28
+
29
+ - **Python** — [`README_EXT.md`](README_EXT.md) documents
30
+ `graphsense.ext.GraphSense`, a single facade that removes boilerplate and
31
+ bundles commonly-paired calls (ships with the base install).
32
+ - **Shell** — [`README_CLI.md`](README_CLI.md) documents the `graphsense` CLI
33
+ (installed via `uv add 'graphsense-python[cli]'`): pipe-friendly,
34
+ JSON/CSV I/O, auto-bulk.
3
35
 
4
36
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
5
37
 
6
- - API version: 2.10.0
7
- - Package version: 2.10.0
38
+ - API version: 2.12.0
39
+ - Package version: 2.12.0
8
40
  - Generator version: 7.19.0
9
41
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
10
42
  For more information, please visit [https://www.iknaio.com/](https://www.iknaio.com/)
@@ -14,37 +46,39 @@ For more information, please visit [https://www.iknaio.com/](https://www.iknaio.
14
46
  Python 3.9+
15
47
 
16
48
  ## Installation & Usage
17
- ### pip install
18
49
 
19
- If the python package is hosted on a repository, you can install directly using:
50
+ This project uses [uv](https://docs.astral.sh/uv/) for environment and
51
+ dependency management.
52
+
53
+ ### Add to a uv project
20
54
 
21
55
  ```sh
22
- pip install git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git
56
+ uv add graphsense-python
57
+ # or, to include the optional `[cli]` extra (installs the `graphsense` CLI):
58
+ uv add 'graphsense-python[cli]'
23
59
  ```
24
- (you may need to run `pip` with root permission: `sudo pip install git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git`)
25
60
 
26
- Then import the package:
27
- ```python
28
- import graphsense
29
- ```
61
+ ### Install from git
30
62
 
31
- ### Setuptools
63
+ ```sh
64
+ uv add 'git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git'
65
+ ```
32
66
 
33
- Install via [Setuptools](http://pypi.python.org/pypi/setuptools).
67
+ ### One-off script usage
34
68
 
35
69
  ```sh
36
- python setup.py install --user
70
+ uv run --with graphsense-python python my_script.py
37
71
  ```
38
- (or `sudo python setup.py install` to install the package for all users)
39
72
 
40
73
  Then import the package:
74
+
41
75
  ```python
42
76
  import graphsense
43
77
  ```
44
78
 
45
79
  ### Tests
46
80
 
47
- Execute `pytest` to run the tests.
81
+ Execute `uv run pytest` to run the tests.
48
82
 
49
83
  ## Getting Started
50
84
 
@@ -99,6 +133,7 @@ All URIs are relative to *https://api.iknaio.com*
99
133
  Class | Method | HTTP request | Description
100
134
  ------------ | ------------- | ------------- | -------------
101
135
  *AddressesApi* | [**get_address**](docs/AddressesApi.md#get_address) | **GET** /{currency}/addresses/{address} | Get an address
136
+ *AddressesApi* | [**get_address_cluster**](docs/AddressesApi.md#get_address_cluster) | **GET** /{currency}/addresses/{address}/cluster | Get the cluster for an address
102
137
  *AddressesApi* | [**get_address_entity**](docs/AddressesApi.md#get_address_entity) | **GET** /{currency}/addresses/{address}/entity | Get the entity for an address
103
138
  *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
104
139
  *AddressesApi* | [**list_address_links**](docs/AddressesApi.md#list_address_links) | **GET** /{currency}/addresses/{address}/links | List transactions between two addresses
@@ -111,6 +146,13 @@ Class | Method | HTTP request | Description
111
146
  *BlocksApi* | [**list_block_txs**](docs/BlocksApi.md#list_block_txs) | **GET** /{currency}/blocks/{height}/txs | List transactions in a block
112
147
  *BulkApi* | [**bulk_csv**](docs/BulkApi.md#bulk_csv) | **POST** /{currency}/bulk.csv/{operation} | Stream bulk operation results as CSV
113
148
  *BulkApi* | [**bulk_json**](docs/BulkApi.md#bulk_json) | **POST** /{currency}/bulk.json/{operation} | Stream bulk operation results as JSON
149
+ *ClustersApi* | [**get_cluster**](docs/ClustersApi.md#get_cluster) | **GET** /{currency}/clusters/{cluster} | Get cluster details
150
+ *ClustersApi* | [**list_address_tags_by_cluster**](docs/ClustersApi.md#list_address_tags_by_cluster) | **GET** /{currency}/clusters/{cluster}/tags | List cluster address tags
151
+ *ClustersApi* | [**list_cluster_addresses**](docs/ClustersApi.md#list_cluster_addresses) | **GET** /{currency}/clusters/{cluster}/addresses | List cluster addresses
152
+ *ClustersApi* | [**list_cluster_links**](docs/ClustersApi.md#list_cluster_links) | **GET** /{currency}/clusters/{cluster}/links | List transactions between clusters
153
+ *ClustersApi* | [**list_cluster_neighbors**](docs/ClustersApi.md#list_cluster_neighbors) | **GET** /{currency}/clusters/{cluster}/neighbors | List neighboring clusters
154
+ *ClustersApi* | [**list_cluster_txs**](docs/ClustersApi.md#list_cluster_txs) | **GET** /{currency}/clusters/{cluster}/txs | List cluster transactions
155
+ *ClustersApi* | [**search_cluster_neighbors**](docs/ClustersApi.md#search_cluster_neighbors) | **GET** /{currency}/clusters/{cluster}/search | Search cluster neighborhood
114
156
  *EntitiesApi* | [**get_entity**](docs/EntitiesApi.md#get_entity) | **GET** /{currency}/entities/{entity} | Get entity details
115
157
  *EntitiesApi* | [**list_address_tags_by_entity**](docs/EntitiesApi.md#list_address_tags_by_entity) | **GET** /{currency}/entities/{entity}/tags | List entity address tags
116
158
  *EntitiesApi* | [**list_entity_addresses**](docs/EntitiesApi.md#list_entity_addresses) | **GET** /{currency}/entities/{entity}/addresses | List entity addresses
@@ -151,6 +193,8 @@ Class | Method | HTTP request | Description
151
193
  - [Block](docs/Block.md)
152
194
  - [BlockAtDate](docs/BlockAtDate.md)
153
195
  - [ChangeHeuristics](docs/ChangeHeuristics.md)
196
+ - [Cluster](docs/Cluster.md)
197
+ - [ClusterAddresses](docs/ClusterAddresses.md)
154
198
  - [CoinJoinConsensus](docs/CoinJoinConsensus.md)
155
199
  - [CoinJoinHeuristics](docs/CoinJoinHeuristics.md)
156
200
  - [Concept](docs/Concept.md)
@@ -172,6 +216,8 @@ Class | Method | HTTP request | Description
172
216
  - [MultiInputChangeHeuristic](docs/MultiInputChangeHeuristic.md)
173
217
  - [NeighborAddress](docs/NeighborAddress.md)
174
218
  - [NeighborAddresses](docs/NeighborAddresses.md)
219
+ - [NeighborCluster](docs/NeighborCluster.md)
220
+ - [NeighborClusters](docs/NeighborClusters.md)
175
221
  - [NeighborEntities](docs/NeighborEntities.md)
176
222
  - [NeighborEntity](docs/NeighborEntity.md)
177
223
  - [OneTimeChangeHeuristic](docs/OneTimeChangeHeuristic.md)
@@ -227,4 +273,3 @@ Authentication schemes defined for the API:
227
273
 
228
274
  contact@iknaio.com
229
275
 
230
-
@@ -5,20 +5,21 @@
5
5
  """
6
6
  GraphSense API
7
7
 
8
- GraphSense API provides programmatic access to blockchain analytics data across multiple ledgers. Use it to explore addresses, entities, blocks, transactions, tags, token activity, and exchange-rate context, and to integrate investigation workflows into your own applications and automation. # noqa: E501
8
+ GraphSense API provides programmatic access to blockchain analytics data across multiple ledgers. Use it to explore addresses, clusters, blocks, transactions, tags, token activity, and exchange-rate context, and to integrate investigation workflows into your own applications and automation. ## Versioning and deprecation policy The API follows semantic versioning. Minor releases are additive and backwards-compatible; breaking changes only happen in major releases, which are rare and announced in advance. Deprecated endpoints and fields remain fully functional for at least six months after they are marked deprecated. During that window they are highlighted with a strikethrough in the docs and in generated clients, and responses from deprecated endpoints carry a `Deprecation` HTTP header that client tooling can detect. Replacement endpoints and fields are always introduced before the deprecated surface is removed. See the [full versioning and deprecation policy](https://github.com/graphsense/graphsense-lib/blob/master/README.md#rest-api-evolution-and-deprecation-policy) for details. # noqa: E501
9
9
 
10
10
  Contact: contact@iknaio.com
11
11
  Generated by: https://openapi-generator.tech
12
12
  """
13
13
 
14
14
 
15
- __version__ = "2.10.0"
15
+ __version__ = "2.12.0"
16
16
 
17
17
  # Define package exports
18
18
  __all__ = [
19
19
  "AddressesApi",
20
20
  "BlocksApi",
21
21
  "BulkApi",
22
+ "ClustersApi",
22
23
  "EntitiesApi",
23
24
  "GeneralApi",
24
25
  "RatesApi",
@@ -46,6 +47,8 @@ __all__ = [
46
47
  "Block",
47
48
  "BlockAtDate",
48
49
  "ChangeHeuristics",
50
+ "Cluster",
51
+ "ClusterAddresses",
49
52
  "CoinJoinConsensus",
50
53
  "CoinJoinHeuristics",
51
54
  "Concept",
@@ -67,6 +70,8 @@ __all__ = [
67
70
  "MultiInputChangeHeuristic",
68
71
  "NeighborAddress",
69
72
  "NeighborAddresses",
73
+ "NeighborCluster",
74
+ "NeighborClusters",
70
75
  "NeighborEntities",
71
76
  "NeighborEntity",
72
77
  "OneTimeChangeHeuristic",
@@ -112,6 +117,7 @@ import graphsense.compat # noqa: F401
112
117
  from graphsense.api.addresses_api import AddressesApi as AddressesApi
113
118
  from graphsense.api.blocks_api import BlocksApi as BlocksApi
114
119
  from graphsense.api.bulk_api import BulkApi as BulkApi
120
+ from graphsense.api.clusters_api import ClustersApi as ClustersApi
115
121
  from graphsense.api.entities_api import EntitiesApi as EntitiesApi
116
122
  from graphsense.api.general_api import GeneralApi as GeneralApi
117
123
  from graphsense.api.rates_api import RatesApi as RatesApi
@@ -143,6 +149,8 @@ from graphsense.models.address_txs import AddressTxs as AddressTxs
143
149
  from graphsense.models.block import Block as Block
144
150
  from graphsense.models.block_at_date import BlockAtDate as BlockAtDate
145
151
  from graphsense.models.change_heuristics import ChangeHeuristics as ChangeHeuristics
152
+ from graphsense.models.cluster import Cluster as Cluster
153
+ from graphsense.models.cluster_addresses import ClusterAddresses as ClusterAddresses
146
154
  from graphsense.models.coin_join_consensus import CoinJoinConsensus as CoinJoinConsensus
147
155
  from graphsense.models.coin_join_heuristics import CoinJoinHeuristics as CoinJoinHeuristics
148
156
  from graphsense.models.concept import Concept as Concept
@@ -164,6 +172,8 @@ from graphsense.models.location_inner import LocationInner as LocationInner
164
172
  from graphsense.models.multi_input_change_heuristic import MultiInputChangeHeuristic as MultiInputChangeHeuristic
165
173
  from graphsense.models.neighbor_address import NeighborAddress as NeighborAddress
166
174
  from graphsense.models.neighbor_addresses import NeighborAddresses as NeighborAddresses
175
+ from graphsense.models.neighbor_cluster import NeighborCluster as NeighborCluster
176
+ from graphsense.models.neighbor_clusters import NeighborClusters as NeighborClusters
167
177
  from graphsense.models.neighbor_entities import NeighborEntities as NeighborEntities
168
178
  from graphsense.models.neighbor_entity import NeighborEntity as NeighborEntity
169
179
  from graphsense.models.one_time_change_heuristic import OneTimeChangeHeuristic as OneTimeChangeHeuristic
@@ -4,6 +4,7 @@
4
4
  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
+ from graphsense.api.clusters_api import ClustersApi
7
8
  from graphsense.api.entities_api import EntitiesApi
8
9
  from graphsense.api.general_api import GeneralApi
9
10
  from graphsense.api.rates_api import RatesApi