helius-python 0.3.2__py3-none-any.whl → 0.3.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.
@@ -1,11 +1,12 @@
1
1
  import json
2
2
  from os import environ
3
- from typing import Annotated, Literal, TypedDict
3
+ from typing import Annotated, Literal
4
4
 
5
5
  import httpx
6
6
  from dotenv import dotenv_values
7
7
  from pydantic import AliasGenerator, BaseModel, ConfigDict, Field, model_validator
8
8
  from pydantic.alias_generators import to_camel
9
+ from typing_extensions import TypedDict
9
10
  from websockets.sync.client import connect
10
11
 
11
12
  from helius.rpc import JsonRpcRequest
@@ -25,7 +25,12 @@ from helius.solana_rpc.models import (
25
25
  TokenAccountBalance,
26
26
  TokenSupply,
27
27
  Transaction,
28
+ TransactionFilters,
29
+ TransactionFullDetail,
28
30
  TransactionSignature,
31
+ TransactionSignaturesDetail,
32
+ Transfer,
33
+ TransferFilters,
29
34
  VotingAccount,
30
35
  )
31
36
 
@@ -983,3 +988,83 @@ class SolanaRpcClient:
983
988
  )
984
989
  response = self._send(request)
985
990
  return response["result"]
991
+
992
+ @validate_call
993
+ def get_transactions_for_address(
994
+ self,
995
+ *,
996
+ address: str,
997
+ transaction_details: Literal["signatures", "full"] | None = None,
998
+ sort_order: Literal["asc", "desc"] | None = None,
999
+ commitment: Literal["confirmed", "finalized"] | None = None,
1000
+ min_context_slot: int | None = None,
1001
+ limit: Annotated[int, Field(ge=1, le=1000)] | None = None,
1002
+ pagination_token: str | None = None,
1003
+ encoding: Literal["json", "jsonParsed", "base58", "base64"] | None = None,
1004
+ max_supported_transaction_version: int | None = None,
1005
+ filters: TransactionFilters | None = None,
1006
+ ) -> tuple[
1007
+ list[TransactionSignaturesDetail] | list[TransactionFullDetail], str | None
1008
+ ]:
1009
+ request = (
1010
+ JsonRpcRequest(method="getTransactionsForAddress")
1011
+ .add(address)
1012
+ .set("transactionDetails", transaction_details)
1013
+ .set("sortOrder", sort_order)
1014
+ .set("commitment", commitment)
1015
+ .set("minContextSlot", min_context_slot)
1016
+ .set("limit", limit)
1017
+ .set("paginationToken", pagination_token)
1018
+ .set("encoding", encoding)
1019
+ .set("maxSupportedTransactionVersion", max_supported_transaction_version)
1020
+ .set("filters", filters)
1021
+ .build()
1022
+ )
1023
+ response = self._send(request)
1024
+ pagination_token = response["result"]["paginationToken"]
1025
+ data = response["result"]["data"]
1026
+ ta = TypeAdapter(
1027
+ list[TransactionSignaturesDetail]
1028
+ if transaction_details == "signatures"
1029
+ else list[TransactionFullDetail]
1030
+ )
1031
+ transactions = ta.validate_python(data)
1032
+ return transactions, pagination_token
1033
+
1034
+ @validate_call
1035
+ def get_transfers_by_address(
1036
+ self,
1037
+ *,
1038
+ address: str,
1039
+ with_address: str | None = None,
1040
+ direction: Literal["in", "out", "any"] | None = None,
1041
+ mint: str | None = None,
1042
+ sol_mode: Literal["merged", "separate"] | None = None,
1043
+ filters: TransferFilters | None = None,
1044
+ limit: Annotated[int, Field(ge=1, le=100)] | None = None,
1045
+ pagination_token: str | None = None,
1046
+ commitment: Literal["finalized", "confirmed"] | None = None,
1047
+ min_context_slot: int | None = None,
1048
+ sort_order: Literal["asc", "desc"] | None = None,
1049
+ ) -> tuple[list[Transfer], str | None]:
1050
+ request = (
1051
+ JsonRpcRequest(method="getTransfersByAddress")
1052
+ .add(address)
1053
+ .set("with", with_address)
1054
+ .set("direction", direction)
1055
+ .set("mint", mint)
1056
+ .set("solMode", sol_mode)
1057
+ .set("filters", filters)
1058
+ .set("limit", limit)
1059
+ .set("paginationToken", pagination_token)
1060
+ .set("commitment", commitment)
1061
+ .set("minContextSlot", min_context_slot)
1062
+ .set("sortOrder", sort_order)
1063
+ .build()
1064
+ )
1065
+ response = self._send(request)
1066
+ pagination_token = response["result"]["paginationToken"]
1067
+ data = response["result"]["data"]
1068
+ ta = TypeAdapter(list[Transfer])
1069
+ transfers = ta.validate_python(data)
1070
+ return transfers, pagination_token
@@ -2,6 +2,9 @@ from typing import Literal
2
2
 
3
3
  from pydantic import AliasGenerator, BaseModel, ConfigDict
4
4
  from pydantic.alias_generators import to_camel
5
+ from typing_extensions import TypedDict
6
+
7
+ # TODO: Improve camelCase <-> snake_case
5
8
 
6
9
 
7
10
  class Account(BaseModel):
@@ -221,3 +224,98 @@ class Transaction(BaseModel):
221
224
  meta: TransactionMetadata | None
222
225
  transaction: dict | list
223
226
  version: Literal["legacy"] | int | None = None
227
+
228
+
229
+ class RangeFilter(TypedDict, total=False):
230
+ gt: int
231
+ gte: int
232
+ lt: int
233
+ lte: int
234
+
235
+
236
+ class ComparisonFilter(TypedDict, total=False):
237
+ gte: int
238
+ gt: int
239
+ lte: int
240
+ lt: int
241
+ eq: int
242
+
243
+
244
+ TokenTransferFilter = TypedDict(
245
+ "TokenTransferFilter",
246
+ {
247
+ "with": str,
248
+ "direction": Literal["in", "out", "any"],
249
+ "mint": str,
250
+ "amount": RangeFilter,
251
+ },
252
+ total=False,
253
+ )
254
+
255
+
256
+ class TransactionFilters(TypedDict, total=False):
257
+ slot: RangeFilter
258
+ blockTime: ComparisonFilter
259
+ signature: RangeFilter
260
+ status: Literal["succeeded", "failed", "any"]
261
+ tokenAccounts: Literal["none", "balanceChanged", "all"]
262
+ tokenTransfer: TokenTransferFilter
263
+
264
+
265
+ class TransferFilters(TypedDict, total=False):
266
+ amount: RangeFilter
267
+ blockTime: RangeFilter
268
+ slot: RangeFilter
269
+
270
+
271
+ class Transfer(BaseModel):
272
+ model_config = ConfigDict(alias_generator=AliasGenerator(validation_alias=to_camel))
273
+
274
+ signature: str
275
+ slot: int
276
+ block_time: int
277
+ type: Literal[
278
+ "transfer",
279
+ "mint",
280
+ "burn",
281
+ "wrap",
282
+ "unwrap",
283
+ "changeOwner",
284
+ "withdrawWithheldFee",
285
+ ]
286
+ from_user_account: str | None
287
+ to_user_account: str | None
288
+ mint: str
289
+ amount: str
290
+ decimals: int
291
+ ui_amount: str
292
+ confirmation_status: Literal["finalized", "confirmed"]
293
+ transaction_idx: int
294
+ instruction_idx: int
295
+ inner_instruction_idx: int
296
+ from_token_account: str | None = None
297
+ to_token_account: str | None = None
298
+ fee_amount: str | None = None
299
+ fee_ui_amount: str | None = None
300
+
301
+
302
+ class TransactionSignaturesDetail(BaseModel):
303
+ model_config = ConfigDict(alias_generator=AliasGenerator(validation_alias=to_camel))
304
+
305
+ signature: str
306
+ slot: int
307
+ transaction_index: int
308
+ err: dict | None
309
+ memo: str | None
310
+ block_time: int | None
311
+ confirmation_status: Literal["finalized", "confirmed"] | None
312
+
313
+
314
+ class TransactionFullDetail(BaseModel):
315
+ model_config = ConfigDict(alias_generator=AliasGenerator(validation_alias=to_camel))
316
+
317
+ slot: int
318
+ transaction_index: int
319
+ transaction: dict
320
+ meta: dict | list
321
+ block_time: int | None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: helius-python
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Typed Python client for the Helius API
5
5
  Project-URL: Homepage, https://github.com/markosnarinian/helius-python
6
6
  Project-URL: Issues, https://github.com/markosnarinian/helius-python/issues
@@ -13,6 +13,7 @@ Requires-Python: >=3.10
13
13
  Requires-Dist: httpx
14
14
  Requires-Dist: pydantic
15
15
  Requires-Dist: python-dotenv
16
+ Requires-Dist: typing-extensions
16
17
  Requires-Dist: websockets
17
18
  Provides-Extra: dev
18
19
  Requires-Dist: pytest; extra == 'dev'
@@ -322,6 +323,8 @@ continuously.
322
323
  | `minimumLedgerSlot` | `minimum_ledger_slot()` | [guide](https://www.helius.dev/docs/rpc/guides/minimumledgerslot), [reference](https://www.helius.dev/docs/api-reference/rpc/http/minimumledgerslot) |
323
324
  | `requestAirdrop` | `request_airdrop(...)` | [guide](https://www.helius.dev/docs/rpc/guides/requestairdrop), [reference](https://www.helius.dev/docs/api-reference/rpc/http/requestairdrop) |
324
325
  | `sendTransaction` | `send_transaction(...)` | [guide](https://www.helius.dev/docs/rpc/guides/sendtransaction), [reference](https://www.helius.dev/docs/api-reference/rpc/http/sendtransaction) |
326
+ | `getTransactionsForAddress` | `get_transactions_for_address(...)` | [reference](https://www.helius.dev/docs/api-reference/rpc/http/gettransactionsforaddress) |
327
+ | `getTransfersByAddress` | `get_transfers_by_address(...)` | [guide](https://www.helius.dev/docs/rpc/gettransfersbyaddress), [reference](https://www.helius.dev/docs/api-reference/rpc/http/gettransfersbyaddress) |
325
328
 
326
329
  ## WebSocket subscriptions
327
330
 
@@ -1,13 +1,13 @@
1
1
  helius/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  helius/admin/__init__.py,sha256=HboRJXZNzuDAc6r3kj2QZtEcu2U3EWJHv81dYDJGjaA,262
3
3
  helius/admin/admin.py,sha256=dcmOgeu10Q43QZC8K-a25vp2JNAb4hs5gu3YWaovV4Y,2541
4
- helius/laserstream/websockets.py,sha256=ASAltIRlfWKgjkAwox8xbYqULsU6GtJd7TN_nX_F8jA,12417
4
+ helius/laserstream/websockets.py,sha256=MX_3stOzo6EyYJVSlE_zHFNesZkQIfAv2R1e5qdr9b0,12446
5
5
  helius/rpc/__init__.py,sha256=ciwM1KfBNyZwCeqOmlWTcSrUD03cbrzgeeEZsn9msi0,85
6
6
  helius/rpc/json_rpc_request.py,sha256=hm7WkPo0CnwMnuHE4qR-d93wGArZRPRm-B3uueykL3E,1479
7
7
  helius/solana_rpc/__init__.py,sha256=Mfhb6ibrCqAX6AchtL3ViBlpCi9RKP8uhT9e_S5_Wb0,1006
8
- helius/solana_rpc/client.py,sha256=8WDsBqFYlRcnAYiGB2_gPOm3UuQSSV4JlEY9qwpr63s,34116
9
- helius/solana_rpc/models.py,sha256=ywzdyUNrJ4mPxwjuntsmJT-tBcHE64pkG96--jKAgIw,5474
10
- helius_python-0.3.2.dist-info/METADATA,sha256=LoNeXjpFpa8E6MoSWto3zmBZKaYDUQ1HxundTYDjis4,34382
11
- helius_python-0.3.2.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
12
- helius_python-0.3.2.dist-info/licenses/LICENSE,sha256=bZc2EDmq_GsWH77uK8LBn1kqqrOPcp2f9p-ys9bYa1E,1072
13
- helius_python-0.3.2.dist-info/RECORD,,
8
+ helius/solana_rpc/client.py,sha256=dNB5rrOPF1O-wwxmDe3dfjLNSTxB_TT8RUNw-g0XRIQ,37503
9
+ helius/solana_rpc/models.py,sha256=tQmuWi1frDxvQeBSG2ald6Ze2KsaUQQOry45L41MbnQ,7724
10
+ helius_python-0.3.3.dist-info/METADATA,sha256=1ig_sGPRg_mu8adNqPAbBDeiHOe4cOYMFKBjEoz8lMc,34957
11
+ helius_python-0.3.3.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
12
+ helius_python-0.3.3.dist-info/licenses/LICENSE,sha256=bZc2EDmq_GsWH77uK8LBn1kqqrOPcp2f9p-ys9bYa1E,1072
13
+ helius_python-0.3.3.dist-info/RECORD,,