defistream 1.0.0__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 +81 -0
- defistream/client.py +380 -0
- defistream/exceptions.py +65 -0
- defistream/models.py +174 -0
- defistream/protocols.py +364 -0
- defistream/py.typed +0 -0
- defistream/query.py +477 -0
- defistream-1.0.0.dist-info/METADATA +490 -0
- defistream-1.0.0.dist-info/RECORD +11 -0
- defistream-1.0.0.dist-info/WHEEL +4 -0
- defistream-1.0.0.dist-info/licenses/LICENSE +21 -0
defistream/protocols.py
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"""Protocol-specific API clients with builder pattern."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from .query import QueryBuilder, AsyncQueryBuilder
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from .client import BaseClient
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ERC20Protocol:
|
|
14
|
+
"""ERC20 token events with builder pattern."""
|
|
15
|
+
|
|
16
|
+
def __init__(self, client: "BaseClient"):
|
|
17
|
+
self._client = client
|
|
18
|
+
|
|
19
|
+
def transfers(self, token: str | None = None) -> QueryBuilder:
|
|
20
|
+
"""
|
|
21
|
+
Start a query for ERC20 transfer events.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
token: Optional token symbol (USDT, USDC, WETH, etc.)
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
QueryBuilder for chaining filters
|
|
28
|
+
|
|
29
|
+
Example:
|
|
30
|
+
query = client.erc20.transfers("USDT").network("ETH").start_block(24000000).end_block(24100000)
|
|
31
|
+
df = query.as_pandas()
|
|
32
|
+
"""
|
|
33
|
+
params = {"token": token} if token else {}
|
|
34
|
+
return QueryBuilder(self._client, "/erc20/events/transfer", params)
|
|
35
|
+
|
|
36
|
+
def approvals(self, token: str | None = None) -> QueryBuilder:
|
|
37
|
+
"""
|
|
38
|
+
Start a query for ERC20 approval events.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
token: Optional token symbol
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
QueryBuilder for chaining filters
|
|
45
|
+
"""
|
|
46
|
+
params = {"token": token} if token else {}
|
|
47
|
+
return QueryBuilder(self._client, "/erc20/events/approval", params)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class NativeTokenProtocol:
|
|
51
|
+
"""Native token (ETH, MATIC, BNB, etc.) events with builder pattern."""
|
|
52
|
+
|
|
53
|
+
def __init__(self, client: "BaseClient"):
|
|
54
|
+
self._client = client
|
|
55
|
+
|
|
56
|
+
def transfers(self) -> QueryBuilder:
|
|
57
|
+
"""
|
|
58
|
+
Start a query for native token transfer events.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
QueryBuilder for chaining filters
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
query = client.native_token.transfers().network("ETH").start_block(24000000).end_block(24100000)
|
|
65
|
+
transfers = query.min_amount(1.0).as_dict()
|
|
66
|
+
"""
|
|
67
|
+
return QueryBuilder(self._client, "/native_token/events/transfer")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class AAVEProtocol:
|
|
71
|
+
"""AAVE V3 lending protocol events with builder pattern."""
|
|
72
|
+
|
|
73
|
+
def __init__(self, client: "BaseClient"):
|
|
74
|
+
self._client = client
|
|
75
|
+
|
|
76
|
+
def deposits(self) -> QueryBuilder:
|
|
77
|
+
"""Start a query for AAVE deposit/supply events."""
|
|
78
|
+
return QueryBuilder(self._client, "/aave/events/deposit")
|
|
79
|
+
|
|
80
|
+
def withdrawals(self) -> QueryBuilder:
|
|
81
|
+
"""Start a query for AAVE withdrawal events."""
|
|
82
|
+
return QueryBuilder(self._client, "/aave/events/withdraw")
|
|
83
|
+
|
|
84
|
+
def borrows(self) -> QueryBuilder:
|
|
85
|
+
"""Start a query for AAVE borrow events."""
|
|
86
|
+
return QueryBuilder(self._client, "/aave/events/borrow")
|
|
87
|
+
|
|
88
|
+
def repays(self) -> QueryBuilder:
|
|
89
|
+
"""Start a query for AAVE repay events."""
|
|
90
|
+
return QueryBuilder(self._client, "/aave/events/repay")
|
|
91
|
+
|
|
92
|
+
def liquidations(self) -> QueryBuilder:
|
|
93
|
+
"""Start a query for AAVE liquidation events."""
|
|
94
|
+
return QueryBuilder(self._client, "/aave/events/liquidation")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class UniswapProtocol:
|
|
98
|
+
"""Uniswap V3 DEX events with builder pattern."""
|
|
99
|
+
|
|
100
|
+
def __init__(self, client: "BaseClient"):
|
|
101
|
+
self._client = client
|
|
102
|
+
|
|
103
|
+
def swaps(
|
|
104
|
+
self,
|
|
105
|
+
symbol0: str | None = None,
|
|
106
|
+
symbol1: str | None = None,
|
|
107
|
+
fee: int | None = None,
|
|
108
|
+
) -> QueryBuilder:
|
|
109
|
+
"""
|
|
110
|
+
Start a query for Uniswap V3 swap events.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
symbol0: Optional first token symbol (e.g., WETH)
|
|
114
|
+
symbol1: Optional second token symbol (e.g., USDC)
|
|
115
|
+
fee: Optional fee tier (100, 500, 3000, 10000)
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
QueryBuilder for chaining filters
|
|
119
|
+
|
|
120
|
+
Example:
|
|
121
|
+
query = client.uniswap.swaps("WETH", "USDC", 500).network("ETH").start_block(24000000).end_block(24100000)
|
|
122
|
+
df = query.as_pandas()
|
|
123
|
+
"""
|
|
124
|
+
params: dict[str, Any] = {}
|
|
125
|
+
if symbol0:
|
|
126
|
+
params["symbol0"] = symbol0
|
|
127
|
+
if symbol1:
|
|
128
|
+
params["symbol1"] = symbol1
|
|
129
|
+
if fee:
|
|
130
|
+
params["fee"] = fee
|
|
131
|
+
return QueryBuilder(self._client, "/uniswap/events/swap", params)
|
|
132
|
+
|
|
133
|
+
def mints(
|
|
134
|
+
self,
|
|
135
|
+
symbol0: str | None = None,
|
|
136
|
+
symbol1: str | None = None,
|
|
137
|
+
fee: int | None = None,
|
|
138
|
+
) -> QueryBuilder:
|
|
139
|
+
"""Start a query for Uniswap V3 mint (add liquidity) events."""
|
|
140
|
+
params: dict[str, Any] = {}
|
|
141
|
+
if symbol0:
|
|
142
|
+
params["symbol0"] = symbol0
|
|
143
|
+
if symbol1:
|
|
144
|
+
params["symbol1"] = symbol1
|
|
145
|
+
if fee:
|
|
146
|
+
params["fee"] = fee
|
|
147
|
+
return QueryBuilder(self._client, "/uniswap/events/mint", params)
|
|
148
|
+
|
|
149
|
+
def burns(
|
|
150
|
+
self,
|
|
151
|
+
symbol0: str | None = None,
|
|
152
|
+
symbol1: str | None = None,
|
|
153
|
+
fee: int | None = None,
|
|
154
|
+
) -> QueryBuilder:
|
|
155
|
+
"""Start a query for Uniswap V3 burn (remove liquidity) events."""
|
|
156
|
+
params: dict[str, Any] = {}
|
|
157
|
+
if symbol0:
|
|
158
|
+
params["symbol0"] = symbol0
|
|
159
|
+
if symbol1:
|
|
160
|
+
params["symbol1"] = symbol1
|
|
161
|
+
if fee:
|
|
162
|
+
params["fee"] = fee
|
|
163
|
+
return QueryBuilder(self._client, "/uniswap/events/burn", params)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class LidoProtocol:
|
|
167
|
+
"""Lido liquid staking events with builder pattern."""
|
|
168
|
+
|
|
169
|
+
def __init__(self, client: "BaseClient"):
|
|
170
|
+
self._client = client
|
|
171
|
+
|
|
172
|
+
def deposits(self) -> QueryBuilder:
|
|
173
|
+
"""Start a query for Lido stETH deposit events."""
|
|
174
|
+
return QueryBuilder(self._client, "/lido/events/deposit")
|
|
175
|
+
|
|
176
|
+
def withdrawals(self) -> QueryBuilder:
|
|
177
|
+
"""Start a query for Lido withdrawal events."""
|
|
178
|
+
return QueryBuilder(self._client, "/lido/events/withdraw")
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class StaderProtocol:
|
|
182
|
+
"""Stader EthX staking events with builder pattern."""
|
|
183
|
+
|
|
184
|
+
def __init__(self, client: "BaseClient"):
|
|
185
|
+
self._client = client
|
|
186
|
+
|
|
187
|
+
def deposits(self) -> QueryBuilder:
|
|
188
|
+
"""Start a query for Stader deposit events."""
|
|
189
|
+
return QueryBuilder(self._client, "/stader/events/deposit")
|
|
190
|
+
|
|
191
|
+
def withdrawals(self) -> QueryBuilder:
|
|
192
|
+
"""Start a query for Stader withdrawal events."""
|
|
193
|
+
return QueryBuilder(self._client, "/stader/events/withdraw")
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class ThresholdProtocol:
|
|
197
|
+
"""Threshold tBTC events with builder pattern."""
|
|
198
|
+
|
|
199
|
+
def __init__(self, client: "BaseClient"):
|
|
200
|
+
self._client = client
|
|
201
|
+
|
|
202
|
+
def mints(self) -> QueryBuilder:
|
|
203
|
+
"""Start a query for tBTC mint events."""
|
|
204
|
+
return QueryBuilder(self._client, "/threshold/events/mint")
|
|
205
|
+
|
|
206
|
+
def burns(self) -> QueryBuilder:
|
|
207
|
+
"""Start a query for tBTC burn/redeem events."""
|
|
208
|
+
return QueryBuilder(self._client, "/threshold/events/burn")
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
# Async protocol implementations
|
|
212
|
+
class AsyncERC20Protocol:
|
|
213
|
+
"""Async ERC20 token events with builder pattern."""
|
|
214
|
+
|
|
215
|
+
def __init__(self, client: "BaseClient"):
|
|
216
|
+
self._client = client
|
|
217
|
+
|
|
218
|
+
def transfers(self, token: str | None = None) -> AsyncQueryBuilder:
|
|
219
|
+
"""Start a query for ERC20 transfer events."""
|
|
220
|
+
params = {"token": token} if token else {}
|
|
221
|
+
return AsyncQueryBuilder(self._client, "/erc20/events/transfer", params)
|
|
222
|
+
|
|
223
|
+
def approvals(self, token: str | None = None) -> AsyncQueryBuilder:
|
|
224
|
+
"""Start a query for ERC20 approval events."""
|
|
225
|
+
params = {"token": token} if token else {}
|
|
226
|
+
return AsyncQueryBuilder(self._client, "/erc20/events/approval", params)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class AsyncNativeTokenProtocol:
|
|
230
|
+
"""Async native token events with builder pattern."""
|
|
231
|
+
|
|
232
|
+
def __init__(self, client: "BaseClient"):
|
|
233
|
+
self._client = client
|
|
234
|
+
|
|
235
|
+
def transfers(self) -> AsyncQueryBuilder:
|
|
236
|
+
"""Start a query for native token transfer events."""
|
|
237
|
+
return AsyncQueryBuilder(self._client, "/native_token/events/transfer")
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
class AsyncAAVEProtocol:
|
|
241
|
+
"""Async AAVE V3 events with builder pattern."""
|
|
242
|
+
|
|
243
|
+
def __init__(self, client: "BaseClient"):
|
|
244
|
+
self._client = client
|
|
245
|
+
|
|
246
|
+
def deposits(self) -> AsyncQueryBuilder:
|
|
247
|
+
"""Start a query for AAVE deposit/supply events."""
|
|
248
|
+
return AsyncQueryBuilder(self._client, "/aave/events/deposit")
|
|
249
|
+
|
|
250
|
+
def withdrawals(self) -> AsyncQueryBuilder:
|
|
251
|
+
"""Start a query for AAVE withdrawal events."""
|
|
252
|
+
return AsyncQueryBuilder(self._client, "/aave/events/withdraw")
|
|
253
|
+
|
|
254
|
+
def borrows(self) -> AsyncQueryBuilder:
|
|
255
|
+
"""Start a query for AAVE borrow events."""
|
|
256
|
+
return AsyncQueryBuilder(self._client, "/aave/events/borrow")
|
|
257
|
+
|
|
258
|
+
def repays(self) -> AsyncQueryBuilder:
|
|
259
|
+
"""Start a query for AAVE repay events."""
|
|
260
|
+
return AsyncQueryBuilder(self._client, "/aave/events/repay")
|
|
261
|
+
|
|
262
|
+
def liquidations(self) -> AsyncQueryBuilder:
|
|
263
|
+
"""Start a query for AAVE liquidation events."""
|
|
264
|
+
return AsyncQueryBuilder(self._client, "/aave/events/liquidation")
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
class AsyncUniswapProtocol:
|
|
268
|
+
"""Async Uniswap V3 events with builder pattern."""
|
|
269
|
+
|
|
270
|
+
def __init__(self, client: "BaseClient"):
|
|
271
|
+
self._client = client
|
|
272
|
+
|
|
273
|
+
def swaps(
|
|
274
|
+
self,
|
|
275
|
+
symbol0: str | None = None,
|
|
276
|
+
symbol1: str | None = None,
|
|
277
|
+
fee: int | None = None,
|
|
278
|
+
) -> AsyncQueryBuilder:
|
|
279
|
+
"""Start a query for Uniswap V3 swap events."""
|
|
280
|
+
params: dict[str, Any] = {}
|
|
281
|
+
if symbol0:
|
|
282
|
+
params["symbol0"] = symbol0
|
|
283
|
+
if symbol1:
|
|
284
|
+
params["symbol1"] = symbol1
|
|
285
|
+
if fee:
|
|
286
|
+
params["fee"] = fee
|
|
287
|
+
return AsyncQueryBuilder(self._client, "/uniswap/events/swap", params)
|
|
288
|
+
|
|
289
|
+
def mints(
|
|
290
|
+
self,
|
|
291
|
+
symbol0: str | None = None,
|
|
292
|
+
symbol1: str | None = None,
|
|
293
|
+
fee: int | None = None,
|
|
294
|
+
) -> AsyncQueryBuilder:
|
|
295
|
+
"""Start a query for Uniswap V3 mint events."""
|
|
296
|
+
params: dict[str, Any] = {}
|
|
297
|
+
if symbol0:
|
|
298
|
+
params["symbol0"] = symbol0
|
|
299
|
+
if symbol1:
|
|
300
|
+
params["symbol1"] = symbol1
|
|
301
|
+
if fee:
|
|
302
|
+
params["fee"] = fee
|
|
303
|
+
return AsyncQueryBuilder(self._client, "/uniswap/events/mint", params)
|
|
304
|
+
|
|
305
|
+
def burns(
|
|
306
|
+
self,
|
|
307
|
+
symbol0: str | None = None,
|
|
308
|
+
symbol1: str | None = None,
|
|
309
|
+
fee: int | None = None,
|
|
310
|
+
) -> AsyncQueryBuilder:
|
|
311
|
+
"""Start a query for Uniswap V3 burn events."""
|
|
312
|
+
params: dict[str, Any] = {}
|
|
313
|
+
if symbol0:
|
|
314
|
+
params["symbol0"] = symbol0
|
|
315
|
+
if symbol1:
|
|
316
|
+
params["symbol1"] = symbol1
|
|
317
|
+
if fee:
|
|
318
|
+
params["fee"] = fee
|
|
319
|
+
return AsyncQueryBuilder(self._client, "/uniswap/events/burn", params)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
class AsyncLidoProtocol:
|
|
323
|
+
"""Async Lido events with builder pattern."""
|
|
324
|
+
|
|
325
|
+
def __init__(self, client: "BaseClient"):
|
|
326
|
+
self._client = client
|
|
327
|
+
|
|
328
|
+
def deposits(self) -> AsyncQueryBuilder:
|
|
329
|
+
"""Start a query for Lido deposit events."""
|
|
330
|
+
return AsyncQueryBuilder(self._client, "/lido/events/deposit")
|
|
331
|
+
|
|
332
|
+
def withdrawals(self) -> AsyncQueryBuilder:
|
|
333
|
+
"""Start a query for Lido withdrawal events."""
|
|
334
|
+
return AsyncQueryBuilder(self._client, "/lido/events/withdraw")
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
class AsyncStaderProtocol:
|
|
338
|
+
"""Async Stader events with builder pattern."""
|
|
339
|
+
|
|
340
|
+
def __init__(self, client: "BaseClient"):
|
|
341
|
+
self._client = client
|
|
342
|
+
|
|
343
|
+
def deposits(self) -> AsyncQueryBuilder:
|
|
344
|
+
"""Start a query for Stader deposit events."""
|
|
345
|
+
return AsyncQueryBuilder(self._client, "/stader/events/deposit")
|
|
346
|
+
|
|
347
|
+
def withdrawals(self) -> AsyncQueryBuilder:
|
|
348
|
+
"""Start a query for Stader withdrawal events."""
|
|
349
|
+
return AsyncQueryBuilder(self._client, "/stader/events/withdraw")
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
class AsyncThresholdProtocol:
|
|
353
|
+
"""Async Threshold events with builder pattern."""
|
|
354
|
+
|
|
355
|
+
def __init__(self, client: "BaseClient"):
|
|
356
|
+
self._client = client
|
|
357
|
+
|
|
358
|
+
def mints(self) -> AsyncQueryBuilder:
|
|
359
|
+
"""Start a query for tBTC mint events."""
|
|
360
|
+
return AsyncQueryBuilder(self._client, "/threshold/events/mint")
|
|
361
|
+
|
|
362
|
+
def burns(self) -> AsyncQueryBuilder:
|
|
363
|
+
"""Start a query for tBTC burn events."""
|
|
364
|
+
return AsyncQueryBuilder(self._client, "/threshold/events/burn")
|
defistream/py.typed
ADDED
|
File without changes
|