defistream 1.0.1__py3-none-any.whl → 1.0.3__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 +1 -1
- defistream/query.py +37 -73
- {defistream-1.0.1.dist-info → defistream-1.0.3.dist-info}/METADATA +11 -15
- {defistream-1.0.1.dist-info → defistream-1.0.3.dist-info}/RECORD +6 -6
- {defistream-1.0.1.dist-info → defistream-1.0.3.dist-info}/WHEEL +0 -0
- {defistream-1.0.1.dist-info → defistream-1.0.3.dist-info}/licenses/LICENSE +0 -0
defistream/__init__.py
CHANGED
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
|
|
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").
|
|
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
|
-
#
|
|
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,36 @@ 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 (
|
|
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)
|
|
115
|
-
|
|
116
110
|
# AAVE specific
|
|
117
|
-
def
|
|
118
|
-
"""
|
|
119
|
-
return self._copy_with(
|
|
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)
|
|
111
|
+
def eth_market_type(self, market_type: str) -> "QueryBuilder":
|
|
112
|
+
"""Set AAVE market type for ETH network: 'Core', 'Prime', or 'EtherFi'. Default: 'Core'."""
|
|
113
|
+
return self._copy_with(eth_market_type=market_type)
|
|
128
114
|
|
|
129
115
|
# Uniswap specific
|
|
130
116
|
def symbol0(self, symbol: str) -> "QueryBuilder":
|
|
131
|
-
"""Set first token symbol (
|
|
117
|
+
"""Set first token symbol (Uniswap)."""
|
|
132
118
|
return self._copy_with(symbol0=symbol)
|
|
133
119
|
|
|
134
120
|
def symbol1(self, symbol: str) -> "QueryBuilder":
|
|
135
|
-
"""Set second token symbol (
|
|
121
|
+
"""Set second token symbol (Uniswap)."""
|
|
136
122
|
return self._copy_with(symbol1=symbol)
|
|
137
123
|
|
|
138
124
|
def fee(self, fee_tier: int) -> "QueryBuilder":
|
|
139
|
-
"""Set fee tier (
|
|
125
|
+
"""Set fee tier (Uniswap): 100, 500, 3000, 10000."""
|
|
140
126
|
return self._copy_with(fee=fee_tier)
|
|
141
127
|
|
|
142
|
-
def pool(self, address: str) -> "QueryBuilder":
|
|
143
|
-
"""Set pool address (for Uniswap)."""
|
|
144
|
-
return self._copy_with(pool=address)
|
|
145
|
-
|
|
146
128
|
# Verbose mode
|
|
147
129
|
def verbose(self, enabled: bool = True) -> "QueryBuilder":
|
|
148
130
|
"""Include all metadata fields (tx_hash, tx_id, log_index, network, name)."""
|
|
@@ -161,7 +143,7 @@ class QueryBuilder:
|
|
|
161
143
|
"""
|
|
162
144
|
Execute query and return results as list of dictionaries.
|
|
163
145
|
|
|
164
|
-
Uses JSON format from API.
|
|
146
|
+
Uses JSON format from API. Limited to 10,000 blocks.
|
|
165
147
|
|
|
166
148
|
Returns:
|
|
167
149
|
List of event dictionaries
|
|
@@ -253,7 +235,7 @@ class AsyncQueryBuilder:
|
|
|
253
235
|
- as_file() - saves to CSV, Parquet, or JSON file
|
|
254
236
|
|
|
255
237
|
Example:
|
|
256
|
-
query = client.erc20.transfers("USDT").network("ETH").
|
|
238
|
+
query = client.erc20.transfers("USDT").network("ETH").block_range(21000000, 21010000)
|
|
257
239
|
df = await query.as_df() # pandas DataFrame
|
|
258
240
|
df = await query.as_df("polars") # polars DataFrame
|
|
259
241
|
await query.as_file("transfers.csv") # save to CSV
|
|
@@ -283,7 +265,7 @@ class AsyncQueryBuilder:
|
|
|
283
265
|
|
|
284
266
|
# Network and block range
|
|
285
267
|
def network(self, network: str) -> "AsyncQueryBuilder":
|
|
286
|
-
"""Set the network (ETH, ARB, BASE, OP, etc.)."""
|
|
268
|
+
"""Set the network (ETH, ARB, BASE, OP, POLYGON, etc.)."""
|
|
287
269
|
return self._copy_with(network=network)
|
|
288
270
|
|
|
289
271
|
def start_block(self, block: int) -> "AsyncQueryBuilder":
|
|
@@ -311,13 +293,13 @@ class AsyncQueryBuilder:
|
|
|
311
293
|
"""Set both start and end times."""
|
|
312
294
|
return self._copy_with(since=start, until=end)
|
|
313
295
|
|
|
314
|
-
#
|
|
296
|
+
# ERC20 and Native Token filters
|
|
315
297
|
def sender(self, address: str) -> "AsyncQueryBuilder":
|
|
316
|
-
"""Filter by sender address."""
|
|
298
|
+
"""Filter by sender address (ERC20, Native Token)."""
|
|
317
299
|
return self._copy_with(sender=address)
|
|
318
300
|
|
|
319
301
|
def receiver(self, address: str) -> "AsyncQueryBuilder":
|
|
320
|
-
"""Filter by receiver address."""
|
|
302
|
+
"""Filter by receiver address (ERC20, Native Token)."""
|
|
321
303
|
return self._copy_with(receiver=address)
|
|
322
304
|
|
|
323
305
|
def from_address(self, address: str) -> "AsyncQueryBuilder":
|
|
@@ -329,52 +311,36 @@ class AsyncQueryBuilder:
|
|
|
329
311
|
return self.receiver(address)
|
|
330
312
|
|
|
331
313
|
def min_amount(self, amount: float) -> "AsyncQueryBuilder":
|
|
332
|
-
"""Filter by minimum amount."""
|
|
314
|
+
"""Filter by minimum amount (ERC20, Native Token)."""
|
|
333
315
|
return self._copy_with(min_amount=amount)
|
|
334
316
|
|
|
317
|
+
def max_amount(self, amount: float) -> "AsyncQueryBuilder":
|
|
318
|
+
"""Filter by maximum amount (ERC20, Native Token)."""
|
|
319
|
+
return self._copy_with(max_amount=amount)
|
|
320
|
+
|
|
335
321
|
# ERC20 specific
|
|
336
322
|
def token(self, symbol: str) -> "AsyncQueryBuilder":
|
|
337
|
-
"""Set token symbol (
|
|
323
|
+
"""Set token symbol or address (ERC20)."""
|
|
338
324
|
return self._copy_with(token=symbol)
|
|
339
325
|
|
|
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)
|
|
347
|
-
|
|
348
326
|
# AAVE specific
|
|
349
|
-
def
|
|
350
|
-
"""
|
|
351
|
-
return self._copy_with(
|
|
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)
|
|
327
|
+
def eth_market_type(self, market_type: str) -> "AsyncQueryBuilder":
|
|
328
|
+
"""Set AAVE market type for ETH network: 'Core', 'Prime', or 'EtherFi'. Default: 'Core'."""
|
|
329
|
+
return self._copy_with(eth_market_type=market_type)
|
|
360
330
|
|
|
361
331
|
# Uniswap specific
|
|
362
332
|
def symbol0(self, symbol: str) -> "AsyncQueryBuilder":
|
|
363
|
-
"""Set first token symbol (
|
|
333
|
+
"""Set first token symbol (Uniswap)."""
|
|
364
334
|
return self._copy_with(symbol0=symbol)
|
|
365
335
|
|
|
366
336
|
def symbol1(self, symbol: str) -> "AsyncQueryBuilder":
|
|
367
|
-
"""Set second token symbol (
|
|
337
|
+
"""Set second token symbol (Uniswap)."""
|
|
368
338
|
return self._copy_with(symbol1=symbol)
|
|
369
339
|
|
|
370
340
|
def fee(self, fee_tier: int) -> "AsyncQueryBuilder":
|
|
371
|
-
"""Set fee tier (
|
|
341
|
+
"""Set fee tier (Uniswap): 100, 500, 3000, 10000."""
|
|
372
342
|
return self._copy_with(fee=fee_tier)
|
|
373
343
|
|
|
374
|
-
def pool(self, address: str) -> "AsyncQueryBuilder":
|
|
375
|
-
"""Set pool address (for Uniswap)."""
|
|
376
|
-
return self._copy_with(pool=address)
|
|
377
|
-
|
|
378
344
|
# Verbose mode
|
|
379
345
|
def verbose(self, enabled: bool = True) -> "AsyncQueryBuilder":
|
|
380
346
|
"""Include all metadata fields (tx_hash, tx_id, log_index, network, name)."""
|
|
@@ -393,7 +359,7 @@ class AsyncQueryBuilder:
|
|
|
393
359
|
"""
|
|
394
360
|
Execute query and return results as list of dictionaries.
|
|
395
361
|
|
|
396
|
-
Uses JSON format from API.
|
|
362
|
+
Uses JSON format from API. Limited to 10,000 blocks.
|
|
397
363
|
|
|
398
364
|
Returns:
|
|
399
365
|
List of event dictionaries
|
|
@@ -405,8 +371,6 @@ class AsyncQueryBuilder:
|
|
|
405
371
|
"""
|
|
406
372
|
Execute query and return results as DataFrame.
|
|
407
373
|
|
|
408
|
-
Uses Parquet format from API for efficiency, then converts to DataFrame.
|
|
409
|
-
|
|
410
374
|
Args:
|
|
411
375
|
library: DataFrame library to use - "pandas" (default) or "polars"
|
|
412
376
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: defistream
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
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
|
-
#
|
|
161
|
+
# Use a specific market type on ETH (Core, Prime, or EtherFi)
|
|
162
162
|
df = (
|
|
163
|
-
client.aave.
|
|
163
|
+
client.aave.deposits()
|
|
164
164
|
.network("ETH")
|
|
165
165
|
.block_range(21000000, 21010000)
|
|
166
|
-
.
|
|
166
|
+
.eth_market_type("Prime")
|
|
167
167
|
.as_df()
|
|
168
168
|
)
|
|
169
169
|
```
|
|
@@ -409,23 +409,19 @@ 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
|
-
###
|
|
412
|
+
### Protocol-Specific Parameters
|
|
413
413
|
|
|
414
414
|
| Method | Protocols | Description |
|
|
415
415
|
|--------|-----------|-------------|
|
|
416
|
+
| `.token(symbol)` | ERC20 | Token symbol (USDT, USDC) or contract address |
|
|
416
417
|
| `.sender(addr)` | ERC20, Native | Filter by sender address |
|
|
417
418
|
| `.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
419
|
| `.min_amount(amt)` | ERC20, Native | Minimum transfer amount |
|
|
421
|
-
| `.
|
|
422
|
-
| `.
|
|
423
|
-
| `.
|
|
424
|
-
| `.
|
|
425
|
-
| `.
|
|
426
|
-
| `.symbol1(sym)` | Uniswap | Second token symbol |
|
|
427
|
-
| `.fee(tier)` | Uniswap | Fee tier (100, 500, 3000, 10000) |
|
|
428
|
-
| `.pool(addr)` | Uniswap | Pool address |
|
|
420
|
+
| `.max_amount(amt)` | ERC20, Native | Maximum transfer amount |
|
|
421
|
+
| `.eth_market_type(type)` | AAVE | Market type for ETH: 'Core', 'Prime', 'EtherFi' |
|
|
422
|
+
| `.symbol0(sym)` | Uniswap | First token symbol (required) |
|
|
423
|
+
| `.symbol1(sym)` | Uniswap | Second token symbol (required) |
|
|
424
|
+
| `.fee(tier)` | Uniswap | Fee tier: 100, 500, 3000, 10000 (required) |
|
|
429
425
|
|
|
430
426
|
### Terminal Methods
|
|
431
427
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
defistream/__init__.py,sha256=
|
|
1
|
+
defistream/__init__.py,sha256=EoTDWy57VZtTk-_lgFPGOG2wj1CA7yeHU7JDLFkNPug,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=
|
|
8
|
-
defistream-1.0.
|
|
9
|
-
defistream-1.0.
|
|
10
|
-
defistream-1.0.
|
|
11
|
-
defistream-1.0.
|
|
7
|
+
defistream/query.py,sha256=sNn_0OzNDlsp4N74Grumsb08R5OFPPoppPok3vh8Y6Q,16775
|
|
8
|
+
defistream-1.0.3.dist-info/METADATA,sha256=Ne2g2fOZjlZovgY5a8MANw_ZMXB8-tPgOnxslEwVeR4,10866
|
|
9
|
+
defistream-1.0.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
10
|
+
defistream-1.0.3.dist-info/licenses/LICENSE,sha256=72DWAof8dMePfFQmfaswClW5d-sE6k7p-7VpuSKLmU4,1067
|
|
11
|
+
defistream-1.0.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|