mm-sol 0.6.1__tar.gz → 0.6.3__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 (48) hide show
  1. {mm_sol-0.6.1 → mm_sol-0.6.3}/PKG-INFO +4 -3
  2. {mm_sol-0.6.1 → mm_sol-0.6.3}/pyproject.toml +5 -4
  3. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cmd/node_cmd.py +1 -1
  4. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cmd/transfer_cmd.py +3 -3
  5. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/rpc.py +6 -6
  6. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/rpc_sync.py +15 -15
  7. {mm_sol-0.6.1 → mm_sol-0.6.3}/uv.lock +622 -621
  8. {mm_sol-0.6.1 → mm_sol-0.6.3}/.env.example +0 -0
  9. {mm_sol-0.6.1 → mm_sol-0.6.3}/.gitignore +0 -0
  10. {mm_sol-0.6.1 → mm_sol-0.6.3}/README.md +0 -0
  11. {mm_sol-0.6.1 → mm_sol-0.6.3}/dict.dic +0 -0
  12. {mm_sol-0.6.1 → mm_sol-0.6.3}/justfile +0 -0
  13. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/__init__.py +0 -0
  14. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/account.py +0 -0
  15. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/__init__.py +0 -0
  16. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/calcs.py +0 -0
  17. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cli.py +0 -0
  18. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cli_utils.py +0 -0
  19. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cmd/__init__.py +0 -0
  20. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cmd/balance_cmd.py +0 -0
  21. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cmd/balances_cmd.py +0 -0
  22. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cmd/example_cmd.py +0 -0
  23. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cmd/wallet/__init__.py +0 -0
  24. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cmd/wallet/keypair_cmd.py +0 -0
  25. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/cmd/wallet/mnemonic_cmd.py +0 -0
  26. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/examples/balances.toml +0 -0
  27. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/examples/transfer.toml +0 -0
  28. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/cli/validators.py +0 -0
  29. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/constants.py +0 -0
  30. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/converters.py +0 -0
  31. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/py.typed +0 -0
  32. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/retry.py +0 -0
  33. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/spl_token.py +0 -0
  34. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/transfer.py +0 -0
  35. {mm_sol-0.6.1 → mm_sol-0.6.3}/src/mm_sol/utils.py +0 -0
  36. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/__init__.py +0 -0
  37. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/cli/__init__.py +0 -0
  38. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/cli/cmd/__init__.py +0 -0
  39. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/cli/cmd/wallet/__init__.py +0 -0
  40. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/cli/cmd/wallet/test_keypair_cmd.py +0 -0
  41. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/cli/cmd/wallet/test_mnemonic_cmd.py +0 -0
  42. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/conftest.py +0 -0
  43. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/test_account.py +0 -0
  44. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/test_client.py +0 -0
  45. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/test_converters.py +0 -0
  46. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/test_rpc.py +0 -0
  47. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/test_rpc_sync.py +0 -0
  48. {mm_sol-0.6.1 → mm_sol-0.6.3}/tests/test_spl_token.py +0 -0
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mm-sol
3
- Version: 0.6.1
3
+ Version: 0.6.3
4
4
  Requires-Python: >=3.12
5
5
  Requires-Dist: base58~=2.1.1
6
+ Requires-Dist: h11>=0.16.0
6
7
  Requires-Dist: jinja2>=3.1.6
7
- Requires-Dist: mm-crypto-utils>=0.3.4
8
+ Requires-Dist: mm-crypto-utils>=0.3.7
8
9
  Requires-Dist: mnemonic==0.21
9
10
  Requires-Dist: socksio>=1.0.0
10
11
  Requires-Dist: solana~=0.36.6
11
12
  Requires-Dist: solders~=0.26.0
12
- Requires-Dist: typer>=0.15.2
13
+ Requires-Dist: typer>=0.15.3
@@ -1,17 +1,18 @@
1
1
  [project]
2
2
  name = "mm-sol"
3
- version = "0.6.1"
3
+ version = "0.6.3"
4
4
  description = ""
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
7
- "mm-crypto-utils>=0.3.4",
7
+ "mm-crypto-utils>=0.3.7",
8
8
  "solana~=0.36.6",
9
9
  "solders~=0.26.0",
10
10
  "base58~=2.1.1",
11
11
  "mnemonic==0.21",
12
- "typer>=0.15.2",
12
+ "typer>=0.15.3",
13
13
  "jinja2>=3.1.6",
14
14
  "socksio>=1.0.0",
15
+ "h11>=0.16.0", # secure fix, remove when solana updated
15
16
  ]
16
17
  [project.scripts]
17
18
  mm-sol = "mm_sol.cli.cli:app"
@@ -24,7 +25,7 @@ build-backend = "hatchling.build"
24
25
  dev-dependencies = [
25
26
  "pytest~=8.3.5",
26
27
  "pytest-xdist~=3.6.1",
27
- "ruff~=0.11.6",
28
+ "ruff~=0.11.9",
28
29
  "pip-audit~=2.9.0",
29
30
  "bandit~=1.8.3",
30
31
  "mypy~=1.15.0",
@@ -7,5 +7,5 @@ from mm_sol.cli import cli_utils
7
7
  async def run(urls: list[str], proxy: str | None) -> None:
8
8
  result = {}
9
9
  for url in [cli_utils.public_rpc_url(u) for u in urls]:
10
- result[url] = (await rpc.get_block_height(url, proxy=proxy, timeout=10)).ok_or_error()
10
+ result[url] = (await rpc.get_block_height(url, proxy=proxy, timeout=10)).value_or_error()
11
11
  print_json(data=result)
@@ -130,7 +130,7 @@ async def _calc_value(transfer: Transfer, config: Config, transfer_sol_fee: int)
130
130
  proxies=config.proxies,
131
131
  fee=transfer_sol_fee,
132
132
  )
133
- logger.debug(f"{transfer.log_prefix}: value={value_res.ok_or_error()}")
133
+ logger.debug(f"{transfer.log_prefix}: value={value_res.value_or_error()}")
134
134
  if value_res.is_err():
135
135
  logger.info(f"{transfer.log_prefix}: calc value error, {value_res.unwrap_error()}")
136
136
 
@@ -256,11 +256,11 @@ async def _print_balances(config: Config) -> None:
256
256
 
257
257
  async def _get_sol_balance_str(address: str, config: Config) -> str:
258
258
  res = await retry.get_sol_balance(5, config.nodes, config.proxies, address=address)
259
- return res.map(lambda ok: str(lamports_to_sol(ok, config.round_ndigits))).ok_or_error()
259
+ return res.map(lambda ok: str(lamports_to_sol(ok, config.round_ndigits))).value_or_error()
260
260
 
261
261
 
262
262
  async def _get_token_balance_str(address: str, config: Config) -> str:
263
263
  if not config.token:
264
264
  raise ValueError("token is not set")
265
265
  res = await mm_sol.retry.get_token_balance(5, config.nodes, config.proxies, owner=address, token=config.token)
266
- return res.map(lambda ok: str(to_token(ok, config.token_decimals, ndigits=config.round_ndigits))).ok_or_error()
266
+ return res.map(lambda ok: str(to_token(ok, config.token_decimals, ndigits=config.round_ndigits))).value_or_error()
@@ -23,17 +23,17 @@ async def rpc_call(
23
23
  async def _http_call(node: str, data: dict[str, object], timeout: float, proxy: str | None) -> Result[Any]:
24
24
  res = await http_request(node, method="POST", proxy=proxy, timeout=timeout, json=data)
25
25
  if res.is_err():
26
- return res.to_err_result()
26
+ return res.to_err()
27
27
  try:
28
28
  parsed_body = res.parse_json_body()
29
29
  err = parsed_body.get("error", {}).get("message", "")
30
30
  if err:
31
- return res.to_err_result(f"service_error: {err}")
31
+ return res.to_err(f"service_error: {err}")
32
32
  if "result" in parsed_body:
33
- return res.to_ok_result(parsed_body["result"])
34
- return res.to_err_result("unknown_response")
33
+ return res.to_ok(parsed_body["result"])
34
+ return res.to_err("unknown_response")
35
35
  except Exception as e:
36
- return res.to_err_result(e)
36
+ return res.to_err(e)
37
37
 
38
38
 
39
39
  async def _ws_call(node: str, data: dict[str, object], timeout: float) -> Result[Any]:
@@ -55,7 +55,7 @@ async def _ws_call(node: str, data: dict[str, object], timeout: float) -> Result
55
55
  return Result.err(e, {"response": response})
56
56
 
57
57
 
58
- async def get_block_height(node: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
58
+ async def get_block_height(node: str, timeout: float = 5, proxy: str | None = None) -> Result[int]:
59
59
  return await rpc_call(node=node, method="getBlockHeight", params=[], timeout=timeout, proxy=proxy)
60
60
 
61
61
 
@@ -79,7 +79,7 @@ def rpc_call(
79
79
  method: str,
80
80
  params: list[Any],
81
81
  id_: int = 1,
82
- timeout: float = 10,
82
+ timeout: float = 5,
83
83
  proxy: str | None = None,
84
84
  ) -> Result[Any]:
85
85
  data = {"jsonrpc": "2.0", "method": method, "params": params, "id": id_}
@@ -92,50 +92,50 @@ def _http_call(node: str, data: dict[str, object], timeout: float, proxy: str |
92
92
  res = http_request_sync(node, method="POST", proxy=proxy, timeout=timeout, json=data)
93
93
  try:
94
94
  if res.is_err():
95
- return res.to_err_result()
95
+ return res.to_err()
96
96
 
97
97
  json_body = res.parse_json_body()
98
98
  err = pydash.get(json_body, "error.message")
99
99
  if err:
100
- return res.to_err_result(f"service_error: {err}")
100
+ return res.to_err(f"service_error: {err}")
101
101
  if "result" in json_body:
102
- return res.to_ok_result(json_body["result"])
102
+ return res.to_ok(json_body["result"])
103
103
 
104
- return res.to_err_result("unknown_response")
104
+ return res.to_err("unknown_response")
105
105
  except Exception as e:
106
- return res.to_err_result(e)
106
+ return res.to_err(e)
107
107
 
108
108
 
109
- def get_balance(node: str, address: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
109
+ def get_balance(node: str, address: str, timeout: float = 5, proxy: str | None = None) -> Result[int]:
110
110
  """Returns balance in lamports"""
111
111
  return rpc_call(node=node, method="getBalance", params=[address], timeout=timeout, proxy=proxy).map(lambda r: r["value"])
112
112
 
113
113
 
114
- def get_block_height(node: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
114
+ def get_block_height(node: str, timeout: float = 5, proxy: str | None = None) -> Result[int]:
115
115
  """Returns balance in lamports"""
116
116
  return rpc_call(node=node, method="getBlockHeight", params=[], timeout=timeout, proxy=proxy)
117
117
 
118
118
 
119
- def get_slot(node: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
119
+ def get_slot(node: str, timeout: float = 5, proxy: str | None = None) -> Result[int]:
120
120
  return rpc_call(node=node, method="getSlot", params=[], timeout=timeout, proxy=proxy)
121
121
 
122
122
 
123
- def get_epoch_info(node: str, epoch: int | None = None, timeout: float = 10, proxy: str | None = None) -> Result[EpochInfo]:
123
+ def get_epoch_info(node: str, epoch: int | None = None, timeout: float = 5, proxy: str | None = None) -> Result[EpochInfo]:
124
124
  params = [epoch] if epoch else []
125
125
  return rpc_call(node=node, method="getEpochInfo", params=params, timeout=timeout, proxy=proxy).map(lambda r: EpochInfo(**r))
126
126
 
127
127
 
128
- def get_health(node: str, timeout: float = 10, proxy: str | None = None) -> Result[bool]:
128
+ def get_health(node: str, timeout: float = 5, proxy: str | None = None) -> Result[bool]:
129
129
  return rpc_call(node=node, method="getHealth", params=[], timeout=timeout, proxy=proxy).map(lambda r: r == "ok")
130
130
 
131
131
 
132
- def get_cluster_nodes(node: str, timeout: float = 30, proxy: str | None = None) -> Result[list[ClusterNode]]:
132
+ def get_cluster_nodes(node: str, timeout: float = 5, proxy: str | None = None) -> Result[list[ClusterNode]]:
133
133
  return rpc_call(node=node, method="getClusterNodes", timeout=timeout, proxy=proxy, params=[]).map(
134
134
  lambda r: [ClusterNode(**n) for n in r],
135
135
  )
136
136
 
137
137
 
138
- def get_vote_accounts(node: str, timeout: float = 30, proxy: str | None = None) -> Result[list[VoteAccount]]:
138
+ def get_vote_accounts(node: str, timeout: float = 5, 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: float = 30, proxy: str | None = None)
182
182
  def get_leader_scheduler(
183
183
  node: str,
184
184
  slot: int | None = None,
185
- timeout: float = 10,
185
+ timeout: float = 5,
186
186
  proxy: str | None = None,
187
187
  ) -> Result[dict[str, list[int]]]:
188
188
  return rpc_call(
@@ -205,7 +205,7 @@ def get_transaction(
205
205
  signature: str,
206
206
  max_supported_transaction_version: int | None = None,
207
207
  encoding: str = "json",
208
- timeout: float = 60,
208
+ timeout: float = 5,
209
209
  proxy: str | None = None,
210
210
  ) -> Result[dict[str, object] | None]:
211
211
  if max_supported_transaction_version is not None: