defistream 1.0.1__tar.gz → 1.0.2__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.
- {defistream-1.0.1 → defistream-1.0.2}/PKG-INFO +12 -15
- {defistream-1.0.1 → defistream-1.0.2}/README.md +11 -14
- {defistream-1.0.1 → defistream-1.0.2}/pyproject.toml +1 -1
- {defistream-1.0.1 → defistream-1.0.2}/src/defistream/__init__.py +1 -1
- {defistream-1.0.1 → defistream-1.0.2}/src/defistream/query.py +43 -71
- {defistream-1.0.1 → defistream-1.0.2}/tests/test_client.py +26 -24
- {defistream-1.0.1 → defistream-1.0.2}/.gitignore +0 -0
- {defistream-1.0.1 → defistream-1.0.2}/LICENSE +0 -0
- {defistream-1.0.1 → defistream-1.0.2}/sample_usage.py +0 -0
- {defistream-1.0.1 → defistream-1.0.2}/src/defistream/client.py +0 -0
- {defistream-1.0.1 → defistream-1.0.2}/src/defistream/exceptions.py +0 -0
- {defistream-1.0.1 → defistream-1.0.2}/src/defistream/models.py +0 -0
- {defistream-1.0.1 → defistream-1.0.2}/src/defistream/protocols.py +0 -0
- {defistream-1.0.1 → defistream-1.0.2}/src/defistream/py.typed +0 -0
- {defistream-1.0.1 → defistream-1.0.2}/tests/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: defistream
|
|
3
|
-
Version: 1.0.
|
|
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
|
-
#
|
|
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,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
|
-
###
|
|
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
|
-
| `.
|
|
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 |
|
|
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
|
|
|
@@ -124,12 +124,12 @@ df = (
|
|
|
124
124
|
.as_df()
|
|
125
125
|
)
|
|
126
126
|
|
|
127
|
-
#
|
|
127
|
+
# Use a specific market type on ETH (Core, Prime, or EtherFi)
|
|
128
128
|
df = (
|
|
129
|
-
client.aave.
|
|
129
|
+
client.aave.deposits()
|
|
130
130
|
.network("ETH")
|
|
131
131
|
.block_range(21000000, 21010000)
|
|
132
|
-
.
|
|
132
|
+
.eth_market_type("Prime")
|
|
133
133
|
.as_df()
|
|
134
134
|
)
|
|
135
135
|
```
|
|
@@ -375,23 +375,20 @@ print(f"Request cost: {client.last_response.request_cost}")
|
|
|
375
375
|
| `.time_range(start, end)` | Set both start and end times |
|
|
376
376
|
| `.verbose()` | Include all metadata fields |
|
|
377
377
|
|
|
378
|
-
###
|
|
378
|
+
### Protocol-Specific Parameters
|
|
379
379
|
|
|
380
380
|
| Method | Protocols | Description |
|
|
381
381
|
|--------|-----------|-------------|
|
|
382
|
+
| `.token(symbol)` | ERC20 | Token symbol (USDT, USDC) or contract address |
|
|
383
|
+
| `.decimals(n)` | ERC20 | Token decimals when using custom address (default: 18) |
|
|
382
384
|
| `.sender(addr)` | ERC20, Native | Filter by sender address |
|
|
383
385
|
| `.receiver(addr)` | ERC20, Native | Filter by receiver address |
|
|
384
|
-
| `.from_address(addr)` | ERC20, Native | Alias for sender |
|
|
385
|
-
| `.to_address(addr)` | ERC20, Native | Alias for receiver |
|
|
386
386
|
| `.min_amount(amt)` | ERC20, Native | Minimum transfer amount |
|
|
387
|
-
| `.
|
|
388
|
-
| `.
|
|
389
|
-
| `.
|
|
390
|
-
| `.
|
|
391
|
-
| `.
|
|
392
|
-
| `.symbol1(sym)` | Uniswap | Second token symbol |
|
|
393
|
-
| `.fee(tier)` | Uniswap | Fee tier (100, 500, 3000, 10000) |
|
|
394
|
-
| `.pool(addr)` | Uniswap | Pool address |
|
|
387
|
+
| `.max_amount(amt)` | ERC20, Native | Maximum transfer amount |
|
|
388
|
+
| `.eth_market_type(type)` | AAVE | Market type for ETH: 'Core', 'Prime', 'EtherFi' |
|
|
389
|
+
| `.symbol0(sym)` | Uniswap | First token symbol (required) |
|
|
390
|
+
| `.symbol1(sym)` | Uniswap | Second token symbol (required) |
|
|
391
|
+
| `.fee(tier)` | Uniswap | Fee tier: 100, 500, 3000, 10000 (required) |
|
|
395
392
|
|
|
396
393
|
### Terminal Methods
|
|
397
394
|
|
|
@@ -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,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 (
|
|
107
|
+
"""Set token symbol or address (ERC20)."""
|
|
106
108
|
return self._copy_with(token=symbol)
|
|
107
109
|
|
|
108
|
-
def
|
|
109
|
-
"""
|
|
110
|
-
return self._copy_with(
|
|
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
|
|
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)
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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").
|
|
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
|
-
#
|
|
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 (
|
|
327
|
+
"""Set token symbol or address (ERC20)."""
|
|
338
328
|
return self._copy_with(token=symbol)
|
|
339
329
|
|
|
340
|
-
def
|
|
341
|
-
"""
|
|
342
|
-
return self._copy_with(
|
|
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
|
|
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)
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
|
|
@@ -221,6 +221,12 @@ class TestBuilderPattern:
|
|
|
221
221
|
query = client.erc20.transfers().min_amount(1000)
|
|
222
222
|
assert query._params["min_amount"] == 1000
|
|
223
223
|
|
|
224
|
+
def test_max_amount_filter(self):
|
|
225
|
+
"""max_amount should set param."""
|
|
226
|
+
client = DeFiStream(api_key="dsk_test")
|
|
227
|
+
query = client.erc20.transfers().max_amount(10000)
|
|
228
|
+
assert query._params["max_amount"] == 10000
|
|
229
|
+
|
|
224
230
|
def test_start_time(self):
|
|
225
231
|
"""start_time should set since param."""
|
|
226
232
|
client = DeFiStream(api_key="dsk_test")
|
|
@@ -240,6 +246,12 @@ class TestBuilderPattern:
|
|
|
240
246
|
assert query._params["since"] == "2024-01-01"
|
|
241
247
|
assert query._params["until"] == "2024-01-31"
|
|
242
248
|
|
|
249
|
+
def test_decimals_filter(self):
|
|
250
|
+
"""decimals should set param."""
|
|
251
|
+
client = DeFiStream(api_key="dsk_test")
|
|
252
|
+
query = client.erc20.transfers().decimals(6)
|
|
253
|
+
assert query._params["decimals"] == 6
|
|
254
|
+
|
|
243
255
|
|
|
244
256
|
class TestAsyncBuilderPattern:
|
|
245
257
|
"""Test async builder pattern."""
|
|
@@ -269,12 +281,6 @@ class TestUniswapBuilder:
|
|
|
269
281
|
assert query._params["symbol1"] == "USDC"
|
|
270
282
|
assert query._params["fee"] == 500
|
|
271
283
|
|
|
272
|
-
def test_pool_filter(self):
|
|
273
|
-
"""pool() should set pool param."""
|
|
274
|
-
client = DeFiStream(api_key="dsk_test")
|
|
275
|
-
query = client.uniswap.swaps().pool("0x123")
|
|
276
|
-
assert query._params["pool"] == "0x123"
|
|
277
|
-
|
|
278
284
|
def test_deposits_endpoint(self):
|
|
279
285
|
"""deposits() should use correct endpoint."""
|
|
280
286
|
client = DeFiStream(api_key="dsk_test")
|
|
@@ -293,27 +299,17 @@ class TestUniswapBuilder:
|
|
|
293
299
|
query = client.uniswap.collects("WETH", "USDC", 500)
|
|
294
300
|
assert query._endpoint == "/uniswap/events/collect"
|
|
295
301
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
"""Test AAVE-specific builder methods."""
|
|
299
|
-
|
|
300
|
-
def test_user_filter(self):
|
|
301
|
-
"""user() should set user param."""
|
|
302
|
+
def test_symbol_and_fee_chain_methods(self):
|
|
303
|
+
"""symbol0, symbol1, fee should work as chain methods."""
|
|
302
304
|
client = DeFiStream(api_key="dsk_test")
|
|
303
|
-
query = client.
|
|
304
|
-
assert query._params["
|
|
305
|
+
query = client.uniswap.swaps().symbol0("WETH").symbol1("USDC").fee(3000)
|
|
306
|
+
assert query._params["symbol0"] == "WETH"
|
|
307
|
+
assert query._params["symbol1"] == "USDC"
|
|
308
|
+
assert query._params["fee"] == 3000
|
|
305
309
|
|
|
306
|
-
def test_reserve_filter(self):
|
|
307
|
-
"""reserve() should set reserve param."""
|
|
308
|
-
client = DeFiStream(api_key="dsk_test")
|
|
309
|
-
query = client.aave.deposits().reserve("0x456")
|
|
310
|
-
assert query._params["reserve"] == "0x456"
|
|
311
310
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
client = DeFiStream(api_key="dsk_test")
|
|
315
|
-
query = client.aave.liquidations().liquidator("0x789")
|
|
316
|
-
assert query._params["liquidator"] == "0x789"
|
|
311
|
+
class TestAAVEBuilder:
|
|
312
|
+
"""Test AAVE-specific builder methods."""
|
|
317
313
|
|
|
318
314
|
def test_flashloans_endpoint(self):
|
|
319
315
|
"""flashloans() should use correct endpoint."""
|
|
@@ -321,6 +317,12 @@ class TestAAVEBuilder:
|
|
|
321
317
|
query = client.aave.flashloans()
|
|
322
318
|
assert query._endpoint == "/aave/events/flashloan"
|
|
323
319
|
|
|
320
|
+
def test_eth_market_type_filter(self):
|
|
321
|
+
"""eth_market_type should set param."""
|
|
322
|
+
client = DeFiStream(api_key="dsk_test")
|
|
323
|
+
query = client.aave.deposits().eth_market_type("Prime")
|
|
324
|
+
assert query._params["eth_market_type"] == "Prime"
|
|
325
|
+
|
|
324
326
|
|
|
325
327
|
class TestQueryBuilderRepr:
|
|
326
328
|
"""Test QueryBuilder repr."""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|