mm-sol 0.5.3__tar.gz → 0.5.5__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.
Files changed (54) hide show
  1. mm_sol-0.5.5/PKG-INFO +11 -0
  2. {mm_sol-0.5.3 → mm_sol-0.5.5}/README.md +3 -0
  3. {mm_sol-0.5.3 → mm_sol-0.5.5}/pyproject.toml +10 -9
  4. mm_sol-0.5.5/src/mm_sol/async_rpc.py +42 -0
  5. mm_sol-0.5.5/src/mm_sol/balance.py +161 -0
  6. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/rpc.py +13 -13
  7. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/utils.py +11 -0
  8. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/conftest.py +6 -1
  9. mm_sol-0.5.5/tests/test_async_rpc.py +10 -0
  10. mm_sol-0.5.5/tests/test_balance.py +25 -0
  11. {mm_sol-0.5.3 → mm_sol-0.5.5}/uv.lock +122 -116
  12. mm_sol-0.5.3/PKG-INFO +0 -11
  13. mm_sol-0.5.3/src/mm_sol/balance.py +0 -86
  14. mm_sol-0.5.3/tests/test_balance.py +0 -6
  15. {mm_sol-0.5.3 → mm_sol-0.5.5}/.env.example +0 -0
  16. {mm_sol-0.5.3 → mm_sol-0.5.5}/.gitignore +0 -0
  17. {mm_sol-0.5.3 → mm_sol-0.5.5}/dict.dic +0 -0
  18. {mm_sol-0.5.3 → mm_sol-0.5.5}/justfile +0 -0
  19. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/__init__.py +0 -0
  20. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/account.py +0 -0
  21. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/block.py +0 -0
  22. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/__init__.py +0 -0
  23. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/calcs.py +0 -0
  24. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cli.py +0 -0
  25. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cli_utils.py +0 -0
  26. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/__init__.py +0 -0
  27. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/balance_cmd.py +0 -0
  28. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/balances_cmd.py +0 -0
  29. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/example_cmd.py +0 -0
  30. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/node_cmd.py +0 -0
  31. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/transfer_cmd.py +0 -0
  32. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/wallet/__init__.py +0 -0
  33. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/wallet/keypair_cmd.py +0 -0
  34. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/wallet/mnemonic_cmd.py +0 -0
  35. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/examples/balances.toml +0 -0
  36. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/examples/transfer.toml +0 -0
  37. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/validators.py +0 -0
  38. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/constants.py +0 -0
  39. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/converters.py +0 -0
  40. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/py.typed +0 -0
  41. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/solana_cli.py +0 -0
  42. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/token.py +0 -0
  43. {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/transfer.py +0 -0
  44. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/__init__.py +0 -0
  45. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/__init__.py +0 -0
  46. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/cmd/__init__.py +0 -0
  47. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/cmd/wallet/__init__.py +0 -0
  48. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/cmd/wallet/test_keypair_cmd.py +0 -0
  49. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/cmd/wallet/test_mnemonic_cmd.py +0 -0
  50. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/test_account.py +0 -0
  51. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/test_client.py +0 -0
  52. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/test_converters.py +0 -0
  53. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/test_rpc.py +0 -0
  54. {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/test_token.py +0 -0
mm_sol-0.5.5/PKG-INFO ADDED
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.4
2
+ Name: mm-sol
3
+ Version: 0.5.5
4
+ Requires-Python: >=3.12
5
+ Requires-Dist: base58~=2.1.1
6
+ Requires-Dist: jinja2>=3.1.6
7
+ Requires-Dist: mm-crypto-utils>=0.2.9
8
+ Requires-Dist: mnemonic==0.21
9
+ Requires-Dist: socksio>=1.0.0
10
+ Requires-Dist: solana~=0.36.6
11
+ Requires-Dist: typer>=0.15.2
@@ -8,3 +8,6 @@ sudo curl -LsSf https://astral.sh/uv/install.sh | sh
8
8
  source $HOME/.local/bin/env
9
9
  uv tool install mm-sol
10
10
  ```
11
+
12
+ ### Notes
13
+ - AsyncClient from solana-py with socks5 proxy ignores timeout. Use http proxy.
@@ -1,16 +1,16 @@
1
1
  [project]
2
2
  name = "mm-sol"
3
- version = "0.5.3"
3
+ version = "0.5.5"
4
4
  description = ""
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
7
- "mm-crypto-utils>=0.2.6",
8
- "solana~=0.36.5",
9
- "solders~=0.23.0",
7
+ "mm-crypto-utils>=0.2.9",
8
+ "solana~=0.36.6",
10
9
  "base58~=2.1.1",
11
10
  "mnemonic==0.21",
12
- "typer>=0.15.1",
13
- "jinja2>=3.1.5",
11
+ "typer>=0.15.2",
12
+ "jinja2>=3.1.6",
13
+ "socksio>=1.0.0",
14
14
  ]
15
15
  [project.scripts]
16
16
  mm-sol = "mm_sol.cli.cli:app"
@@ -21,11 +21,11 @@ build-backend = "hatchling.build"
21
21
 
22
22
  [tool.uv]
23
23
  dev-dependencies = [
24
- "pytest~=8.3.4",
24
+ "pytest~=8.3.5",
25
25
  "pytest-xdist~=3.6.1",
26
- "ruff~=0.9.6",
26
+ "ruff~=0.11.2",
27
27
  "pip-audit~=2.8.0",
28
- "bandit~=1.8.2",
28
+ "bandit~=1.8.3",
29
29
  "mypy~=1.15.0",
30
30
  ]
31
31
 
@@ -64,6 +64,7 @@ ignore = [
64
64
  "TD003", # flake8-todos: missing-todo-link
65
65
  "RET503", # flake8-return: implicit-return
66
66
  "COM812", # it's used in ruff formatter
67
+ "ASYNC109", # flake8-async: async-function-with-timeout
67
68
  ]
68
69
  [tool.ruff.lint.pep8-naming]
69
70
  classmethod-decorators = ["field_validator"]
@@ -0,0 +1,42 @@
1
+ from typing import Any
2
+
3
+ from mm_std import Result, ahr
4
+
5
+
6
+ async def rpc_call(
7
+ *,
8
+ node: str,
9
+ method: str,
10
+ params: list[Any],
11
+ id_: int = 1,
12
+ timeout: float = 10,
13
+ proxy: str | None = None,
14
+ ) -> Result[Any]:
15
+ data = {"jsonrpc": "2.0", "method": method, "params": params, "id": id_}
16
+ if node.startswith("http"):
17
+ return await _http_call(node, data, timeout, proxy)
18
+ raise NotImplementedError("ws is not implemented")
19
+
20
+
21
+ async def _http_call(node: str, data: dict[str, object], timeout: float, proxy: str | None) -> Result[Any]:
22
+ res = await ahr(node, method="POST", proxy=proxy, timeout=timeout, params=data, json_params=True)
23
+ try:
24
+ if res.is_error():
25
+ return res.to_err_result()
26
+
27
+ err = res.json.get("error", {}).get("message", "")
28
+ if err:
29
+ return res.to_err_result(f"service_error: {err}")
30
+ if "result" in res.json:
31
+ return res.to_ok_result(res.json["result"])
32
+
33
+ return res.to_err_result("unknown_response")
34
+ except Exception as e:
35
+ return res.to_err_result(f"exception: {e!s}")
36
+
37
+
38
+ async def get_balance(node: str, address: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
39
+ """Returns balance in lamports"""
40
+ return (await rpc_call(node=node, method="getBalance", params=[address], timeout=timeout, proxy=proxy)).and_then(
41
+ lambda r: r["value"]
42
+ )
@@ -0,0 +1,161 @@
1
+ import httpx
2
+ from mm_crypto_utils import Nodes, Proxies, random_node, random_proxy
3
+ from mm_std import Err, Ok, Result
4
+ from solana.exceptions import SolanaRpcException
5
+ from solana.rpc.core import RPCException
6
+ from solders.pubkey import Pubkey
7
+ from solders.rpc.errors import InvalidParamsMessage
8
+ from spl.token.instructions import get_associated_token_address
9
+
10
+ from mm_sol import async_rpc, rpc
11
+ from mm_sol.utils import get_async_client, get_client
12
+
13
+
14
+ def get_sol_balance(node: str, address: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
15
+ return rpc.get_balance(node, address, timeout, proxy)
16
+
17
+
18
+ async def get_sol_balance_async(node: str, address: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
19
+ return await async_rpc.get_balance(node, address, timeout, proxy)
20
+
21
+
22
+ def get_sol_balance_with_retries(
23
+ nodes: Nodes, address: str, retries: int, timeout: float = 10, proxies: Proxies = None
24
+ ) -> Result[int]:
25
+ res: Result[int] = Err("not started yet")
26
+ for _ in range(retries):
27
+ res = get_sol_balance(random_node(nodes), address, timeout=timeout, proxy=random_proxy(proxies))
28
+ if res.is_ok():
29
+ return res
30
+ return res
31
+
32
+
33
+ async def get_sol_balance_with_retries_async(
34
+ nodes: Nodes, address: str, retries: int, timeout: float = 10, proxies: Proxies = None
35
+ ) -> Result[int]:
36
+ res: Result[int] = Err("not started yet")
37
+ for _ in range(retries):
38
+ res = await get_sol_balance_async(random_node(nodes), address, timeout=timeout, proxy=random_proxy(proxies))
39
+ if res.is_ok():
40
+ return res
41
+ return res
42
+
43
+
44
+ def get_token_balance(
45
+ node: str,
46
+ owner_address: str,
47
+ token_mint_address: str,
48
+ token_account: str | None = None,
49
+ timeout: float = 10,
50
+ proxy: str | None = None,
51
+ ) -> Result[int]:
52
+ try:
53
+ client = get_client(node, proxy=proxy, timeout=timeout)
54
+ if not token_account:
55
+ token_account = str(
56
+ get_associated_token_address(Pubkey.from_string(owner_address), Pubkey.from_string(token_mint_address))
57
+ )
58
+
59
+ res = client.get_token_account_balance(Pubkey.from_string(token_account))
60
+
61
+ # Sometimes it not raise an error, but it returns this :(
62
+ if isinstance(res, InvalidParamsMessage) and "could not find account" in res.message:
63
+ return Ok(0)
64
+ return Ok(int(res.value.amount), data=res.to_json())
65
+ except RPCException as e:
66
+ if len(e.args) > 1:
67
+ s = e.args[0]
68
+ if isinstance(s, InvalidParamsMessage) and "could not find account" in s.message:
69
+ return Ok(0)
70
+ return Err(e)
71
+ except httpx.HTTPStatusError as e:
72
+ return Err(f"http error: {e}")
73
+ except SolanaRpcException as e:
74
+ return Err(e.error_msg)
75
+ except Exception as e:
76
+ return Err(e)
77
+
78
+
79
+ async def get_token_balance_async(
80
+ node: str,
81
+ owner_address: str,
82
+ token_mint_address: str,
83
+ token_account: str | None = None,
84
+ timeout: float = 10,
85
+ proxy: str | None = None,
86
+ ) -> Result[int]:
87
+ try:
88
+ client = get_async_client(node, proxy=proxy, timeout=timeout)
89
+ if not token_account:
90
+ token_account = str(
91
+ get_associated_token_address(Pubkey.from_string(owner_address), Pubkey.from_string(token_mint_address))
92
+ )
93
+
94
+ res = await client.get_token_account_balance(Pubkey.from_string(token_account))
95
+
96
+ # Sometimes it not raise an error, but it returns this :(
97
+ if isinstance(res, InvalidParamsMessage) and "could not find account" in res.message:
98
+ return Ok(0)
99
+ return Ok(int(res.value.amount), data=res.to_json())
100
+ except RPCException as e:
101
+ if len(e.args) > 1:
102
+ s = e.args[0]
103
+ if isinstance(s, InvalidParamsMessage) and "could not find account" in s.message:
104
+ return Ok(0)
105
+ return Err(e)
106
+ except httpx.HTTPStatusError as e:
107
+ return Err(f"http error: {e}")
108
+ except SolanaRpcException as e:
109
+ return Err(e.error_msg)
110
+ except Exception as e:
111
+ return Err(e)
112
+
113
+
114
+ def get_token_balance_with_retries(
115
+ nodes: Nodes,
116
+ owner_address: str,
117
+ token_mint_address: str,
118
+ retries: int,
119
+ token_account: str | None = None,
120
+ timeout: float = 10,
121
+ proxies: Proxies = None,
122
+ ) -> Result[int]:
123
+ res: Result[int] = Err("not started yet")
124
+ for _ in range(retries):
125
+ res = get_token_balance(
126
+ random_node(nodes),
127
+ owner_address,
128
+ token_mint_address,
129
+ token_account,
130
+ timeout=timeout,
131
+ proxy=random_proxy(proxies),
132
+ )
133
+ if res.is_ok():
134
+ return res
135
+
136
+ return res
137
+
138
+
139
+ async def get_token_balance_with_retries_async(
140
+ nodes: Nodes,
141
+ owner_address: str,
142
+ token_mint_address: str,
143
+ retries: int,
144
+ token_account: str | None = None,
145
+ timeout: float = 10,
146
+ proxies: Proxies = None,
147
+ ) -> Result[int]:
148
+ res: Result[int] = Err("not started yet")
149
+ for _ in range(retries):
150
+ res = await get_token_balance_async(
151
+ random_node(nodes),
152
+ owner_address,
153
+ token_mint_address,
154
+ token_account,
155
+ timeout=timeout,
156
+ proxy=random_proxy(proxies),
157
+ )
158
+ if res.is_ok():
159
+ return res
160
+
161
+ return res
@@ -78,7 +78,7 @@ def rpc_call(
78
78
  method: str,
79
79
  params: list[Any],
80
80
  id_: int = 1,
81
- timeout: int = 10,
81
+ timeout: float = 10,
82
82
  proxy: str | None = None,
83
83
  ) -> Result[Any]:
84
84
  data = {"jsonrpc": "2.0", "method": method, "params": params, "id": id_}
@@ -87,7 +87,7 @@ def rpc_call(
87
87
  raise NotImplementedError("ws is not implemented")
88
88
 
89
89
 
90
- def _http_call(node: str, data: dict[str, object], timeout: int, proxy: str | None) -> Result[Any]:
90
+ def _http_call(node: str, data: dict[str, object], timeout: float, proxy: str | None) -> Result[Any]:
91
91
  res = hr(node, method="POST", proxy=proxy, timeout=timeout, params=data, json_params=True)
92
92
  try:
93
93
  if res.is_error():
@@ -104,38 +104,38 @@ def _http_call(node: str, data: dict[str, object], timeout: int, proxy: str | No
104
104
  return res.to_err_result(f"exception: {e!s}")
105
105
 
106
106
 
107
- def get_balance(node: str, address: str, timeout: int = 10, proxy: str | None = None) -> Result[int]:
107
+ def get_balance(node: str, address: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
108
108
  """Returns balance in lamports"""
109
109
  return rpc_call(node=node, method="getBalance", params=[address], timeout=timeout, proxy=proxy).and_then(lambda r: r["value"])
110
110
 
111
111
 
112
- def get_block_height(node: str, timeout: int = 10, proxy: str | None = None) -> Result[int]:
112
+ def get_block_height(node: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
113
113
  """Returns balance in lamports"""
114
114
  return rpc_call(node=node, method="getBlockHeight", params=[], timeout=timeout, proxy=proxy)
115
115
 
116
116
 
117
- def get_slot(node: str, timeout: int = 10, proxy: str | None = None) -> Result[int]:
117
+ def get_slot(node: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
118
118
  return rpc_call(node=node, method="getSlot", params=[], timeout=timeout, proxy=proxy)
119
119
 
120
120
 
121
- def get_epoch_info(node: str, epoch: int | None = None, timeout: int = 10, proxy: str | None = None) -> Result[EpochInfo]:
121
+ def get_epoch_info(node: str, epoch: int | None = None, timeout: float = 10, proxy: str | None = None) -> Result[EpochInfo]:
122
122
  params = [epoch] if epoch else []
123
123
  return rpc_call(node=node, method="getEpochInfo", params=params, timeout=timeout, proxy=proxy).and_then(
124
124
  lambda r: EpochInfo(**r),
125
125
  )
126
126
 
127
127
 
128
- def get_health(node: str, timeout: int = 10, proxy: str | None = None) -> Result[bool]:
128
+ def get_health(node: str, timeout: float = 10, proxy: str | None = None) -> Result[bool]:
129
129
  return rpc_call(node=node, method="getHealth", params=[], timeout=timeout, proxy=proxy).and_then(lambda r: r == "ok")
130
130
 
131
131
 
132
- def get_cluster_nodes(node: str, timeout: int = 30, proxy: str | None = None) -> Result[list[ClusterNode]]:
132
+ def get_cluster_nodes(node: str, timeout: float = 30, proxy: str | None = None) -> Result[list[ClusterNode]]:
133
133
  return rpc_call(node=node, method="getClusterNodes", timeout=timeout, proxy=proxy, params=[]).and_then(
134
134
  lambda r: [ClusterNode(**n) for n in r],
135
135
  )
136
136
 
137
137
 
138
- def get_vote_accounts(node: str, timeout: int = 30, proxy: str | None = None) -> Result[list[VoteAccount]]:
138
+ def get_vote_accounts(node: str, timeout: float = 30, proxy: str | None = None) -> Result[list[VoteAccount]]:
139
139
  res = rpc_call(node=node, method="getVoteAccounts", timeout=timeout, proxy=proxy, params=[])
140
140
  if res.is_err():
141
141
  return res
@@ -182,7 +182,7 @@ def get_vote_accounts(node: str, timeout: int = 30, proxy: str | None = None) ->
182
182
  def get_leader_scheduler(
183
183
  node: str,
184
184
  slot: int | None = None,
185
- timeout: int = 10,
185
+ timeout: float = 10,
186
186
  proxy: str | None = None,
187
187
  ) -> Result[dict[str, list[int]]]:
188
188
  return rpc_call(
@@ -194,7 +194,7 @@ def get_leader_scheduler(
194
194
  )
195
195
 
196
196
 
197
- def get_block_production(node: str, timeout: int = 60, proxy: str | None = None) -> Result[BlockProduction]:
197
+ def get_block_production(node: str, timeout: float = 60, proxy: str | None = None) -> Result[BlockProduction]:
198
198
  res = rpc_call(node=node, method="getBlockProduction", timeout=timeout, proxy=proxy, params=[])
199
199
  if res.is_err():
200
200
  return res
@@ -211,7 +211,7 @@ def get_block_production(node: str, timeout: int = 60, proxy: str | None = None)
211
211
  return Err(e, data=res.data)
212
212
 
213
213
 
214
- def get_stake_activation(node: str, address: str, timeout: int = 60, proxy: str | None = None) -> Result[StakeActivation]:
214
+ def get_stake_activation(node: str, address: str, timeout: float = 60, proxy: str | None = None) -> Result[StakeActivation]:
215
215
  return rpc_call(node=node, method="getStakeActivation", timeout=timeout, proxy=proxy, params=[address]).and_then(
216
216
  lambda ok: StakeActivation(**ok),
217
217
  )
@@ -222,7 +222,7 @@ def get_transaction(
222
222
  signature: str,
223
223
  max_supported_transaction_version: int | None = None,
224
224
  encoding: str = "json",
225
- timeout: int = 60,
225
+ timeout: float = 60,
226
226
  proxy: str | None = None,
227
227
  ) -> Result[dict[str, object] | None]:
228
228
  if max_supported_transaction_version is not None:
@@ -1,4 +1,5 @@
1
1
  from solana.rpc.api import Client
2
+ from solana.rpc.async_api import AsyncClient
2
3
  from solana.rpc.commitment import Commitment
3
4
  from solders.pubkey import Pubkey
4
5
 
@@ -13,6 +14,16 @@ def get_client(
13
14
  return Client(endpoint, commitment=commitment, extra_headers=extra_headers, timeout=timeout, proxy=proxy)
14
15
 
15
16
 
17
+ def get_async_client(
18
+ endpoint: str,
19
+ commitment: Commitment | None = None,
20
+ extra_headers: dict[str, str] | None = None,
21
+ proxy: str | None = None,
22
+ timeout: float = 10,
23
+ ) -> AsyncClient:
24
+ return AsyncClient(endpoint, commitment=commitment, extra_headers=extra_headers, timeout=timeout, proxy=proxy)
25
+
26
+
16
27
  def pubkey(value: str | Pubkey) -> Pubkey:
17
28
  if isinstance(value, Pubkey):
18
29
  return value
@@ -5,7 +5,12 @@ import pytest
5
5
  from dotenv import load_dotenv
6
6
  from typer.testing import CliRunner
7
7
 
8
- load_dotenv(".env")
8
+ load_dotenv()
9
+
10
+
11
+ @pytest.fixture
12
+ def anyio_backend():
13
+ return "asyncio"
9
14
 
10
15
 
11
16
  @pytest.fixture
@@ -0,0 +1,10 @@
1
+ import pytest
2
+
3
+ from mm_sol import async_rpc
4
+
5
+ pytestmark = pytest.mark.anyio
6
+
7
+
8
+ async def test_get_balance(mainnet_node, binance_wallet, random_proxy):
9
+ res = await async_rpc.get_balance(mainnet_node, binance_wallet, proxy=random_proxy)
10
+ assert res.unwrap() > 10_000_000
@@ -0,0 +1,25 @@
1
+ import pytest
2
+
3
+ from mm_sol.balance import get_sol_balance, get_sol_balance_async, get_token_balance, get_token_balance_async
4
+
5
+ pytestmark = pytest.mark.anyio
6
+
7
+
8
+ def test_get_sol_balance(mainnet_node, usdt_owner_address, random_proxy):
9
+ res = get_sol_balance(mainnet_node, usdt_owner_address, proxy=random_proxy)
10
+ assert res.unwrap() > 10
11
+
12
+
13
+ async def test_get_sol_balance_async(mainnet_node, usdt_owner_address, random_proxy):
14
+ res = await get_sol_balance_async(mainnet_node, usdt_owner_address, proxy=random_proxy)
15
+ assert res.unwrap() > 10
16
+
17
+
18
+ def test_get_token_balance(mainnet_node, binance_wallet, usdt_token_address, random_proxy):
19
+ res = get_token_balance(mainnet_node, binance_wallet, usdt_token_address, proxy=random_proxy)
20
+ assert res.unwrap() > 10
21
+
22
+
23
+ async def test_get_token_balance_async(mainnet_node, binance_wallet, usdt_token_address, random_proxy):
24
+ res = await get_token_balance_async(mainnet_node, binance_wallet, usdt_token_address, proxy=random_proxy)
25
+ assert res.unwrap() > 10
@@ -13,20 +13,21 @@ wheels = [
13
13
 
14
14
  [[package]]
15
15
  name = "anyio"
16
- version = "4.6.2.post1"
16
+ version = "4.9.0"
17
17
  source = { registry = "https://pypi.org/simple" }
18
18
  dependencies = [
19
19
  { name = "idna" },
20
20
  { name = "sniffio" },
21
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
21
22
  ]
22
- sdist = { url = "https://files.pythonhosted.org/packages/9f/09/45b9b7a6d4e45c6bcb5bf61d19e3ab87df68e0601fa8c5293de3542546cc/anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c", size = 173422 }
23
+ sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 }
23
24
  wheels = [
24
- { url = "https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d", size = 90377 },
25
+ { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 },
25
26
  ]
26
27
 
27
28
  [[package]]
28
29
  name = "bandit"
29
- version = "1.8.2"
30
+ version = "1.8.3"
30
31
  source = { registry = "https://pypi.org/simple" }
31
32
  dependencies = [
32
33
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -34,9 +35,9 @@ dependencies = [
34
35
  { name = "rich" },
35
36
  { name = "stevedore" },
36
37
  ]
37
- sdist = { url = "https://files.pythonhosted.org/packages/9b/e2/c229cdb4eefc124e5b77ac2557eb0a3cb5b9fc89bc465dd2b8dc1033dbb8/bandit-1.8.2.tar.gz", hash = "sha256:e00ad5a6bc676c0954669fe13818024d66b70e42cf5adb971480cf3b671e835f", size = 4228832 }
38
+ sdist = { url = "https://files.pythonhosted.org/packages/1a/a5/144a45f8e67df9d66c3bc3f7e69a39537db8bff1189ab7cff4e9459215da/bandit-1.8.3.tar.gz", hash = "sha256:f5847beb654d309422985c36644649924e0ea4425c76dec2e89110b87506193a", size = 4232005 }
38
39
  wheels = [
39
- { url = "https://files.pythonhosted.org/packages/1c/c1/991a7a1404626558cc7db0cc34243e13e5e336eba053bf6979e9fd6006f7/bandit-1.8.2-py3-none-any.whl", hash = "sha256:df6146ad73dd30e8cbda4e29689ddda48364e36ff655dbfc86998401fcf1721f", size = 127049 },
40
+ { url = "https://files.pythonhosted.org/packages/88/85/db74b9233e0aa27ec96891045c5e920a64dd5cbccd50f8e64e9460f48d35/bandit-1.8.3-py3-none-any.whl", hash = "sha256:28f04dc0d258e1dd0f99dee8eefa13d1cb5e3fde1a5ab0c523971f97b289bcd8", size = 129078 },
40
41
  ]
41
42
 
42
43
  [[package]]
@@ -197,37 +198,37 @@ wheels = [
197
198
 
198
199
  [[package]]
199
200
  name = "cryptography"
200
- version = "44.0.1"
201
+ version = "44.0.2"
201
202
  source = { registry = "https://pypi.org/simple" }
202
203
  dependencies = [
203
204
  { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
204
205
  ]
205
- sdist = { url = "https://files.pythonhosted.org/packages/c7/67/545c79fe50f7af51dbad56d16b23fe33f63ee6a5d956b3cb68ea110cbe64/cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14", size = 710819 }
206
- wheels = [
207
- { url = "https://files.pythonhosted.org/packages/72/27/5e3524053b4c8889da65cf7814a9d0d8514a05194a25e1e34f46852ee6eb/cryptography-44.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf688f615c29bfe9dfc44312ca470989279f0e94bb9f631f85e3459af8efc009", size = 6642022 },
208
- { url = "https://files.pythonhosted.org/packages/34/b9/4d1fa8d73ae6ec350012f89c3abfbff19fc95fe5420cf972e12a8d182986/cryptography-44.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7c7e2d71d908dc0f8d2027e1604102140d84b155e658c20e8ad1304317691f", size = 3943865 },
209
- { url = "https://files.pythonhosted.org/packages/6e/57/371a9f3f3a4500807b5fcd29fec77f418ba27ffc629d88597d0d1049696e/cryptography-44.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887143b9ff6bad2b7570da75a7fe8bbf5f65276365ac259a5d2d5147a73775f2", size = 4162562 },
210
- { url = "https://files.pythonhosted.org/packages/c5/1d/5b77815e7d9cf1e3166988647f336f87d5634a5ccecec2ffbe08ef8dd481/cryptography-44.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:322eb03ecc62784536bc173f1483e76747aafeb69c8728df48537eb431cd1911", size = 3951923 },
211
- { url = "https://files.pythonhosted.org/packages/28/01/604508cd34a4024467cd4105887cf27da128cba3edd435b54e2395064bfb/cryptography-44.0.1-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:21377472ca4ada2906bc313168c9dc7b1d7ca417b63c1c3011d0c74b7de9ae69", size = 3685194 },
212
- { url = "https://files.pythonhosted.org/packages/c6/3d/d3c55d4f1d24580a236a6753902ef6d8aafd04da942a1ee9efb9dc8fd0cb/cryptography-44.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df978682c1504fc93b3209de21aeabf2375cb1571d4e61907b3e7a2540e83026", size = 4187790 },
213
- { url = "https://files.pythonhosted.org/packages/ea/a6/44d63950c8588bfa8594fd234d3d46e93c3841b8e84a066649c566afb972/cryptography-44.0.1-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:eb3889330f2a4a148abead555399ec9a32b13b7c8ba969b72d8e500eb7ef84cd", size = 3951343 },
214
- { url = "https://files.pythonhosted.org/packages/c1/17/f5282661b57301204cbf188254c1a0267dbd8b18f76337f0a7ce1038888c/cryptography-44.0.1-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6a85a93d0642bd774460a86513c5d9d80b5c002ca9693e63f6e540f1815ed0", size = 4187127 },
215
- { url = "https://files.pythonhosted.org/packages/f3/68/abbae29ed4f9d96596687f3ceea8e233f65c9645fbbec68adb7c756bb85a/cryptography-44.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6f76fdd6fd048576a04c5210d53aa04ca34d2ed63336d4abd306d0cbe298fddf", size = 4070666 },
216
- { url = "https://files.pythonhosted.org/packages/0f/10/cf91691064a9e0a88ae27e31779200b1505d3aee877dbe1e4e0d73b4f155/cryptography-44.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6c8acf6f3d1f47acb2248ec3ea261171a671f3d9428e34ad0357148d492c7864", size = 4288811 },
217
- { url = "https://files.pythonhosted.org/packages/38/78/74ea9eb547d13c34e984e07ec8a473eb55b19c1451fe7fc8077c6a4b0548/cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a", size = 2771882 },
218
- { url = "https://files.pythonhosted.org/packages/cf/6c/3907271ee485679e15c9f5e93eac6aa318f859b0aed8d369afd636fafa87/cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00", size = 3206989 },
219
- { url = "https://files.pythonhosted.org/packages/9f/f1/676e69c56a9be9fd1bffa9bc3492366901f6e1f8f4079428b05f1414e65c/cryptography-44.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a2d8a7045e1ab9b9f803f0d9531ead85f90c5f2859e653b61497228b18452008", size = 6643714 },
220
- { url = "https://files.pythonhosted.org/packages/ba/9f/1775600eb69e72d8f9931a104120f2667107a0ee478f6ad4fe4001559345/cryptography-44.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8272f257cf1cbd3f2e120f14c68bff2b6bdfcc157fafdee84a1b795efd72862", size = 3943269 },
221
- { url = "https://files.pythonhosted.org/packages/25/ba/e00d5ad6b58183829615be7f11f55a7b6baa5a06910faabdc9961527ba44/cryptography-44.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8d181e90a777b63f3f0caa836844a1182f1f265687fac2115fcf245f5fbec3", size = 4166461 },
222
- { url = "https://files.pythonhosted.org/packages/b3/45/690a02c748d719a95ab08b6e4decb9d81e0ec1bac510358f61624c86e8a3/cryptography-44.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:436df4f203482f41aad60ed1813811ac4ab102765ecae7a2bbb1dbb66dcff5a7", size = 3950314 },
223
- { url = "https://files.pythonhosted.org/packages/e6/50/bf8d090911347f9b75adc20f6f6569ed6ca9b9bff552e6e390f53c2a1233/cryptography-44.0.1-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4f422e8c6a28cf8b7f883eb790695d6d45b0c385a2583073f3cec434cc705e1a", size = 3686675 },
224
- { url = "https://files.pythonhosted.org/packages/e1/e7/cfb18011821cc5f9b21efb3f94f3241e3a658d267a3bf3a0f45543858ed8/cryptography-44.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:72198e2b5925155497a5a3e8c216c7fb3e64c16ccee11f0e7da272fa93b35c4c", size = 4190429 },
225
- { url = "https://files.pythonhosted.org/packages/07/ef/77c74d94a8bfc1a8a47b3cafe54af3db537f081742ee7a8a9bd982b62774/cryptography-44.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a46a89ad3e6176223b632056f321bc7de36b9f9b93b2cc1cccf935a3849dc62", size = 3950039 },
226
- { url = "https://files.pythonhosted.org/packages/6d/b9/8be0ff57c4592382b77406269b1e15650c9f1a167f9e34941b8515b97159/cryptography-44.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:53f23339864b617a3dfc2b0ac8d5c432625c80014c25caac9082314e9de56f41", size = 4189713 },
227
- { url = "https://files.pythonhosted.org/packages/78/e1/4b6ac5f4100545513b0847a4d276fe3c7ce0eacfa73e3b5ebd31776816ee/cryptography-44.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:888fcc3fce0c888785a4876ca55f9f43787f4c5c1cc1e2e0da71ad481ff82c5b", size = 4071193 },
228
- { url = "https://files.pythonhosted.org/packages/3d/cb/afff48ceaed15531eab70445abe500f07f8f96af2bb35d98af6bfa89ebd4/cryptography-44.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:00918d859aa4e57db8299607086f793fa7813ae2ff5a4637e318a25ef82730f7", size = 4289566 },
229
- { url = "https://files.pythonhosted.org/packages/30/6f/4eca9e2e0f13ae459acd1ca7d9f0257ab86e68f44304847610afcb813dc9/cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9", size = 2772371 },
230
- { url = "https://files.pythonhosted.org/packages/d2/05/5533d30f53f10239616a357f080892026db2d550a40c393d0a8a7af834a9/cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f", size = 3207303 },
206
+ sdist = { url = "https://files.pythonhosted.org/packages/cd/25/4ce80c78963834b8a9fd1cc1266be5ed8d1840785c0f2e1b73b8d128d505/cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", size = 710807 }
207
+ wheels = [
208
+ { url = "https://files.pythonhosted.org/packages/92/ef/83e632cfa801b221570c5f58c0369db6fa6cef7d9ff859feab1aae1a8a0f/cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", size = 6676361 },
209
+ { url = "https://files.pythonhosted.org/packages/30/ec/7ea7c1e4c8fc8329506b46c6c4a52e2f20318425d48e0fe597977c71dbce/cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", size = 3952350 },
210
+ { url = "https://files.pythonhosted.org/packages/27/61/72e3afdb3c5ac510330feba4fc1faa0fe62e070592d6ad00c40bb69165e5/cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", size = 4166572 },
211
+ { url = "https://files.pythonhosted.org/packages/26/e4/ba680f0b35ed4a07d87f9e98f3ebccb05091f3bf6b5a478b943253b3bbd5/cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", size = 3958124 },
212
+ { url = "https://files.pythonhosted.org/packages/9c/e8/44ae3e68c8b6d1cbc59040288056df2ad7f7f03bbcaca6b503c737ab8e73/cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", size = 3678122 },
213
+ { url = "https://files.pythonhosted.org/packages/27/7b/664ea5e0d1eab511a10e480baf1c5d3e681c7d91718f60e149cec09edf01/cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", size = 4191831 },
214
+ { url = "https://files.pythonhosted.org/packages/2a/07/79554a9c40eb11345e1861f46f845fa71c9e25bf66d132e123d9feb8e7f9/cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", size = 3960583 },
215
+ { url = "https://files.pythonhosted.org/packages/bb/6d/858e356a49a4f0b591bd6789d821427de18432212e137290b6d8a817e9bf/cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308", size = 4191753 },
216
+ { url = "https://files.pythonhosted.org/packages/b2/80/62df41ba4916067fa6b125aa8c14d7e9181773f0d5d0bd4dcef580d8b7c6/cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", size = 4079550 },
217
+ { url = "https://files.pythonhosted.org/packages/f3/cd/2558cc08f7b1bb40683f99ff4327f8dcfc7de3affc669e9065e14824511b/cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", size = 4298367 },
218
+ { url = "https://files.pythonhosted.org/packages/71/59/94ccc74788945bc3bd4cf355d19867e8057ff5fdbcac781b1ff95b700fb1/cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", size = 2772843 },
219
+ { url = "https://files.pythonhosted.org/packages/ca/2c/0d0bbaf61ba05acb32f0841853cfa33ebb7a9ab3d9ed8bb004bd39f2da6a/cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", size = 3209057 },
220
+ { url = "https://files.pythonhosted.org/packages/9e/be/7a26142e6d0f7683d8a382dd963745e65db895a79a280a30525ec92be890/cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", size = 6677789 },
221
+ { url = "https://files.pythonhosted.org/packages/06/88/638865be7198a84a7713950b1db7343391c6066a20e614f8fa286eb178ed/cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", size = 3951919 },
222
+ { url = "https://files.pythonhosted.org/packages/d7/fc/99fe639bcdf58561dfad1faa8a7369d1dc13f20acd78371bb97a01613585/cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", size = 4167812 },
223
+ { url = "https://files.pythonhosted.org/packages/53/7b/aafe60210ec93d5d7f552592a28192e51d3c6b6be449e7fd0a91399b5d07/cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", size = 3958571 },
224
+ { url = "https://files.pythonhosted.org/packages/16/32/051f7ce79ad5a6ef5e26a92b37f172ee2d6e1cce09931646eef8de1e9827/cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", size = 3679832 },
225
+ { url = "https://files.pythonhosted.org/packages/78/2b/999b2a1e1ba2206f2d3bca267d68f350beb2b048a41ea827e08ce7260098/cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", size = 4193719 },
226
+ { url = "https://files.pythonhosted.org/packages/72/97/430e56e39a1356e8e8f10f723211a0e256e11895ef1a135f30d7d40f2540/cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", size = 3960852 },
227
+ { url = "https://files.pythonhosted.org/packages/89/33/c1cf182c152e1d262cac56850939530c05ca6c8d149aa0dcee490b417e99/cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", size = 4193906 },
228
+ { url = "https://files.pythonhosted.org/packages/e1/99/87cf26d4f125380dc674233971069bc28d19b07f7755b29861570e513650/cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", size = 4081572 },
229
+ { url = "https://files.pythonhosted.org/packages/b3/9f/6a3e0391957cc0c5f84aef9fbdd763035f2b52e998a53f99345e3ac69312/cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", size = 4298631 },
230
+ { url = "https://files.pythonhosted.org/packages/e2/a5/5bc097adb4b6d22a24dea53c51f37e480aaec3465285c253098642696423/cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", size = 2773792 },
231
+ { url = "https://files.pythonhosted.org/packages/33/cf/1f7649b8b9a3543e042d3f348e398a061923ac05b507f3f4d95f11938aa9/cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", size = 3210957 },
231
232
  ]
232
233
 
233
234
  [[package]]
@@ -281,28 +282,6 @@ wheels = [
281
282
  { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
282
283
  ]
283
284
 
284
- [[package]]
285
- name = "h2"
286
- version = "4.1.0"
287
- source = { registry = "https://pypi.org/simple" }
288
- dependencies = [
289
- { name = "hpack" },
290
- { name = "hyperframe" },
291
- ]
292
- sdist = { url = "https://files.pythonhosted.org/packages/2a/32/fec683ddd10629ea4ea46d206752a95a2d8a48c22521edd70b142488efe1/h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb", size = 2145593 }
293
- wheels = [
294
- { url = "https://files.pythonhosted.org/packages/2a/e5/db6d438da759efbb488c4f3fbdab7764492ff3c3f953132efa6b9f0e9e53/h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d", size = 57488 },
295
- ]
296
-
297
- [[package]]
298
- name = "hpack"
299
- version = "4.0.0"
300
- source = { registry = "https://pypi.org/simple" }
301
- sdist = { url = "https://files.pythonhosted.org/packages/3e/9b/fda93fb4d957db19b0f6b370e79d586b3e8528b20252c729c476a2c02954/hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095", size = 49117 }
302
- wheels = [
303
- { url = "https://files.pythonhosted.org/packages/d5/34/e8b383f35b77c402d28563d2b8f83159319b509bc5f760b15d60b0abf165/hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c", size = 32611 },
304
- ]
305
-
306
285
  [[package]]
307
286
  name = "httpcore"
308
287
  version = "1.0.7"
@@ -332,22 +311,10 @@ wheels = [
332
311
  ]
333
312
 
334
313
  [package.optional-dependencies]
335
- http2 = [
336
- { name = "h2" },
337
- ]
338
314
  socks = [
339
315
  { name = "socksio" },
340
316
  ]
341
317
 
342
- [[package]]
343
- name = "hyperframe"
344
- version = "6.0.1"
345
- source = { registry = "https://pypi.org/simple" }
346
- sdist = { url = "https://files.pythonhosted.org/packages/5a/2a/4747bff0a17f7281abe73e955d60d80aae537a5d203f417fa1c2e7578ebb/hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914", size = 25008 }
347
- wheels = [
348
- { url = "https://files.pythonhosted.org/packages/d7/de/85a784bcc4a3779d1753a7ec2dee5de90e18c7bcf402e71b51fcf150b129/hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15", size = 12389 },
349
- ]
350
-
351
318
  [[package]]
352
319
  name = "idna"
353
320
  version = "3.10"
@@ -368,14 +335,14 @@ wheels = [
368
335
 
369
336
  [[package]]
370
337
  name = "jinja2"
371
- version = "3.1.5"
338
+ version = "3.1.6"
372
339
  source = { registry = "https://pypi.org/simple" }
373
340
  dependencies = [
374
341
  { name = "markupsafe" },
375
342
  ]
376
- sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 }
343
+ sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 }
377
344
  wheels = [
378
- { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 },
345
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 },
379
346
  ]
380
347
 
381
348
  [[package]]
@@ -473,27 +440,27 @@ wheels = [
473
440
 
474
441
  [[package]]
475
442
  name = "mm-crypto-utils"
476
- version = "0.2.6"
443
+ version = "0.2.9"
477
444
  source = { registry = "https://pypi.org/simple" }
478
445
  dependencies = [
479
446
  { name = "loguru" },
480
447
  { name = "mm-std" },
481
448
  ]
482
449
  wheels = [
483
- { url = "https://files.pythonhosted.org/packages/d2/2a/72236eb60cb007d472fa6be72a98abf6b8273df3158a218cc5f412f86497/mm_crypto_utils-0.2.6-py3-none-any.whl", hash = "sha256:ef738203e2863570308d0fc5fee8f05c469d3f7df905dcdfd092d84690b14c9c", size = 8269 },
450
+ { url = "https://files.pythonhosted.org/packages/bb/4c/c790acb5b025d35a391dd4fef1ebb3b6432a874154844a618d27b10a0a0f/mm_crypto_utils-0.2.9-py3-none-any.whl", hash = "sha256:0b569067e4c4f8e568599134febe23aacbb903bb80799e4258180ec4a51bec9b", size = 8273 },
484
451
  ]
485
452
 
486
453
  [[package]]
487
454
  name = "mm-sol"
488
- version = "0.5.3"
455
+ version = "0.5.5"
489
456
  source = { editable = "." }
490
457
  dependencies = [
491
458
  { name = "base58" },
492
459
  { name = "jinja2" },
493
460
  { name = "mm-crypto-utils" },
494
461
  { name = "mnemonic" },
462
+ { name = "socksio" },
495
463
  { name = "solana" },
496
- { name = "solders" },
497
464
  { name = "typer" },
498
465
  ]
499
466
 
@@ -510,39 +477,42 @@ dev = [
510
477
  [package.metadata]
511
478
  requires-dist = [
512
479
  { name = "base58", specifier = "~=2.1.1" },
513
- { name = "jinja2", specifier = ">=3.1.5" },
514
- { name = "mm-crypto-utils", specifier = ">=0.2.6" },
480
+ { name = "jinja2", specifier = ">=3.1.6" },
481
+ { name = "mm-crypto-utils", specifier = ">=0.2.9" },
515
482
  { name = "mnemonic", specifier = "==0.21" },
516
- { name = "solana", specifier = "~=0.36.5" },
517
- { name = "solders", specifier = "~=0.23.0" },
518
- { name = "typer", specifier = ">=0.15.1" },
483
+ { name = "socksio", specifier = ">=1.0.0" },
484
+ { name = "solana", specifier = "~=0.36.6" },
485
+ { name = "typer", specifier = ">=0.15.2" },
519
486
  ]
520
487
 
521
488
  [package.metadata.requires-dev]
522
489
  dev = [
523
- { name = "bandit", specifier = "~=1.8.2" },
490
+ { name = "bandit", specifier = "~=1.8.3" },
524
491
  { name = "mypy", specifier = "~=1.15.0" },
525
492
  { name = "pip-audit", specifier = "~=2.8.0" },
526
- { name = "pytest", specifier = "~=8.3.4" },
493
+ { name = "pytest", specifier = "~=8.3.5" },
527
494
  { name = "pytest-xdist", specifier = "~=3.6.1" },
528
- { name = "ruff", specifier = "~=0.9.6" },
495
+ { name = "ruff", specifier = "~=0.11.2" },
529
496
  ]
530
497
 
531
498
  [[package]]
532
499
  name = "mm-std"
533
- version = "0.3.2"
500
+ version = "0.3.14"
534
501
  source = { registry = "https://pypi.org/simple" }
535
502
  dependencies = [
503
+ { name = "anyio" },
536
504
  { name = "cryptography" },
537
- { name = "httpx", extra = ["http2", "socks"] },
505
+ { name = "httpx", extra = ["socks"] },
538
506
  { name = "pydantic" },
507
+ { name = "pydantic-settings" },
539
508
  { name = "pydash" },
540
509
  { name = "python-dotenv" },
541
- { name = "pyyaml" },
510
+ { name = "requests", extra = ["socks"] },
542
511
  { name = "rich" },
512
+ { name = "tomlkit" },
543
513
  ]
544
514
  wheels = [
545
- { url = "https://files.pythonhosted.org/packages/c0/9a/19f88e047426a52de2f8262d654ca8f20b6b9f15085db7dca6850b7d89d9/mm_std-0.3.2-py3-none-any.whl", hash = "sha256:bf479b1810c887b41aa8b4ad3b6d59d2002703a26b04499516af8e2d94351c86", size = 14709 },
515
+ { url = "https://files.pythonhosted.org/packages/47/61/cd5cbfc1868493ffda46c7d86d94459110ec4dd28c1883936f18f36bfab0/mm_std-0.3.14-py3-none-any.whl", hash = "sha256:db0a3a66590f456ad8c3f268d545803be63339c4b72f3197bc377d101a93ad02", size = 20219 },
546
516
  ]
547
517
 
548
518
  [[package]]
@@ -791,6 +761,19 @@ wheels = [
791
761
  { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 },
792
762
  ]
793
763
 
764
+ [[package]]
765
+ name = "pydantic-settings"
766
+ version = "2.8.1"
767
+ source = { registry = "https://pypi.org/simple" }
768
+ dependencies = [
769
+ { name = "pydantic" },
770
+ { name = "python-dotenv" },
771
+ ]
772
+ sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 }
773
+ wheels = [
774
+ { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 },
775
+ ]
776
+
794
777
  [[package]]
795
778
  name = "pydash"
796
779
  version = "8.0.5"
@@ -821,9 +804,18 @@ wheels = [
821
804
  { url = "https://files.pythonhosted.org/packages/be/ec/2eb3cd785efd67806c46c13a17339708ddc346cbb684eade7a6e6f79536a/pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84", size = 106921 },
822
805
  ]
823
806
 
807
+ [[package]]
808
+ name = "pysocks"
809
+ version = "1.7.1"
810
+ source = { registry = "https://pypi.org/simple" }
811
+ sdist = { url = "https://files.pythonhosted.org/packages/bd/11/293dd436aea955d45fc4e8a35b6ae7270f5b8e00b53cf6c024c83b657a11/PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0", size = 284429 }
812
+ wheels = [
813
+ { url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", size = 16725 },
814
+ ]
815
+
824
816
  [[package]]
825
817
  name = "pytest"
826
- version = "8.3.4"
818
+ version = "8.3.5"
827
819
  source = { registry = "https://pypi.org/simple" }
828
820
  dependencies = [
829
821
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -831,9 +823,9 @@ dependencies = [
831
823
  { name = "packaging" },
832
824
  { name = "pluggy" },
833
825
  ]
834
- sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 }
826
+ sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 }
835
827
  wheels = [
836
- { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 },
828
+ { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 },
837
829
  ]
838
830
 
839
831
  [[package]]
@@ -899,6 +891,11 @@ wheels = [
899
891
  { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
900
892
  ]
901
893
 
894
+ [package.optional-dependencies]
895
+ socks = [
896
+ { name = "pysocks" },
897
+ ]
898
+
902
899
  [[package]]
903
900
  name = "rich"
904
901
  version = "13.9.4"
@@ -914,27 +911,27 @@ wheels = [
914
911
 
915
912
  [[package]]
916
913
  name = "ruff"
917
- version = "0.9.6"
918
- source = { registry = "https://pypi.org/simple" }
919
- sdist = { url = "https://files.pythonhosted.org/packages/2a/e1/e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be/ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9", size = 3639454 }
920
- wheels = [
921
- { url = "https://files.pythonhosted.org/packages/76/e3/3d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be/ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba", size = 11714128 },
922
- { url = "https://files.pythonhosted.org/packages/e1/22/aff073b70f95c052e5c58153cba735748c9e70107a77d03420d7850710a0/ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504", size = 11682539 },
923
- { url = "https://files.pythonhosted.org/packages/75/a7/f5b7390afd98a7918582a3d256cd3e78ba0a26165a467c1820084587cbf9/ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83", size = 11132512 },
924
- { url = "https://files.pythonhosted.org/packages/a6/e3/45de13ef65047fea2e33f7e573d848206e15c715e5cd56095589a7733d04/ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc", size = 11929275 },
925
- { url = "https://files.pythonhosted.org/packages/7d/f2/23d04cd6c43b2e641ab961ade8d0b5edb212ecebd112506188c91f2a6e6c/ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b", size = 11466502 },
926
- { url = "https://files.pythonhosted.org/packages/b5/6f/3a8cf166f2d7f1627dd2201e6cbc4cb81f8b7d58099348f0c1ff7b733792/ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e", size = 12676364 },
927
- { url = "https://files.pythonhosted.org/packages/f5/c4/db52e2189983c70114ff2b7e3997e48c8318af44fe83e1ce9517570a50c6/ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666", size = 13335518 },
928
- { url = "https://files.pythonhosted.org/packages/66/44/545f8a4d136830f08f4d24324e7db957c5374bf3a3f7a6c0bc7be4623a37/ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5", size = 12823287 },
929
- { url = "https://files.pythonhosted.org/packages/c5/26/8208ef9ee7431032c143649a9967c3ae1aae4257d95e6f8519f07309aa66/ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5", size = 14592374 },
930
- { url = "https://files.pythonhosted.org/packages/31/70/e917781e55ff39c5b5208bda384fd397ffd76605e68544d71a7e40944945/ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217", size = 12500173 },
931
- { url = "https://files.pythonhosted.org/packages/84/f5/e4ddee07660f5a9622a9c2b639afd8f3104988dc4f6ba0b73ffacffa9a8c/ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6", size = 11906555 },
932
- { url = "https://files.pythonhosted.org/packages/f1/2b/6ff2fe383667075eef8656b9892e73dd9b119b5e3add51298628b87f6429/ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897", size = 11538958 },
933
- { url = "https://files.pythonhosted.org/packages/3c/db/98e59e90de45d1eb46649151c10a062d5707b5b7f76f64eb1e29edf6ebb1/ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08", size = 12117247 },
934
- { url = "https://files.pythonhosted.org/packages/ec/bc/54e38f6d219013a9204a5a2015c09e7a8c36cedcd50a4b01ac69a550b9d9/ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656", size = 12554647 },
935
- { url = "https://files.pythonhosted.org/packages/a5/7d/7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2/ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d", size = 9949214 },
936
- { url = "https://files.pythonhosted.org/packages/ee/30/c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37/ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa", size = 10999914 },
937
- { url = "https://files.pythonhosted.org/packages/e8/a8/d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c/ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a", size = 10177499 },
914
+ version = "0.11.2"
915
+ source = { registry = "https://pypi.org/simple" }
916
+ sdist = { url = "https://files.pythonhosted.org/packages/90/61/fb87430f040e4e577e784e325351186976516faef17d6fcd921fe28edfd7/ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94", size = 3857511 }
917
+ wheels = [
918
+ { url = "https://files.pythonhosted.org/packages/62/99/102578506f0f5fa29fd7e0df0a273864f79af044757aef73d1cae0afe6ad/ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477", size = 10113146 },
919
+ { url = "https://files.pythonhosted.org/packages/74/ad/5cd4ba58ab602a579997a8494b96f10f316e874d7c435bcc1a92e6da1b12/ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272", size = 10867092 },
920
+ { url = "https://files.pythonhosted.org/packages/fc/3e/d3f13619e1d152c7b600a38c1a035e833e794c6625c9a6cea6f63dbf3af4/ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9", size = 10224082 },
921
+ { url = "https://files.pythonhosted.org/packages/90/06/f77b3d790d24a93f38e3806216f263974909888fd1e826717c3ec956bbcd/ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb", size = 10394818 },
922
+ { url = "https://files.pythonhosted.org/packages/99/7f/78aa431d3ddebfc2418cd95b786642557ba8b3cb578c075239da9ce97ff9/ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3", size = 9952251 },
923
+ { url = "https://files.pythonhosted.org/packages/30/3e/f11186d1ddfaca438c3bbff73c6a2fdb5b60e6450cc466129c694b0ab7a2/ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74", size = 11563566 },
924
+ { url = "https://files.pythonhosted.org/packages/22/6c/6ca91befbc0a6539ee133d9a9ce60b1a354db12c3c5d11cfdbf77140f851/ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608", size = 12208721 },
925
+ { url = "https://files.pythonhosted.org/packages/19/b0/24516a3b850d55b17c03fc399b681c6a549d06ce665915721dc5d6458a5c/ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f", size = 11662274 },
926
+ { url = "https://files.pythonhosted.org/packages/d7/65/76be06d28ecb7c6070280cef2bcb20c98fbf99ff60b1c57d2fb9b8771348/ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147", size = 13792284 },
927
+ { url = "https://files.pythonhosted.org/packages/ce/d2/4ceed7147e05852876f3b5f3fdc23f878ce2b7e0b90dd6e698bda3d20787/ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b", size = 11327861 },
928
+ { url = "https://files.pythonhosted.org/packages/c4/78/4935ecba13706fd60ebe0e3dc50371f2bdc3d9bc80e68adc32ff93914534/ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9", size = 10276560 },
929
+ { url = "https://files.pythonhosted.org/packages/81/7f/1b2435c3f5245d410bb5dc80f13ec796454c21fbda12b77d7588d5cf4e29/ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab", size = 9945091 },
930
+ { url = "https://files.pythonhosted.org/packages/39/c4/692284c07e6bf2b31d82bb8c32f8840f9d0627d92983edaac991a2b66c0a/ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630", size = 10977133 },
931
+ { url = "https://files.pythonhosted.org/packages/94/cf/8ab81cb7dd7a3b0a3960c2769825038f3adcd75faf46dd6376086df8b128/ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f", size = 11378514 },
932
+ { url = "https://files.pythonhosted.org/packages/d9/3a/a647fa4f316482dacf2fd68e8a386327a33d6eabd8eb2f9a0c3d291ec549/ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc", size = 10319835 },
933
+ { url = "https://files.pythonhosted.org/packages/86/54/3c12d3af58012a5e2cd7ebdbe9983f4834af3f8cbea0e8a8c74fa1e23b2b/ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080", size = 11373713 },
934
+ { url = "https://files.pythonhosted.org/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4", size = 10441990 },
938
935
  ]
939
936
 
940
937
  [[package]]
@@ -966,7 +963,7 @@ wheels = [
966
963
 
967
964
  [[package]]
968
965
  name = "solana"
969
- version = "0.36.5"
966
+ version = "0.36.6"
970
967
  source = { registry = "https://pypi.org/simple" }
971
968
  dependencies = [
972
969
  { name = "construct-typing" },
@@ -975,9 +972,9 @@ dependencies = [
975
972
  { name = "typing-extensions" },
976
973
  { name = "websockets" },
977
974
  ]
978
- sdist = { url = "https://files.pythonhosted.org/packages/c8/e7/18ffc3d25e8f772f6b20d8dfd27a0d275576403e4d52def0a94021741506/solana-0.36.5.tar.gz", hash = "sha256:8c81de111903d01b3b5659130840ee1711092ab02982cf5e1ea851ed9ddcb011", size = 52108 }
975
+ sdist = { url = "https://files.pythonhosted.org/packages/03/7d/ff1006867566c802c8d99b528893bb04b1ec4f9e18191db32e143773e68d/solana-0.36.6.tar.gz", hash = "sha256:aa2403bc36bb06ea5bf56f6856373a50ae8b1c3a45261d5a4c911350f7427c00", size = 52132 }
979
976
  wheels = [
980
- { url = "https://files.pythonhosted.org/packages/f4/3f/9c6a8bff32b7b622ac1566c52bde16239290b9d1e042c1164bdba22fef8b/solana-0.36.5-py3-none-any.whl", hash = "sha256:6b2023ba8623841ccac96e73e374a9d0e0d450436d368178fdd0537ed308d04c", size = 62217 },
977
+ { url = "https://files.pythonhosted.org/packages/4d/7a/56650a6771626cd9509b19fb5e26ecd5a4c7057679f803a437f73ea62507/solana-0.36.6-py3-none-any.whl", hash = "sha256:c0526b602d834cb762102f854be469be6657731db0d016a985bbabd6212dd09d", size = 62272 },
981
978
  ]
982
979
 
983
980
  [[package]]
@@ -1030,9 +1027,18 @@ wheels = [
1030
1027
  { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588 },
1031
1028
  ]
1032
1029
 
1030
+ [[package]]
1031
+ name = "tomlkit"
1032
+ version = "0.13.2"
1033
+ source = { registry = "https://pypi.org/simple" }
1034
+ sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 }
1035
+ wheels = [
1036
+ { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 },
1037
+ ]
1038
+
1033
1039
  [[package]]
1034
1040
  name = "typer"
1035
- version = "0.15.1"
1041
+ version = "0.15.2"
1036
1042
  source = { registry = "https://pypi.org/simple" }
1037
1043
  dependencies = [
1038
1044
  { name = "click" },
@@ -1040,9 +1046,9 @@ dependencies = [
1040
1046
  { name = "shellingham" },
1041
1047
  { name = "typing-extensions" },
1042
1048
  ]
1043
- sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789 }
1049
+ sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 }
1044
1050
  wheels = [
1045
- { url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908 },
1051
+ { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 },
1046
1052
  ]
1047
1053
 
1048
1054
  [[package]]
mm_sol-0.5.3/PKG-INFO DELETED
@@ -1,11 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: mm-sol
3
- Version: 0.5.3
4
- Requires-Python: >=3.12
5
- Requires-Dist: base58~=2.1.1
6
- Requires-Dist: jinja2>=3.1.5
7
- Requires-Dist: mm-crypto-utils>=0.2.6
8
- Requires-Dist: mnemonic==0.21
9
- Requires-Dist: solana~=0.36.5
10
- Requires-Dist: solders~=0.23.0
11
- Requires-Dist: typer>=0.15.1
@@ -1,86 +0,0 @@
1
- import httpx
2
- from mm_crypto_utils import Nodes, Proxies, random_node, random_proxy
3
- from mm_std import Err, Ok, Result
4
- from solana.exceptions import SolanaRpcException
5
- from solana.rpc.core import RPCException
6
- from solders.pubkey import Pubkey
7
- from solders.rpc.errors import InvalidParamsMessage
8
- from spl.token.instructions import get_associated_token_address
9
-
10
- from mm_sol import rpc
11
- from mm_sol.utils import get_client
12
-
13
-
14
- def get_sol_balance(node: str, address: str, timeout: int = 10, proxy: str | None = None) -> Result[int]:
15
- return rpc.get_balance(node, address, timeout, proxy)
16
-
17
-
18
- def get_sol_balance_with_retries(
19
- nodes: Nodes, address: str, retries: int, timeout: int = 10, proxies: Proxies = None
20
- ) -> Result[int]:
21
- res: Result[int] = Err("not started yet")
22
- for _ in range(retries):
23
- res = get_sol_balance(random_node(nodes), address, timeout=timeout, proxy=random_proxy(proxies))
24
- if res.is_ok():
25
- return res
26
- return res
27
-
28
-
29
- def get_token_balance(
30
- node: str,
31
- owner_address: str,
32
- token_mint_address: str,
33
- token_account: str | None = None,
34
- timeout: float = 10,
35
- proxy: str | None = None,
36
- ) -> Result[int]:
37
- try:
38
- client = get_client(node, proxy=proxy, timeout=timeout)
39
- if not token_account:
40
- token_account = str(
41
- get_associated_token_address(Pubkey.from_string(owner_address), Pubkey.from_string(token_mint_address))
42
- )
43
-
44
- res = client.get_token_account_balance(Pubkey.from_string(token_account))
45
-
46
- # Sometimes it not raise an error, but it returns this :(
47
- if isinstance(res, InvalidParamsMessage) and "could not find account" in res.message:
48
- return Ok(0)
49
- return Ok(int(res.value.amount), data=res.to_json())
50
- except RPCException as e:
51
- if len(e.args) > 1:
52
- s = e.args[0]
53
- if isinstance(s, InvalidParamsMessage) and "could not find account" in s.message:
54
- return Ok(0)
55
- return Err(e)
56
- except httpx.HTTPStatusError as e:
57
- return Err(f"http error: {e}")
58
- except SolanaRpcException as e:
59
- return Err(e.error_msg)
60
- except Exception as e:
61
- return Err(e)
62
-
63
-
64
- def get_token_balance_with_retries(
65
- nodes: Nodes,
66
- owner_address: str,
67
- token_mint_address: str,
68
- retries: int,
69
- token_account: str | None = None,
70
- timeout: float = 10,
71
- proxies: Proxies = None,
72
- ) -> Result[int]:
73
- res: Result[int] = Err("not started yet")
74
- for _ in range(retries):
75
- res = get_token_balance(
76
- random_node(nodes),
77
- owner_address,
78
- token_mint_address,
79
- token_account,
80
- timeout=timeout,
81
- proxy=random_proxy(proxies),
82
- )
83
- if res.is_ok():
84
- return res
85
-
86
- return res
@@ -1,6 +0,0 @@
1
- from mm_sol.balance import get_sol_balance
2
-
3
-
4
- def test_get_balance(mainnet_node, usdt_owner_address, random_proxy):
5
- res = get_sol_balance(mainnet_node, usdt_owner_address, proxy=random_proxy)
6
- assert res.unwrap() > 10
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
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
File without changes
File without changes
File without changes
File without changes
File without changes