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.
- mm_sol-0.5.5/PKG-INFO +11 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/README.md +3 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/pyproject.toml +10 -9
- mm_sol-0.5.5/src/mm_sol/async_rpc.py +42 -0
- mm_sol-0.5.5/src/mm_sol/balance.py +161 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/rpc.py +13 -13
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/utils.py +11 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/conftest.py +6 -1
- mm_sol-0.5.5/tests/test_async_rpc.py +10 -0
- mm_sol-0.5.5/tests/test_balance.py +25 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/uv.lock +122 -116
- mm_sol-0.5.3/PKG-INFO +0 -11
- mm_sol-0.5.3/src/mm_sol/balance.py +0 -86
- mm_sol-0.5.3/tests/test_balance.py +0 -6
- {mm_sol-0.5.3 → mm_sol-0.5.5}/.env.example +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/.gitignore +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/dict.dic +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/justfile +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/__init__.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/account.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/block.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/__init__.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/calcs.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cli.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cli_utils.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/__init__.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/balance_cmd.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/balances_cmd.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/example_cmd.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/node_cmd.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/transfer_cmd.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/wallet/__init__.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/wallet/keypair_cmd.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/cmd/wallet/mnemonic_cmd.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/examples/balances.toml +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/examples/transfer.toml +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/cli/validators.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/constants.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/converters.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/py.typed +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/solana_cli.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/token.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/src/mm_sol/transfer.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/__init__.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/__init__.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/cmd/__init__.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/cmd/wallet/__init__.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/cmd/wallet/test_keypair_cmd.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/cli/cmd/wallet/test_mnemonic_cmd.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/test_account.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/test_client.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/test_converters.py +0 -0
- {mm_sol-0.5.3 → mm_sol-0.5.5}/tests/test_rpc.py +0 -0
- {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
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mm-sol"
|
|
3
|
-
version = "0.5.
|
|
3
|
+
version = "0.5.5"
|
|
4
4
|
description = ""
|
|
5
5
|
requires-python = ">=3.12"
|
|
6
6
|
dependencies = [
|
|
7
|
-
"mm-crypto-utils>=0.2.
|
|
8
|
-
"solana~=0.36.
|
|
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.
|
|
13
|
-
"jinja2>=3.1.
|
|
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.
|
|
24
|
+
"pytest~=8.3.5",
|
|
25
25
|
"pytest-xdist~=3.6.1",
|
|
26
|
-
"ruff~=0.
|
|
26
|
+
"ruff~=0.11.2",
|
|
27
27
|
"pip-audit~=2.8.0",
|
|
28
|
-
"bandit~=1.8.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
@@ -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.
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
206
|
-
wheels = [
|
|
207
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
208
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
209
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
210
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
211
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
212
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
213
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
214
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
215
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
216
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
217
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
218
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
219
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
220
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
221
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
222
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
223
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
224
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
225
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
226
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
227
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
228
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
229
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
230
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
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.
|
|
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.
|
|
514
|
-
{ name = "mm-crypto-utils", specifier = ">=0.2.
|
|
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 = "
|
|
517
|
-
{ name = "
|
|
518
|
-
{ name = "typer", specifier = ">=0.15.
|
|
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.
|
|
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.
|
|
493
|
+
{ name = "pytest", specifier = "~=8.3.5" },
|
|
527
494
|
{ name = "pytest-xdist", specifier = "~=3.6.1" },
|
|
528
|
-
{ name = "ruff", specifier = "~=0.
|
|
495
|
+
{ name = "ruff", specifier = "~=0.11.2" },
|
|
529
496
|
]
|
|
530
497
|
|
|
531
498
|
[[package]]
|
|
532
499
|
name = "mm-std"
|
|
533
|
-
version = "0.3.
|
|
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 = ["
|
|
505
|
+
{ name = "httpx", extra = ["socks"] },
|
|
538
506
|
{ name = "pydantic" },
|
|
507
|
+
{ name = "pydantic-settings" },
|
|
539
508
|
{ name = "pydash" },
|
|
540
509
|
{ name = "python-dotenv" },
|
|
541
|
-
{ name = "
|
|
510
|
+
{ name = "requests", extra = ["socks"] },
|
|
542
511
|
{ name = "rich" },
|
|
512
|
+
{ name = "tomlkit" },
|
|
543
513
|
]
|
|
544
514
|
wheels = [
|
|
545
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
918
|
-
source = { registry = "https://pypi.org/simple" }
|
|
919
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
920
|
-
wheels = [
|
|
921
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
922
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
923
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
924
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
925
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
926
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
927
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
928
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
929
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
930
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
931
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
932
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
933
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
934
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
935
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
936
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
937
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
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/
|
|
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
|
|
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
|
|
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
|