defistream 1.0.1__py3-none-any.whl → 1.0.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.
defistream/__init__.py CHANGED
@@ -45,7 +45,7 @@ from .models import (
45
45
  )
46
46
  from .query import AsyncQueryBuilder, QueryBuilder
47
47
 
48
- __version__ = "1.0.1"
48
+ __version__ = "1.0.2"
49
49
 
50
50
  __all__ = [
51
51
  # Clients
defistream/query.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Any, Generic, TypeVar
5
+ from typing import TYPE_CHECKING, Any
6
6
 
7
7
  if TYPE_CHECKING:
8
8
  from .client import BaseClient
9
9
 
10
- T = TypeVar("T")
11
-
12
10
 
13
11
  class QueryBuilder:
14
12
  """
@@ -20,7 +18,7 @@ class QueryBuilder:
20
18
  - as_file() - saves to CSV, Parquet, or JSON file
21
19
 
22
20
  Example:
23
- query = client.erc20.transfers("USDT").network("ETH").start_block(24000000).end_block(24100000)
21
+ query = client.erc20.transfers("USDT").network("ETH").block_range(21000000, 21010000)
24
22
  query = query.min_amount(1000).sender("0x...")
25
23
  df = query.as_df() # pandas DataFrame
26
24
  df = query.as_df("polars") # polars DataFrame
@@ -51,7 +49,7 @@ class QueryBuilder:
51
49
 
52
50
  # Network and block range
53
51
  def network(self, network: str) -> "QueryBuilder":
54
- """Set the network (ETH, ARB, BASE, OP, etc.)."""
52
+ """Set the network (ETH, ARB, BASE, OP, POLYGON, etc.)."""
55
53
  return self._copy_with(network=network)
56
54
 
57
55
  def start_block(self, block: int) -> "QueryBuilder":
@@ -79,13 +77,13 @@ class QueryBuilder:
79
77
  """Set both start and end times."""
80
78
  return self._copy_with(since=start, until=end)
81
79
 
82
- # Common filters
80
+ # ERC20 and Native Token filters
83
81
  def sender(self, address: str) -> "QueryBuilder":
84
- """Filter by sender address."""
82
+ """Filter by sender address (ERC20, Native Token)."""
85
83
  return self._copy_with(sender=address)
86
84
 
87
85
  def receiver(self, address: str) -> "QueryBuilder":
88
- """Filter by receiver address."""
86
+ """Filter by receiver address (ERC20, Native Token)."""
89
87
  return self._copy_with(receiver=address)
90
88
 
91
89
  def from_address(self, address: str) -> "QueryBuilder":
@@ -97,52 +95,40 @@ class QueryBuilder:
97
95
  return self.receiver(address)
98
96
 
99
97
  def min_amount(self, amount: float) -> "QueryBuilder":
100
- """Filter by minimum amount."""
98
+ """Filter by minimum amount (ERC20, Native Token)."""
101
99
  return self._copy_with(min_amount=amount)
102
100
 
101
+ def max_amount(self, amount: float) -> "QueryBuilder":
102
+ """Filter by maximum amount (ERC20, Native Token)."""
103
+ return self._copy_with(max_amount=amount)
104
+
103
105
  # ERC20 specific
104
106
  def token(self, symbol: str) -> "QueryBuilder":
105
- """Set token symbol (for ERC20)."""
107
+ """Set token symbol or address (ERC20)."""
106
108
  return self._copy_with(token=symbol)
107
109
 
108
- def owner(self, address: str) -> "QueryBuilder":
109
- """Filter by owner address (for approvals)."""
110
- return self._copy_with(owner=address)
111
-
112
- def spender(self, address: str) -> "QueryBuilder":
113
- """Filter by spender address (for approvals)."""
114
- return self._copy_with(spender=address)
110
+ def decimals(self, decimals: int) -> "QueryBuilder":
111
+ """Set token decimals when using custom address (ERC20). Default: 18."""
112
+ return self._copy_with(decimals=decimals)
115
113
 
116
114
  # AAVE specific
117
- def user(self, address: str) -> "QueryBuilder":
118
- """Filter by user address (for AAVE)."""
119
- return self._copy_with(user=address)
120
-
121
- def reserve(self, address: str) -> "QueryBuilder":
122
- """Filter by reserve address (for AAVE)."""
123
- return self._copy_with(reserve=address)
124
-
125
- def liquidator(self, address: str) -> "QueryBuilder":
126
- """Filter by liquidator address (for AAVE liquidations)."""
127
- return self._copy_with(liquidator=address)
115
+ def eth_market_type(self, market_type: str) -> "QueryBuilder":
116
+ """Set AAVE market type for ETH network: 'Core', 'Prime', or 'EtherFi'. Default: 'Core'."""
117
+ return self._copy_with(eth_market_type=market_type)
128
118
 
129
119
  # Uniswap specific
130
120
  def symbol0(self, symbol: str) -> "QueryBuilder":
131
- """Set first token symbol (for Uniswap)."""
121
+ """Set first token symbol (Uniswap)."""
132
122
  return self._copy_with(symbol0=symbol)
133
123
 
134
124
  def symbol1(self, symbol: str) -> "QueryBuilder":
135
- """Set second token symbol (for Uniswap)."""
125
+ """Set second token symbol (Uniswap)."""
136
126
  return self._copy_with(symbol1=symbol)
137
127
 
138
128
  def fee(self, fee_tier: int) -> "QueryBuilder":
139
- """Set fee tier (for Uniswap): 100, 500, 3000, 10000."""
129
+ """Set fee tier (Uniswap): 100, 500, 3000, 10000."""
140
130
  return self._copy_with(fee=fee_tier)
141
131
 
142
- def pool(self, address: str) -> "QueryBuilder":
143
- """Set pool address (for Uniswap)."""
144
- return self._copy_with(pool=address)
145
-
146
132
  # Verbose mode
147
133
  def verbose(self, enabled: bool = True) -> "QueryBuilder":
148
134
  """Include all metadata fields (tx_hash, tx_id, log_index, network, name)."""
@@ -161,7 +147,7 @@ class QueryBuilder:
161
147
  """
162
148
  Execute query and return results as list of dictionaries.
163
149
 
164
- Uses JSON format from API.
150
+ Uses JSON format from API. Limited to 10,000 blocks.
165
151
 
166
152
  Returns:
167
153
  List of event dictionaries
@@ -253,7 +239,7 @@ class AsyncQueryBuilder:
253
239
  - as_file() - saves to CSV, Parquet, or JSON file
254
240
 
255
241
  Example:
256
- query = client.erc20.transfers("USDT").network("ETH").start_block(24000000).end_block(24100000)
242
+ query = client.erc20.transfers("USDT").network("ETH").block_range(21000000, 21010000)
257
243
  df = await query.as_df() # pandas DataFrame
258
244
  df = await query.as_df("polars") # polars DataFrame
259
245
  await query.as_file("transfers.csv") # save to CSV
@@ -283,7 +269,7 @@ class AsyncQueryBuilder:
283
269
 
284
270
  # Network and block range
285
271
  def network(self, network: str) -> "AsyncQueryBuilder":
286
- """Set the network (ETH, ARB, BASE, OP, etc.)."""
272
+ """Set the network (ETH, ARB, BASE, OP, POLYGON, etc.)."""
287
273
  return self._copy_with(network=network)
288
274
 
289
275
  def start_block(self, block: int) -> "AsyncQueryBuilder":
@@ -311,13 +297,13 @@ class AsyncQueryBuilder:
311
297
  """Set both start and end times."""
312
298
  return self._copy_with(since=start, until=end)
313
299
 
314
- # Common filters
300
+ # ERC20 and Native Token filters
315
301
  def sender(self, address: str) -> "AsyncQueryBuilder":
316
- """Filter by sender address."""
302
+ """Filter by sender address (ERC20, Native Token)."""
317
303
  return self._copy_with(sender=address)
318
304
 
319
305
  def receiver(self, address: str) -> "AsyncQueryBuilder":
320
- """Filter by receiver address."""
306
+ """Filter by receiver address (ERC20, Native Token)."""
321
307
  return self._copy_with(receiver=address)
322
308
 
323
309
  def from_address(self, address: str) -> "AsyncQueryBuilder":
@@ -329,52 +315,40 @@ class AsyncQueryBuilder:
329
315
  return self.receiver(address)
330
316
 
331
317
  def min_amount(self, amount: float) -> "AsyncQueryBuilder":
332
- """Filter by minimum amount."""
318
+ """Filter by minimum amount (ERC20, Native Token)."""
333
319
  return self._copy_with(min_amount=amount)
334
320
 
321
+ def max_amount(self, amount: float) -> "AsyncQueryBuilder":
322
+ """Filter by maximum amount (ERC20, Native Token)."""
323
+ return self._copy_with(max_amount=amount)
324
+
335
325
  # ERC20 specific
336
326
  def token(self, symbol: str) -> "AsyncQueryBuilder":
337
- """Set token symbol (for ERC20)."""
327
+ """Set token symbol or address (ERC20)."""
338
328
  return self._copy_with(token=symbol)
339
329
 
340
- def owner(self, address: str) -> "AsyncQueryBuilder":
341
- """Filter by owner address (for approvals)."""
342
- return self._copy_with(owner=address)
343
-
344
- def spender(self, address: str) -> "AsyncQueryBuilder":
345
- """Filter by spender address (for approvals)."""
346
- return self._copy_with(spender=address)
330
+ def decimals(self, decimals: int) -> "AsyncQueryBuilder":
331
+ """Set token decimals when using custom address (ERC20). Default: 18."""
332
+ return self._copy_with(decimals=decimals)
347
333
 
348
334
  # AAVE specific
349
- def user(self, address: str) -> "AsyncQueryBuilder":
350
- """Filter by user address (for AAVE)."""
351
- return self._copy_with(user=address)
352
-
353
- def reserve(self, address: str) -> "AsyncQueryBuilder":
354
- """Filter by reserve address (for AAVE)."""
355
- return self._copy_with(reserve=address)
356
-
357
- def liquidator(self, address: str) -> "AsyncQueryBuilder":
358
- """Filter by liquidator address (for AAVE liquidations)."""
359
- return self._copy_with(liquidator=address)
335
+ def eth_market_type(self, market_type: str) -> "AsyncQueryBuilder":
336
+ """Set AAVE market type for ETH network: 'Core', 'Prime', or 'EtherFi'. Default: 'Core'."""
337
+ return self._copy_with(eth_market_type=market_type)
360
338
 
361
339
  # Uniswap specific
362
340
  def symbol0(self, symbol: str) -> "AsyncQueryBuilder":
363
- """Set first token symbol (for Uniswap)."""
341
+ """Set first token symbol (Uniswap)."""
364
342
  return self._copy_with(symbol0=symbol)
365
343
 
366
344
  def symbol1(self, symbol: str) -> "AsyncQueryBuilder":
367
- """Set second token symbol (for Uniswap)."""
345
+ """Set second token symbol (Uniswap)."""
368
346
  return self._copy_with(symbol1=symbol)
369
347
 
370
348
  def fee(self, fee_tier: int) -> "AsyncQueryBuilder":
371
- """Set fee tier (for Uniswap): 100, 500, 3000, 10000."""
349
+ """Set fee tier (Uniswap): 100, 500, 3000, 10000."""
372
350
  return self._copy_with(fee=fee_tier)
373
351
 
374
- def pool(self, address: str) -> "AsyncQueryBuilder":
375
- """Set pool address (for Uniswap)."""
376
- return self._copy_with(pool=address)
377
-
378
352
  # Verbose mode
379
353
  def verbose(self, enabled: bool = True) -> "AsyncQueryBuilder":
380
354
  """Include all metadata fields (tx_hash, tx_id, log_index, network, name)."""
@@ -393,7 +367,7 @@ class AsyncQueryBuilder:
393
367
  """
394
368
  Execute query and return results as list of dictionaries.
395
369
 
396
- Uses JSON format from API.
370
+ Uses JSON format from API. Limited to 10,000 blocks.
397
371
 
398
372
  Returns:
399
373
  List of event dictionaries
@@ -405,8 +379,6 @@ class AsyncQueryBuilder:
405
379
  """
406
380
  Execute query and return results as DataFrame.
407
381
 
408
- Uses Parquet format from API for efficiency, then converts to DataFrame.
409
-
410
382
  Args:
411
383
  library: DataFrame library to use - "pandas" (default) or "polars"
412
384
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: defistream
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: Python client for the DeFiStream API
5
5
  Project-URL: Homepage, https://defistream.dev
6
6
  Project-URL: Documentation, https://docs.defistream.dev
@@ -158,12 +158,12 @@ df = (
158
158
  .as_df()
159
159
  )
160
160
 
161
- # Get liquidations for a specific user
161
+ # Use a specific market type on ETH (Core, Prime, or EtherFi)
162
162
  df = (
163
- client.aave.liquidations()
163
+ client.aave.deposits()
164
164
  .network("ETH")
165
165
  .block_range(21000000, 21010000)
166
- .user("0x...")
166
+ .eth_market_type("Prime")
167
167
  .as_df()
168
168
  )
169
169
  ```
@@ -409,23 +409,20 @@ print(f"Request cost: {client.last_response.request_cost}")
409
409
  | `.time_range(start, end)` | Set both start and end times |
410
410
  | `.verbose()` | Include all metadata fields |
411
411
 
412
- ### Filter Methods
412
+ ### Protocol-Specific Parameters
413
413
 
414
414
  | Method | Protocols | Description |
415
415
  |--------|-----------|-------------|
416
+ | `.token(symbol)` | ERC20 | Token symbol (USDT, USDC) or contract address |
417
+ | `.decimals(n)` | ERC20 | Token decimals when using custom address (default: 18) |
416
418
  | `.sender(addr)` | ERC20, Native | Filter by sender address |
417
419
  | `.receiver(addr)` | ERC20, Native | Filter by receiver address |
418
- | `.from_address(addr)` | ERC20, Native | Alias for sender |
419
- | `.to_address(addr)` | ERC20, Native | Alias for receiver |
420
420
  | `.min_amount(amt)` | ERC20, Native | Minimum transfer amount |
421
- | `.token(symbol)` | ERC20 | Token symbol (USDT, USDC, etc.) |
422
- | `.user(addr)` | AAVE | Filter by user |
423
- | `.reserve(addr)` | AAVE | Filter by reserve |
424
- | `.liquidator(addr)` | AAVE Liquidations | Filter by liquidator |
425
- | `.symbol0(sym)` | Uniswap | First token symbol |
426
- | `.symbol1(sym)` | Uniswap | Second token symbol |
427
- | `.fee(tier)` | Uniswap | Fee tier (100, 500, 3000, 10000) |
428
- | `.pool(addr)` | Uniswap | Pool address |
421
+ | `.max_amount(amt)` | ERC20, Native | Maximum transfer amount |
422
+ | `.eth_market_type(type)` | AAVE | Market type for ETH: 'Core', 'Prime', 'EtherFi' |
423
+ | `.symbol0(sym)` | Uniswap | First token symbol (required) |
424
+ | `.symbol1(sym)` | Uniswap | Second token symbol (required) |
425
+ | `.fee(tier)` | Uniswap | Fee tier: 100, 500, 3000, 10000 (required) |
429
426
 
430
427
  ### Terminal Methods
431
428
 
@@ -1,11 +1,11 @@
1
- defistream/__init__.py,sha256=h2xO5tLBCKGkCzw0DTG6g6aDSBZs2qd4oaKnCRLlJR8,1680
1
+ defistream/__init__.py,sha256=RUAlky12Gxi0hYBUeXJ32qkhku-BLs8cOqZCpC6nZE0,1680
2
2
  defistream/client.py,sha256=Ku8ouDbM6Mx4lVmqvBwNvNt-h2FkvqauPMSjKyPkjU4,12717
3
3
  defistream/exceptions.py,sha256=_GxZQ18_YvXFtmNHeddWV8fHPIllHgFeP7fP0CmHF1k,1492
4
4
  defistream/models.py,sha256=JiG4IUq19HIANz9MHQCkaE6onGNyNzXcbdJmosrHsw0,3812
5
5
  defistream/protocols.py,sha256=5_bYd46lDy-mK6LZ8sTGW0Z2IVH4g0cQ5rBbbOXsw0U,15368
6
6
  defistream/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- defistream/query.py,sha256=73vu8uXBdiFqGKoU0nDHDQ8emLnt1HVJMmvrl--Hzmg,17791
8
- defistream-1.0.1.dist-info/METADATA,sha256=2yl5LrW4c3sEHzORotGKqmn5FG50oicXUCgttApTn2M,10947
9
- defistream-1.0.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
10
- defistream-1.0.1.dist-info/licenses/LICENSE,sha256=72DWAof8dMePfFQmfaswClW5d-sE6k7p-7VpuSKLmU4,1067
11
- defistream-1.0.1.dist-info/RECORD,,
7
+ defistream/query.py,sha256=cOGba8MQNFKXTs39csD81vrMW76c9O3-S40R0KAMyCA,17158
8
+ defistream-1.0.2.dist-info/METADATA,sha256=MSChxyWWx6vCUALDfZFybRLcqJsKtyi56N4eY-i2vyE,10950
9
+ defistream-1.0.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
10
+ defistream-1.0.2.dist-info/licenses/LICENSE,sha256=72DWAof8dMePfFQmfaswClW5d-sE6k7p-7VpuSKLmU4,1067
11
+ defistream-1.0.2.dist-info/RECORD,,