graphsense-python 2.15.0__py3-none-any.whl → 2.15.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
graphsense/__init__.py CHANGED
@@ -12,7 +12,7 @@
12
12
  """
13
13
 
14
14
 
15
- __version__ = "2.15.0"
15
+ __version__ = "2.15.2"
16
16
 
17
17
  # Define package exports
18
18
  __all__ = [
@@ -1795,7 +1795,7 @@ class AddressesApi:
1795
1795
  ) -> NeighborAddresses:
1796
1796
  """List neighboring addresses
1797
1797
 
1798
- Returns neighboring addresses connected to the given address in the transaction graph.
1798
+ Returns neighboring addresses connected to the given address in the transaction graph. Per neighbor, `value` and `no_txs` are **edge-scoped** (the value transferred and number of transactions between the queried address and that neighbor), while the embedded `address` object carries the neighbor's own **lifetime** attributes (its balance, degrees, first_tx/last_tx, …), not relative to the queried address.
1799
1799
 
1800
1800
  :param currency: The cryptocurrency code (e.g., btc) (required)
1801
1801
  :type currency: str
@@ -1892,7 +1892,7 @@ class AddressesApi:
1892
1892
  ) -> ApiResponse[NeighborAddresses]:
1893
1893
  """List neighboring addresses
1894
1894
 
1895
- Returns neighboring addresses connected to the given address in the transaction graph.
1895
+ Returns neighboring addresses connected to the given address in the transaction graph. Per neighbor, `value` and `no_txs` are **edge-scoped** (the value transferred and number of transactions between the queried address and that neighbor), while the embedded `address` object carries the neighbor's own **lifetime** attributes (its balance, degrees, first_tx/last_tx, …), not relative to the queried address.
1896
1896
 
1897
1897
  :param currency: The cryptocurrency code (e.g., btc) (required)
1898
1898
  :type currency: str
@@ -1989,7 +1989,7 @@ class AddressesApi:
1989
1989
  ) -> RESTResponseType:
1990
1990
  """List neighboring addresses
1991
1991
 
1992
- Returns neighboring addresses connected to the given address in the transaction graph.
1992
+ Returns neighboring addresses connected to the given address in the transaction graph. Per neighbor, `value` and `no_txs` are **edge-scoped** (the value transferred and number of transactions between the queried address and that neighbor), while the embedded `address` object carries the neighbor's own **lifetime** attributes (its balance, degrees, first_tx/last_tx, …), not relative to the queried address.
1993
1993
 
1994
1994
  :param currency: The cryptocurrency code (e.g., btc) (required)
1995
1995
  :type currency: str
@@ -147,7 +147,7 @@ class BulkApi:
147
147
  ) -> object:
148
148
  """Stream bulk operation results as CSV
149
149
 
150
- Executes a supported operation for multiple key values and streams flattened result rows as CSV.
150
+ Executes a supported operation for multiple key values and streams flattened result rows as CSV. Each key list in the request body is capped (10,000 items by default), as is the body itself (8 MiB by default); split longer requests into several calls.
151
151
 
152
152
  :param currency: The cryptocurrency code (e.g., btc) (required)
153
153
  :type currency: str
@@ -193,6 +193,7 @@ class BulkApi:
193
193
  _response_types_map: Dict[str, Optional[str]] = {
194
194
  '200': "object",
195
195
  '400': None,
196
+ '413': None,
196
197
  '422': None,
197
198
  }
198
199
  response_data = self.api_client.call_api(
@@ -228,7 +229,7 @@ class BulkApi:
228
229
  ) -> ApiResponse[object]:
229
230
  """Stream bulk operation results as CSV
230
231
 
231
- Executes a supported operation for multiple key values and streams flattened result rows as CSV.
232
+ Executes a supported operation for multiple key values and streams flattened result rows as CSV. Each key list in the request body is capped (10,000 items by default), as is the body itself (8 MiB by default); split longer requests into several calls.
232
233
 
233
234
  :param currency: The cryptocurrency code (e.g., btc) (required)
234
235
  :type currency: str
@@ -274,6 +275,7 @@ class BulkApi:
274
275
  _response_types_map: Dict[str, Optional[str]] = {
275
276
  '200': "object",
276
277
  '400': None,
278
+ '413': None,
277
279
  '422': None,
278
280
  }
279
281
  response_data = self.api_client.call_api(
@@ -309,7 +311,7 @@ class BulkApi:
309
311
  ) -> RESTResponseType:
310
312
  """Stream bulk operation results as CSV
311
313
 
312
- Executes a supported operation for multiple key values and streams flattened result rows as CSV.
314
+ Executes a supported operation for multiple key values and streams flattened result rows as CSV. Each key list in the request body is capped (10,000 items by default), as is the body itself (8 MiB by default); split longer requests into several calls.
313
315
 
314
316
  :param currency: The cryptocurrency code (e.g., btc) (required)
315
317
  :type currency: str
@@ -355,6 +357,7 @@ class BulkApi:
355
357
  _response_types_map: Dict[str, Optional[str]] = {
356
358
  '200': "object",
357
359
  '400': None,
360
+ '413': None,
358
361
  '422': None,
359
362
  }
360
363
  response_data = self.api_client.call_api(
@@ -474,7 +477,7 @@ class BulkApi:
474
477
  ) -> object:
475
478
  """Stream bulk operation results as JSON
476
479
 
477
- Executes a supported operation for multiple key values and streams flattened result rows as JSON.
480
+ Executes a supported operation for multiple key values and streams flattened result rows as JSON. Each key list in the request body is capped (10,000 items by default), as is the body itself (8 MiB by default); split longer requests into several calls.
478
481
 
479
482
  :param currency: The cryptocurrency code (e.g., btc) (required)
480
483
  :type currency: str
@@ -520,6 +523,7 @@ class BulkApi:
520
523
  _response_types_map: Dict[str, Optional[str]] = {
521
524
  '200': "object",
522
525
  '400': None,
526
+ '413': None,
523
527
  '422': None,
524
528
  }
525
529
  response_data = self.api_client.call_api(
@@ -555,7 +559,7 @@ class BulkApi:
555
559
  ) -> ApiResponse[object]:
556
560
  """Stream bulk operation results as JSON
557
561
 
558
- Executes a supported operation for multiple key values and streams flattened result rows as JSON.
562
+ Executes a supported operation for multiple key values and streams flattened result rows as JSON. Each key list in the request body is capped (10,000 items by default), as is the body itself (8 MiB by default); split longer requests into several calls.
559
563
 
560
564
  :param currency: The cryptocurrency code (e.g., btc) (required)
561
565
  :type currency: str
@@ -601,6 +605,7 @@ class BulkApi:
601
605
  _response_types_map: Dict[str, Optional[str]] = {
602
606
  '200': "object",
603
607
  '400': None,
608
+ '413': None,
604
609
  '422': None,
605
610
  }
606
611
  response_data = self.api_client.call_api(
@@ -636,7 +641,7 @@ class BulkApi:
636
641
  ) -> RESTResponseType:
637
642
  """Stream bulk operation results as JSON
638
643
 
639
- Executes a supported operation for multiple key values and streams flattened result rows as JSON.
644
+ Executes a supported operation for multiple key values and streams flattened result rows as JSON. Each key list in the request body is capped (10,000 items by default), as is the body itself (8 MiB by default); split longer requests into several calls.
640
645
 
641
646
  :param currency: The cryptocurrency code (e.g., btc) (required)
642
647
  :type currency: str
@@ -682,6 +687,7 @@ class BulkApi:
682
687
  _response_types_map: Dict[str, Optional[str]] = {
683
688
  '200': "object",
684
689
  '400': None,
690
+ '413': None,
685
691
  '422': None,
686
692
  }
687
693
  response_data = self.api_client.call_api(
@@ -1549,7 +1549,7 @@ class ClustersApi:
1549
1549
  ) -> NeighborClusters:
1550
1550
  """(Deprecated) List neighboring clusters
1551
1551
 
1552
- Returns neighboring clusters connected to the given cluster in the cluster graph.
1552
+ Returns neighboring clusters connected to the given cluster in the cluster graph. Per neighbor, `value` and `no_txs` are **edge-scoped** (the value transferred and number of transactions between the queried cluster and that neighbor), while the embedded cluster object carries the neighbor's own **lifetime** attributes, not relative to the queried cluster.
1553
1553
 
1554
1554
  :param currency: The cryptocurrency code (e.g., btc) (required)
1555
1555
  :type currency: str
@@ -1655,7 +1655,7 @@ class ClustersApi:
1655
1655
  ) -> ApiResponse[NeighborClusters]:
1656
1656
  """(Deprecated) List neighboring clusters
1657
1657
 
1658
- Returns neighboring clusters connected to the given cluster in the cluster graph.
1658
+ Returns neighboring clusters connected to the given cluster in the cluster graph. Per neighbor, `value` and `no_txs` are **edge-scoped** (the value transferred and number of transactions between the queried cluster and that neighbor), while the embedded cluster object carries the neighbor's own **lifetime** attributes, not relative to the queried cluster.
1659
1659
 
1660
1660
  :param currency: The cryptocurrency code (e.g., btc) (required)
1661
1661
  :type currency: str
@@ -1761,7 +1761,7 @@ class ClustersApi:
1761
1761
  ) -> RESTResponseType:
1762
1762
  """(Deprecated) List neighboring clusters
1763
1763
 
1764
- Returns neighboring clusters connected to the given cluster in the cluster graph.
1764
+ Returns neighboring clusters connected to the given cluster in the cluster graph. Per neighbor, `value` and `no_txs` are **edge-scoped** (the value transferred and number of transactions between the queried cluster and that neighbor), while the embedded cluster object carries the neighbor's own **lifetime** attributes, not relative to the queried cluster.
1765
1765
 
1766
1766
  :param currency: The cryptocurrency code (e.g., btc) (required)
1767
1767
  :type currency: str
@@ -1555,7 +1555,7 @@ class EntitiesApi:
1555
1555
  ) -> NeighborEntities:
1556
1556
  """(Deprecated) List neighboring entities
1557
1557
 
1558
- Returns neighboring entities connected to the given entity in the entity graph.
1558
+ Returns neighboring entities connected to the given entity in the entity graph. Per neighbor, `value` and `no_txs` are **edge-scoped** (the value transferred and number of transactions between the queried entity and that neighbor), while the embedded entity/cluster object carries the neighbor's own **lifetime** attributes, not relative to the queried entity.
1559
1559
 
1560
1560
  :param currency: The cryptocurrency code (e.g., btc) (required)
1561
1561
  :type currency: str
@@ -1661,7 +1661,7 @@ class EntitiesApi:
1661
1661
  ) -> ApiResponse[NeighborEntities]:
1662
1662
  """(Deprecated) List neighboring entities
1663
1663
 
1664
- Returns neighboring entities connected to the given entity in the entity graph.
1664
+ Returns neighboring entities connected to the given entity in the entity graph. Per neighbor, `value` and `no_txs` are **edge-scoped** (the value transferred and number of transactions between the queried entity and that neighbor), while the embedded entity/cluster object carries the neighbor's own **lifetime** attributes, not relative to the queried entity.
1665
1665
 
1666
1666
  :param currency: The cryptocurrency code (e.g., btc) (required)
1667
1667
  :type currency: str
@@ -1767,7 +1767,7 @@ class EntitiesApi:
1767
1767
  ) -> RESTResponseType:
1768
1768
  """(Deprecated) List neighboring entities
1769
1769
 
1770
- Returns neighboring entities connected to the given entity in the entity graph.
1770
+ Returns neighboring entities connected to the given entity in the entity graph. Per neighbor, `value` and `no_txs` are **edge-scoped** (the value transferred and number of transactions between the queried entity and that neighbor), while the embedded entity/cluster object carries the neighbor's own **lifetime** attributes, not relative to the queried entity.
1771
1771
 
1772
1772
  :param currency: The cryptocurrency code (e.g., btc) (required)
1773
1773
  :type currency: str
graphsense/api_client.py CHANGED
@@ -95,7 +95,7 @@ class ApiClient:
95
95
  self.default_headers[header_name] = header_value
96
96
  self.cookie = cookie
97
97
  # Set default User-Agent.
98
- self.user_agent = 'graphsense-python/2.15.0'
98
+ self.user_agent = 'graphsense-python/2.15.2'
99
99
  self.client_side_validation = configuration.client_side_validation
100
100
 
101
101
  def __enter__(self):
@@ -533,8 +533,8 @@ conf = graphsense.Configuration(
533
533
  return "Python SDK Debug Report:\n"\
534
534
  "OS: {env}\n"\
535
535
  "Python Version: {pyversion}\n"\
536
- "Version of the API: 2.15.0\n"\
537
- "SDK Package Version: 2.15.0".\
536
+ "Version of the API: 2.15.2\n"\
537
+ "SDK Package Version: 2.15.2".\
538
538
  format(env=sys.platform, pyversion=sys.version)
539
539
 
540
540
  def get_host_settings(self) -> List[HostSetting]:
graphsense/ext/bulk.py CHANGED
@@ -2,12 +2,21 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import csv
6
+ import io
5
7
  import sys
6
8
  from concurrent.futures import ThreadPoolExecutor
7
- from typing import Any, Callable, Iterable, Optional
9
+ from typing import Any, Callable, Iterable, Iterator, Optional
8
10
 
9
11
  DEFAULT_BULK_THRESHOLD = 10
10
12
 
13
+ # The server bounds how many items one bulk request may carry (10,000 by
14
+ # default; see GHSA-372j-2wgf-23ch) and answers a longer list with a 400.
15
+ # Splitting below that bound keeps arbitrarily long key lists working from the
16
+ # client's side. Deployments that lower the server cap need a matching
17
+ # `chunk_size` on the call.
18
+ DEFAULT_BULK_CHUNK_SIZE = 5000
19
+
11
20
 
12
21
  def should_bulk(
13
22
  n: int,
@@ -49,3 +58,59 @@ def announce_switch(stream=None) -> None:
49
58
  "(rows are flat; per-item typed models are available with --no-bulk)",
50
59
  file=out,
51
60
  )
61
+
62
+
63
+ def chunked(items: Iterable[Any], size: int) -> Iterator[list]:
64
+ """Yield consecutive lists of at most `size` items."""
65
+ if size <= 0:
66
+ raise ValueError("chunk size must be positive")
67
+ batch: list = []
68
+ for item in items:
69
+ batch.append(item)
70
+ if len(batch) == size:
71
+ yield batch
72
+ batch = []
73
+ if batch:
74
+ yield batch
75
+
76
+
77
+ def merge_json_chunks(chunks: Iterable[Any]) -> list:
78
+ """Concatenate the row lists returned by several bulk.json calls."""
79
+ rows: list = []
80
+ for chunk in chunks:
81
+ if chunk is None:
82
+ continue
83
+ rows.extend(chunk if isinstance(chunk, list) else [chunk])
84
+ return rows
85
+
86
+
87
+ def merge_csv_chunks(chunks: Iterable[str]) -> str:
88
+ """Concatenate several bulk.csv responses into one CSV document.
89
+
90
+ Each response carries its own header, and the server infers those columns
91
+ from the first rows of that request — so two chunks of the same query can
92
+ legitimately disagree on the column set. Rows are therefore re-keyed onto
93
+ the union of all headers (in first-seen order) rather than pasted together.
94
+ """
95
+ rows: list[dict] = []
96
+ columns: list[str] = []
97
+ seen = set()
98
+ for chunk in chunks:
99
+ if not chunk or not chunk.strip():
100
+ continue
101
+ reader = csv.DictReader(io.StringIO(chunk))
102
+ for name in reader.fieldnames or []:
103
+ if name not in seen:
104
+ seen.add(name)
105
+ columns.append(name)
106
+ rows.extend(reader)
107
+
108
+ if not columns:
109
+ return ""
110
+
111
+ out = io.StringIO()
112
+ writer = csv.DictWriter(out, columns, restval="", extrasaction="ignore")
113
+ writer.writeheader()
114
+ for row in rows:
115
+ writer.writerow(row)
116
+ return out.getvalue()
graphsense/ext/client.py CHANGED
@@ -26,6 +26,7 @@ from dateutil import parser as _dateutil_parser
26
26
  import graphsense
27
27
  from graphsense.api_client import ApiClient
28
28
  from graphsense.configuration import Configuration
29
+ from graphsense.ext import bulk as bulk_mod
29
30
  from graphsense.ext.deprecation import install as install_deprecation_hook
30
31
 
31
32
  # APIs that expose only deprecated endpoints; hidden from the convenience
@@ -506,15 +507,31 @@ class GraphSense:
506
507
  format: str = "json",
507
508
  num_pages: int = 1,
508
509
  key_field: str = "address",
510
+ chunk_size: int = bulk_mod.DEFAULT_BULK_CHUNK_SIZE,
509
511
  ) -> Any:
510
512
  """Call the /bulk.<format>/<operation> endpoint with `keys`.
511
513
 
512
514
  `key_field` is the dict key that the bulk operation expects in the
513
515
  request body (e.g. "address", "tx_hash", "cluster"). Default is
514
516
  "address" which is by far the most common.
517
+
518
+ The server bounds how many items a single bulk request may carry, so a
519
+ longer key list is split into `chunk_size` batches and the responses are
520
+ merged. Pass `chunk_size=0` to send the list in one request regardless.
515
521
  """
516
522
  ccy = self._currency(currency)
517
- body = {key_field: list(keys)}
523
+ keys = list(keys)
524
+
525
+ def call(batch: list) -> Any:
526
+ body = {key_field: batch}
527
+ if format == "csv":
528
+ return self.raw.bulk.bulk_csv(ccy, operation, num_pages, body)
529
+ return self.raw.bulk.bulk_json(ccy, operation, num_pages, body)
530
+
531
+ if chunk_size <= 0 or len(keys) <= chunk_size:
532
+ return call(keys)
533
+
534
+ results = [call(batch) for batch in bulk_mod.chunked(keys, chunk_size)]
518
535
  if format == "csv":
519
- return self.raw.bulk.bulk_csv(ccy, operation, num_pages, body)
520
- return self.raw.bulk.bulk_json(ccy, operation, num_pages, body)
536
+ return bulk_mod.merge_csv_chunks(results)
537
+ return bulk_mod.merge_json_chunks(results)
@@ -35,8 +35,8 @@ class Address(BaseModel):
35
35
  balance: Values
36
36
  total_received: Values
37
37
  total_spent: Values
38
- first_tx: Optional[TxSummary] = None
39
- last_tx: Optional[TxSummary] = None
38
+ first_tx: Optional[TxSummary] = Field(default=None, description="First transaction in which this address appears, over its entire history — independent of any neighbor, direction, or date filter. Null if the address has no transactions of its own.")
39
+ last_tx: Optional[TxSummary] = Field(default=None, description="Last transaction in which this address appears, over its entire history — independent of any neighbor, direction, or date filter. Null if the address has no transactions of its own.")
40
40
  in_degree: StrictInt
41
41
  out_degree: StrictInt
42
42
  no_incoming_txs: StrictInt
@@ -25,7 +25,7 @@ ENTITY_ANY_OF_SCHEMAS = ["Entity", "int"]
25
25
 
26
26
  class Entity(BaseModel):
27
27
  """
28
- Deprecated alias of `cluster`. Use `cluster` instead; this field is retained for backwards compatibility and will be removed in a future release.
28
+ Deprecated alias of `cluster`. Use `cluster` instead; this field is retained for backwards compatibility and will be removed in a future release. When expanded to an object, these are the neighbor cluster's own lifetime attributes, NOT relative to the queried cluster or the edge between them.
29
29
  """
30
30
 
31
31
  # data type: Entity
@@ -15,7 +15,7 @@ import pprint
15
15
  import re # noqa: F401
16
16
  import json
17
17
 
18
- from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr
18
+ from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
19
19
  from typing import Any, ClassVar, Dict, List, Optional
20
20
  from graphsense.models.address import Address
21
21
  from graphsense.models.values import Values
@@ -27,10 +27,10 @@ class NeighborAddress(BaseModel):
27
27
  Neighbor address model.
28
28
  """ # noqa: E501
29
29
  value: Values
30
- no_txs: StrictInt
30
+ no_txs: StrictInt = Field(description="Number of transactions on the edge between the queried address and this neighbor (edge-scoped, not the neighbor's lifetime transaction count).")
31
31
  address: Address
32
32
  labels: Optional[List[StrictStr]] = None
33
- token_values: Optional[Dict[str, Values]] = None
33
+ token_values: Optional[Dict[str, Values]] = Field(default=None, description="Per-token value transferred on this edge (edge-scoped).")
34
34
  __properties: ClassVar[List[str]] = ["value", "no_txs", "address", "labels", "token_values"]
35
35
 
36
36
  model_config = ConfigDict(
@@ -15,7 +15,7 @@ import pprint
15
15
  import re # noqa: F401
16
16
  import json
17
17
 
18
- from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr
18
+ from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
19
19
  from typing import Any, ClassVar, Dict, List, Optional
20
20
  from graphsense.models.cluster import Cluster
21
21
  from graphsense.models.entity import Entity
@@ -28,10 +28,10 @@ class NeighborCluster(BaseModel):
28
28
  Neighbor cluster (canonical name, supersedes `NeighborEntity`).
29
29
  """ # noqa: E501
30
30
  value: Values
31
- no_txs: StrictInt
31
+ no_txs: StrictInt = Field(description="Number of transactions on the edge between the queried cluster and this neighbor (edge-scoped, not the neighbor's lifetime transaction count).")
32
32
  entity: Optional[Entity] = None
33
33
  labels: Optional[List[StrictStr]] = None
34
- token_values: Optional[Dict[str, Values]] = None
34
+ token_values: Optional[Dict[str, Values]] = Field(default=None, description="Per-token value transferred on this edge (edge-scoped).")
35
35
  cluster: Optional[Cluster]
36
36
  __properties: ClassVar[List[str]] = ["value", "no_txs", "entity", "labels", "token_values", "cluster"]
37
37
 
@@ -15,7 +15,7 @@ import pprint
15
15
  import re # noqa: F401
16
16
  import json
17
17
 
18
- from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr
18
+ from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
19
19
  from typing import Any, ClassVar, Dict, List, Optional
20
20
  from graphsense.models.cluster import Cluster
21
21
  from graphsense.models.entity import Entity
@@ -28,10 +28,10 @@ class NeighborEntity(BaseModel):
28
28
  Neighbor cluster model (legacy name: NeighborEntity). Dual-emits the neighbor reference under both `entity` (deprecated) and `cluster` (preferred) keys, mirroring the alias pattern on the top-level `Entity`/`Cluster` models. The value is either an integer ID or a full `Entity`/`Cluster` object; whichever shape `entity` carries, `cluster` carries the same value.
29
29
  """ # noqa: E501
30
30
  value: Values
31
- no_txs: StrictInt
31
+ no_txs: StrictInt = Field(description="Number of transactions on the edge between the queried cluster and this neighbor (edge-scoped, not the neighbor's lifetime transaction count).")
32
32
  entity: Optional[Entity] = None
33
33
  labels: Optional[List[StrictStr]] = None
34
- token_values: Optional[Dict[str, Values]] = None
34
+ token_values: Optional[Dict[str, Values]] = Field(default=None, description="Per-token value transferred on this edge (edge-scoped).")
35
35
  cluster: Optional[Cluster]
36
36
  __properties: ClassVar[List[str]] = ["value", "no_txs", "entity", "labels", "token_values", "cluster"]
37
37
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphsense-python
3
- Version: 2.15.0
3
+ Version: 2.15.2
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.15.0
67
- - Package version: 2.15.0
66
+ - API version: 2.15.2
67
+ - Package version: 2.15.2
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/)
@@ -1,8 +1,8 @@
1
- graphsense/__init__.py,sha256=BxAdkktbrPQ1xVWAJmTfMYQF8ZOBy85e8WOPvbA4eiY,13193
2
- graphsense/api_client.py,sha256=qWkzndWuJmHplR2iZgpr1Q4YBq6mVuANB6UmCx6CilA,30138
1
+ graphsense/__init__.py,sha256=t_Cny3I-dAFzjozu8j8ve-7ogMCD0TfeLviMAqzAgho,13193
2
+ graphsense/api_client.py,sha256=SEzJKjIUlZe5QZJx7yWFIqp0ad1t3GSNpL5k1kQrSVQ,30138
3
3
  graphsense/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
4
4
  graphsense/compat.py,sha256=eYxsl2pMufiZZ7seh3bQGdKybSwBLWVhiJQ83rVG4gM,7745
5
- graphsense/configuration.py,sha256=IJmyl1qL3kNLKLOAzOcrs7sJ3dOWFrAtFTdxneucWJQ,20859
5
+ graphsense/configuration.py,sha256=eeVzVpzMk1Isa6jssfDuxM_YrYryCgUqG46JgoWU44I,20859
6
6
  graphsense/exceptions.py,sha256=_HpAulbSZl7TvZBjGarJvBqHJZxFV21yWs4Qx99d2Zg,8271
7
7
  graphsense/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  graphsense/rest.py,sha256=IYM5J6VX5BG8A8wWO4MFkrCiBHDlSaNfM_VXmG1ozs0,11384
@@ -12,11 +12,11 @@ graphsense/address_scan/detectors.py,sha256=wSaqBCgAOUqGAmZf2XG7ET4LUGRbIIwuf_Ru
12
12
  graphsense/address_scan/scanner.py,sha256=R_sfT-rucm5Kapjvt4Qy3gXQBjEf4XV10n_bAjLtQpo,6820
13
13
  graphsense/address_scan/validators.py,sha256=eMzBK8hWuZBW6k2JzLUoov1C4v5WYVXTEUmgM-86rD8,11940
14
14
  graphsense/api/__init__.py,sha256=d8RiHfFyUFpwDLLivh_NI-3zjC_3KmcHA8WH4oanPqo,574
15
- graphsense/api/addresses_api.py,sha256=ClyuoBFhtwpcQOOW-FZ66I5Ee80OfOdSR4oeLBSOY5M,141193
15
+ graphsense/api/addresses_api.py,sha256=hqQ8Bb0oLNGte80ZGJ1goF3k1NDyDzLN5WwEWlFkD_s,142165
16
16
  graphsense/api/blocks_api.py,sha256=l_6CuxNPh6SWe0tPzI-8KYE4DCM_dTaM4m2_r8Fv16o,40086
17
- graphsense/api/bulk_api.py,sha256=4j5SIreBSEVFFfZCksrZcR_HWoz8ga2dACnrmkImRUo,32948
18
- graphsense/api/clusters_api.py,sha256=Rj4NczCiv1BcMy42wOh1NBVVV_bPbaq9HNYla5VTiwU,121299
19
- graphsense/api/entities_api.py,sha256=Fv7w0_G13PcBVfwDkYVp-byidhvKxWX6_7gGrI35Ur4,122050
17
+ graphsense/api/bulk_api.py,sha256=rR6BMu7w5YKMrKwjnN_Om2_OGs08ciKIDmsfNEnDv1I,34028
18
+ graphsense/api/clusters_api.py,sha256=61ZdIjfgU5N6Ftx_oRLcFZTapPjn-M1kwPj81llKlI8,122127
19
+ graphsense/api/entities_api.py,sha256=RE5vYO52v-FLn-QliHIpo6Q5_BEbNziia9oBXUjCoAw,122893
20
20
  graphsense/api/general_api.py,sha256=fM42WUOwP02lPuYtRRB61zchr1W9Bz-RVI4hzpILdBc,33346
21
21
  graphsense/api/graph_api.py,sha256=7eKBqQg0E9x0VYPqZNhkwgeEnAOU7eh0VbGgLBfLbYs,34195
22
22
  graphsense/api/rates_api.py,sha256=ngVCIiGRuCvvsGuaVjmGIYZrNIhUPurH5lIhw4SaWT4,17847
@@ -34,8 +34,8 @@ graphsense/cli/main.py,sha256=g08nOFcL89xtv3HdE3Ly2AfHkmM1NvSLu81Evj7j_TQ,6456
34
34
  graphsense/cli/raw.py,sha256=lGPk7FV5NVnBWBIG-t7Vdxa3-EDmODBejJbvAdwWwh4,7901
35
35
  graphsense/cli/scan.py,sha256=4tKbY2JGDGG6lIDGHBD6ilLF00NrOtkCe9VSrGY9a0U,3482
36
36
  graphsense/ext/__init__.py,sha256=aiAESazZMyqoHtTVQyLmLPVjnXm0QsKX0kIMJjHvyzI,249
37
- graphsense/ext/bulk.py,sha256=R9NbRKKhE1m8ZMCD_brF7fawIkuc07k6vQYh2oxZM0s,1385
38
- graphsense/ext/client.py,sha256=yKbRUX6aLBEFLwadXK41K_W67hB4YxruHjVUw-LrRZM,18920
37
+ graphsense/ext/bulk.py,sha256=ho6TjuCfishT3BWUEZ7Kl3_22R-oDxdCvanxuhmsma8,3535
38
+ graphsense/ext/client.py,sha256=j1Q5LThjIfDjLwNkl-vtFpxWZThKAC4xR8Tv8PRFdG8,19641
39
39
  graphsense/ext/deprecation.py,sha256=dhhzNceJd_wqH94SHuXJGGh14aY_ClUH6nVig_KDco4,2839
40
40
  graphsense/ext/io.py,sha256=K_-wlvLGEWkVD4qv2oqGHXk0UiCyd4fwXw3tTFnOQ_s,7711
41
41
  graphsense/ext/output.py,sha256=2WurC0_Sk_AfqX5EI32hc-NNt3yEN9x7F0aug2gbjTY,8208
@@ -105,7 +105,7 @@ graphsense/model/values.py,sha256=J5rlSSECX5NHeQ8sged9t5B7Gz7dS19f_uLVQhuEh1g,12
105
105
  graphsense/models/__init__.py,sha256=b7nlDUJcpu5CqPnizUfRPGpyMy-kpm14AWBdGOVLvLs,7773
106
106
  graphsense/models/actor.py,sha256=uVp_mVbjmNgS3PKv3otR-j6VNma390IqnQsFNyGMnTs,5975
107
107
  graphsense/models/actor_context.py,sha256=KiH7unBjbQcDhqgyTexZgq6WxFctU-c7-x29tUm1POM,4952
108
- graphsense/models/address.py,sha256=dtmc1lHqpWp0M6j75yJKS9EYRAMtkAjzB8NWhgq_WrI,10843
108
+ graphsense/models/address.py,sha256=N7ArrP-jY06oPV0SCEMjw0Y8lOcrda0nSasGujT1Jgo,11272
109
109
  graphsense/models/address_output.py,sha256=mQvqoUw8PL59R0gprxFygriThdxOG57txRw6YaQjEbc,4293
110
110
  graphsense/models/address_tag.py,sha256=_hJLNqMBCtm8cd09DP_VQ-xmg2mjlkgf3GK-csEDKw0,6643
111
111
  graphsense/models/address_tags.py,sha256=UgLlBh6TbJoBTFT-EsasKb90GKJQoK-w5DI7sevwIk8,4870
@@ -125,7 +125,7 @@ graphsense/models/concept.py,sha256=jbGoFXM7rNSLAIW4_ZiVT5dnhb-Ki-JdJDcMYypTzZ4,
125
125
  graphsense/models/consensus_entry.py,sha256=Xs4CAvO12dQ9zne_hZuVDxXFQy-TnwtTtwa8kDS9Nao,4684
126
126
  graphsense/models/currency_stats.py,sha256=BtcPByzEofiMUCX-gx7A3PCFZ8lNWNdymhI4hTIxUok,5094
127
127
  graphsense/models/direct_change_heuristic.py,sha256=e24W42p-izWUruVizkSkaZYs3P6ucfXLMseOQ_Tvkz4,4890
128
- graphsense/models/entity.py,sha256=vkBj-KsIjKJLLOWIgNz_ByAlobgChYakAoCGa_8e1aw,10084
128
+ graphsense/models/entity.py,sha256=TE-QpHbq0PjCIdXoWyZ9r4Fe987QdZ1Y6-W7_TuXvjQ,10232
129
129
  graphsense/models/entity_addresses.py,sha256=mq0mp0vvvAhCCiNGBXGtVFLfTpM83-7dhExa-riD8zc,4874
130
130
  graphsense/models/external_conversion.py,sha256=yMydGk7XOilttSouxk84exBg8a43mUahnRuny2KYjAQ,5848
131
131
  graphsense/models/graph_address_network_summary.py,sha256=HfeagP7sdV2V6ufscbAbK5OInf0VgznOHvvu5Yg5qoA,7310
@@ -158,12 +158,12 @@ graphsense/models/links.py,sha256=OzztNGjsTPYFuMc24A5lcIFugY5LFzSPcFR4NKUNeYs,47
158
158
  graphsense/models/links_inner.py,sha256=2Oe1a3Ph56FoqbwdSXfDjzyUBHV1-jDAjHciLrkE5Sc,9320
159
159
  graphsense/models/location_inner.py,sha256=H2FLAIEu9w_uxrpj-VrpKdb3IE52i0DGwApDgXn1Nas,8687
160
160
  graphsense/models/multi_input_change_heuristic.py,sha256=-roenTSlKOQcQt4z-qigEUEcxCWk2uAbLoEPC7F2oh4,4904
161
- graphsense/models/neighbor_address.py,sha256=f8ptzSS9KbxhAapn0hszSpZDRT3h21YVl5G-NG4ugt0,5731
161
+ graphsense/models/neighbor_address.py,sha256=8LUXoVNQ2u3XVXdwEvPakQ93LWPKcXTNdEYFWNTUOKQ,5990
162
162
  graphsense/models/neighbor_addresses.py,sha256=2888riO7jGeEWgFqg9GebEY3UAIJXJ5c4szzePulW2w,4878
163
- graphsense/models/neighbor_cluster.py,sha256=7sKAD1Q7yF0OE86PV9Gq_aJqqFjA-2LKC3D8r0Jii5s,6130
163
+ graphsense/models/neighbor_cluster.py,sha256=4JAUivXafABaXp8i21AbernF8FORo8u-JmsSsoXaFOk,6389
164
164
  graphsense/models/neighbor_clusters.py,sha256=ahZME-vrcG9-ablAtow2oE0RB9HJ6RKBTXgi0W5xvh8,4891
165
165
  graphsense/models/neighbor_entities.py,sha256=SUTwtyLX016ZBMDGJR-xrtaky1FHOtkIl1H8VNhYLOs,4902
166
- graphsense/models/neighbor_entity.py,sha256=gPfI79bNnqpfbuXxUjIPfdvrxTFxFVOc-jtpi-MBwgY,6428
166
+ graphsense/models/neighbor_entity.py,sha256=ZXP6mwKfNVryuDY01JEw5cwZWzoG5kXY2B1xhHw4H3k,6687
167
167
  graphsense/models/one_time_change_heuristic.py,sha256=3dkIRJpQdFnKtVFoxAIt1AW6NmFvc7naTQq2pnVOzeM,4892
168
168
  graphsense/models/per_tx_inner.py,sha256=pvSVGbwJB9VkA-trit9mX78SltSw6ArjRMAs552VKCY,8908
169
169
  graphsense/models/rate.py,sha256=K-VarCql7aNIEoiW6dsTMeu1zjDHtJZSSv1JEaEUj-g,4736
@@ -202,8 +202,8 @@ graphsense/models/values.py,sha256=v8sTxZb3CTeXTKvyXAgXXkR8W1vONLFvgo2muGAp50g,5
202
202
  graphsense/models/wasabi_heuristic.py,sha256=me6viyG_wTkPdKgDuf06WL4vSXV1_G11yh-vCyYzkHg,4907
203
203
  graphsense/models/whirlpool_coin_join_heuristic.py,sha256=RMqSclSx4oOVKmgLvG7GGaS91l92HomaKfhjtsBZueE,4698
204
204
  graphsense/models/whirlpool_tx0_heuristic.py,sha256=fFuua9WRZ4imd5lD8qeBrdw_anD0ZsRHac7_kuudaDQ,4597
205
- graphsense_python-2.15.0.dist-info/METADATA,sha256=Ieb9A7w-d1kxaOuUAPvysbitBD0nRqk6zB1CcXEtk6E,17395
206
- graphsense_python-2.15.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
207
- graphsense_python-2.15.0.dist-info/entry_points.txt,sha256=lpyKbSHxyefsWBnbUdzhdlqCnihJwy_qWOnEOvoslHM,55
208
- graphsense_python-2.15.0.dist-info/top_level.txt,sha256=K6FGxjSRl4niIt3RCWCBQEJmIiIxCM1lFEyZVENIjAs,11
209
- graphsense_python-2.15.0.dist-info/RECORD,,
205
+ graphsense_python-2.15.2.dist-info/METADATA,sha256=6bOneGjvC7WDX4C_BRJ4ZLCwv5r-IYOiEWNTbFejPfU,17395
206
+ graphsense_python-2.15.2.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
207
+ graphsense_python-2.15.2.dist-info/entry_points.txt,sha256=lpyKbSHxyefsWBnbUdzhdlqCnihJwy_qWOnEOvoslHM,55
208
+ graphsense_python-2.15.2.dist-info/top_level.txt,sha256=K6FGxjSRl4niIt3RCWCBQEJmIiIxCM1lFEyZVENIjAs,11
209
+ graphsense_python-2.15.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (83.0.0)
2
+ Generator: setuptools (84.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5