mm-sol 0.4.0__tar.gz → 0.5.1__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 (50) hide show
  1. {mm_sol-0.4.0 → mm_sol-0.5.1}/.gitignore +1 -0
  2. {mm_sol-0.4.0 → mm_sol-0.5.1}/PKG-INFO +4 -3
  3. {mm_sol-0.4.0 → mm_sol-0.5.1}/pyproject.toml +6 -6
  4. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cli.py +2 -0
  5. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cli_utils.py +4 -6
  6. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cmd/example_cmd.py +2 -2
  7. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cmd/transfer_cmd.py +65 -42
  8. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/examples/balances.toml +2 -0
  9. mm_sol-0.5.1/src/mm_sol/cli/examples/transfer.toml +35 -0
  10. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/validators.py +3 -3
  11. {mm_sol-0.4.0 → mm_sol-0.5.1}/uv.lock +75 -91
  12. mm_sol-0.4.0/src/mm_sol/cli/examples/transfer.toml +0 -23
  13. {mm_sol-0.4.0 → mm_sol-0.5.1}/.env.example +0 -0
  14. {mm_sol-0.4.0 → mm_sol-0.5.1}/README.md +0 -0
  15. {mm_sol-0.4.0 → mm_sol-0.5.1}/dict.dic +0 -0
  16. {mm_sol-0.4.0 → mm_sol-0.5.1}/justfile +0 -0
  17. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/__init__.py +0 -0
  18. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/account.py +0 -0
  19. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/balance.py +0 -0
  20. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/block.py +0 -0
  21. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/__init__.py +0 -0
  22. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/calcs.py +0 -0
  23. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cmd/__init__.py +0 -0
  24. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cmd/balance_cmd.py +0 -0
  25. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cmd/balances_cmd.py +0 -0
  26. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cmd/node_cmd.py +0 -0
  27. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cmd/wallet/__init__.py +0 -0
  28. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cmd/wallet/keypair_cmd.py +0 -0
  29. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/cli/cmd/wallet/mnemonic_cmd.py +0 -0
  30. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/constants.py +0 -0
  31. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/converters.py +0 -0
  32. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/py.typed +0 -0
  33. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/rpc.py +0 -0
  34. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/solana_cli.py +0 -0
  35. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/token.py +0 -0
  36. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/transfer.py +0 -0
  37. {mm_sol-0.4.0 → mm_sol-0.5.1}/src/mm_sol/utils.py +0 -0
  38. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/__init__.py +0 -0
  39. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/cli/__init__.py +0 -0
  40. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/cli/cmd/__init__.py +0 -0
  41. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/cli/cmd/wallet/__init__.py +0 -0
  42. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/cli/cmd/wallet/test_keypair_cmd.py +0 -0
  43. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/cli/cmd/wallet/test_mnemonic_cmd.py +0 -0
  44. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/conftest.py +0 -0
  45. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/test_account.py +0 -0
  46. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/test_balance.py +0 -0
  47. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/test_client.py +0 -0
  48. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/test_converters.py +0 -0
  49. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/test_rpc.py +0 -0
  50. {mm_sol-0.4.0 → mm_sol-0.5.1}/tests/test_token.py +0 -0
@@ -1,4 +1,5 @@
1
1
  .idea
2
+ .vscode
2
3
  .venv
3
4
  .env
4
5
  .coverage
@@ -1,10 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mm-sol
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Requires-Python: >=3.12
5
5
  Requires-Dist: base58~=2.1.1
6
+ Requires-Dist: cryptography>=44.0.1
6
7
  Requires-Dist: jinja2>=3.1.5
7
- Requires-Dist: mm-crypto-utils>=0.1.5
8
+ Requires-Dist: mm-crypto-utils>=0.2.4
8
9
  Requires-Dist: mnemonic==0.21
9
- Requires-Dist: solana~=0.36.3
10
+ Requires-Dist: solana~=0.36.5
10
11
  Requires-Dist: typer>=0.15.1
@@ -1,16 +1,16 @@
1
1
  [project]
2
2
  name = "mm-sol"
3
- version = "0.4.0"
3
+ version = "0.5.1"
4
4
  description = ""
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
7
- "mm-crypto-utils>=0.1.5",
8
- "solana~=0.36.3",
7
+ "mm-crypto-utils>=0.2.4",
8
+ "solana~=0.36.5",
9
9
  "base58~=2.1.1",
10
10
  "mnemonic==0.21",
11
11
  "typer>=0.15.1",
12
12
  "jinja2>=3.1.5",
13
-
13
+ "cryptography>=44.0.1", # remove after mm-crypto-utils update
14
14
  ]
15
15
  [project.scripts]
16
16
  mm-sol = "mm_sol.cli.cli:app"
@@ -23,8 +23,8 @@ build-backend = "hatchling.build"
23
23
  dev-dependencies = [
24
24
  "pytest~=8.3.4",
25
25
  "pytest-xdist~=3.6.1",
26
- "ruff~=0.9.4",
27
- "pip-audit~=2.7.3",
26
+ "ruff~=0.9.6",
27
+ "pip-audit~=2.8.0",
28
28
  "bandit~=1.8.2",
29
29
  "mypy~=1.15.0",
30
30
  ]
@@ -64,6 +64,7 @@ def balances_command(
64
64
  def transfer_command(
65
65
  config_path: Path,
66
66
  print_balances: bool = typer.Option(False, "--balances", "-b", help="Print balances and exit"),
67
+ print_transfers: bool = typer.Option(False, "--transfers", "-t", help="Print transfers (from, to, value) and exit"),
67
68
  print_config: bool = typer.Option(False, "--config", "-c", help="Print config and exit"),
68
69
  config_verbose: bool = typer.Option(False, "--config-verbose", help="Print config in verbose mode and exit"),
69
70
  emulate: bool = typer.Option(False, "--emulate", "-e", help="Emulate transaction posting"),
@@ -74,6 +75,7 @@ def transfer_command(
74
75
  TransferCmdParams(
75
76
  config_path=config_path,
76
77
  print_balances=print_balances,
78
+ print_transfers=print_transfers,
77
79
  debug=debug,
78
80
  no_confirmation=no_confirmation,
79
81
  emulate=emulate,
@@ -21,12 +21,10 @@ class BaseConfigParams(BaseModel):
21
21
  print_config_and_exit: bool
22
22
 
23
23
 
24
- def print_config(
25
- config: BaseConfig, verbose: bool, exclude_fields: set[str] | None = None, count_fields: set[str] | None = None
26
- ) -> None:
27
- data = config.model_dump(exclude=exclude_fields)
28
- if not verbose and count_fields:
29
- for k in count_fields:
24
+ def print_config(config: BaseConfig, exclude: set[str] | None = None, count: set[str] | None = None) -> None:
25
+ data = config.model_dump(exclude=exclude)
26
+ if count:
27
+ for k in count:
30
28
  data[k] = len(data[k])
31
29
  print_json(data)
32
30
 
@@ -1,8 +1,8 @@
1
1
  from pathlib import Path
2
2
 
3
- from mm_std import print_plain
3
+ from mm_std import pretty_print_toml
4
4
 
5
5
 
6
6
  def run(module: str) -> None:
7
7
  example_file = Path(Path(__file__).parent.absolute(), "../examples", f"{module}.toml")
8
- print_plain(example_file.read_text())
8
+ pretty_print_toml(example_file.read_text())
@@ -5,30 +5,31 @@ from typing import Annotated, Self
5
5
 
6
6
  import mm_crypto_utils
7
7
  from loguru import logger
8
- from mm_crypto_utils import AddressToPrivate, TxRoute
8
+ from mm_crypto_utils import AddressToPrivate, Transfer
9
9
  from mm_std import BaseConfig, Err, fatal, utc_now
10
10
  from pydantic import AfterValidator, BeforeValidator, Field, model_validator
11
+ from rich.console import Console
11
12
  from rich.live import Live
12
13
  from rich.table import Table
13
14
  from solders.signature import Signature
14
15
 
15
- from mm_sol import transfer
16
16
  from mm_sol.balance import get_sol_balance_with_retries, get_token_balance_with_retries
17
17
  from mm_sol.cli import calcs, cli_utils
18
18
  from mm_sol.cli.cli_utils import BaseConfigParams
19
19
  from mm_sol.cli.validators import Validators
20
20
  from mm_sol.converters import lamports_to_sol, to_token
21
21
  from mm_sol.token import get_decimals_with_retries
22
+ from mm_sol.transfer import transfer_sol_with_retries, transfer_token_with_retries
22
23
 
23
24
 
24
25
  class Config(BaseConfig):
25
26
  nodes: Annotated[list[str], BeforeValidator(Validators.nodes())]
26
- routes: Annotated[list[TxRoute], BeforeValidator(Validators.sol_routes())]
27
+ transfers: Annotated[list[Transfer], BeforeValidator(Validators.sol_transfers())]
27
28
  private_keys: Annotated[AddressToPrivate, BeforeValidator(Validators.sol_private_keys())]
28
29
  proxies: Annotated[list[str], Field(default_factory=list), BeforeValidator(Validators.proxies())]
29
30
  token: Annotated[str | None, AfterValidator(Validators.sol_address())] = None
30
31
  token_decimals: int = -1
31
- value: Annotated[str, AfterValidator(Validators.valid_sol_or_token_expression("balance"))]
32
+ default_value: Annotated[str | None, AfterValidator(Validators.valid_sol_or_token_expression("balance"))] = None
32
33
  value_min_limit: Annotated[str | None, AfterValidator(Validators.valid_sol_or_token_expression())] = None
33
34
  delay: Annotated[str | None, AfterValidator(Validators.valid_calc_decimal_value())] = None # in seconds
34
35
  round_ndigits: int = 5
@@ -37,19 +38,28 @@ class Config(BaseConfig):
37
38
 
38
39
  @property
39
40
  def from_addresses(self) -> list[str]:
40
- return [r.from_address for r in self.routes]
41
+ return [r.from_address for r in self.transfers]
41
42
 
42
43
  @model_validator(mode="after")
43
44
  def final_validator(self) -> Self:
44
45
  if not self.private_keys.contains_all_addresses(self.from_addresses):
45
46
  raise ValueError("private keys are not set for all addresses")
46
47
 
48
+ for transfer in self.transfers: # If value is not set for a transfer, then set it to the global value of the config.
49
+ if not transfer.value and self.default_value:
50
+ transfer.value = self.default_value
51
+ for transfer in self.transfers: # Check all transfers have a value.
52
+ if not transfer.value:
53
+ raise ValueError(f"{transfer.log_prefix}: value is not set")
54
+
47
55
  if self.token:
48
- Validators.valid_token_expression("balance")(self.value)
56
+ if self.default_value:
57
+ Validators.valid_token_expression("balance")(self.default_value)
49
58
  if self.value_min_limit:
50
59
  Validators.valid_token_expression()(self.value_min_limit)
51
60
  else:
52
- Validators.valid_sol_expression("balance")(self.value)
61
+ if self.default_value:
62
+ Validators.valid_sol_expression("balance")(self.default_value)
53
63
  if self.value_min_limit:
54
64
  Validators.valid_sol_expression()(self.value_min_limit)
55
65
 
@@ -64,6 +74,7 @@ class Config(BaseConfig):
64
74
 
65
75
  class TransferCmdParams(BaseConfigParams):
66
76
  print_balances: bool
77
+ print_transfers: bool
67
78
  debug: bool
68
79
  no_confirmation: bool
69
80
  emulate: bool
@@ -74,10 +85,12 @@ def run(cmd_params: TransferCmdParams) -> None:
74
85
  config = Config.read_toml_config_or_exit(cmd_params.config_path)
75
86
 
76
87
  if cmd_params.print_config_and_exit:
77
- cli_utils.print_config(config, cmd_params.print_config_verbose, {"private_keys"}, {"proxies"})
88
+ cli_utils.print_config(config, exclude={"private_keys"}, count=None if cmd_params.debug else {"proxies"})
78
89
  sys.exit(0)
79
90
 
80
- mm_crypto_utils.init_logger(cmd_params.debug, config.log_debug, config.log_info)
91
+ if cmd_params.print_transfers:
92
+ _print_transfers(config)
93
+ sys.exit(0)
81
94
 
82
95
  if cmd_params.print_balances:
83
96
  _print_balances(config)
@@ -87,23 +100,25 @@ def run(cmd_params: TransferCmdParams) -> None:
87
100
 
88
101
 
89
102
  def _run_transfers(config: Config, cmd_params: TransferCmdParams) -> None:
103
+ mm_crypto_utils.init_logger(cmd_params.debug, config.log_debug, config.log_info)
90
104
  logger.info(f"transfer {cmd_params.config_path}: started at {utc_now()} UTC")
91
105
  logger.debug(f"config={config.model_dump(exclude={'private_keys'}) | {'version': cli_utils.get_version()}}")
92
- for i, route in enumerate(config.routes):
106
+ for i, route in enumerate(config.transfers):
93
107
  _transfer(route, config, cmd_params)
94
- if not cmd_params.emulate and config.delay is not None and i < len(config.routes) - 1:
108
+ if config.delay is not None and i < len(config.transfers) - 1:
95
109
  delay_value = mm_crypto_utils.calc_decimal_value(config.delay)
96
- logger.debug(f"delay {delay_value} seconds")
97
- time.sleep(float(delay_value))
110
+ logger.info(f"delay {delay_value} seconds")
111
+ if not cmd_params.emulate:
112
+ time.sleep(float(delay_value))
98
113
  logger.info(f"transfer {cmd_params.config_path}: finished at {utc_now()} UTC")
99
114
 
100
115
 
101
- def _calc_value(route: TxRoute, config: Config, transfer_sol_fee: int) -> int | None:
116
+ def _calc_value(transfer: Transfer, config: Config, transfer_sol_fee: int) -> int | None:
102
117
  if config.token:
103
118
  value_res = calcs.calc_token_value_for_address(
104
119
  nodes=config.nodes,
105
- value_expression=config.value,
106
- wallet_address=route.from_address,
120
+ value_expression=transfer.value,
121
+ wallet_address=transfer.from_address,
107
122
  proxies=config.proxies,
108
123
  token_mint_address=config.token,
109
124
  token_decimals=config.token_decimals,
@@ -111,19 +126,19 @@ def _calc_value(route: TxRoute, config: Config, transfer_sol_fee: int) -> int |
111
126
  else:
112
127
  value_res = calcs.calc_sol_value_for_address(
113
128
  nodes=config.nodes,
114
- value_expression=config.value,
115
- address=route.from_address,
129
+ value_expression=transfer.value,
130
+ address=transfer.from_address,
116
131
  proxies=config.proxies,
117
132
  fee=transfer_sol_fee,
118
133
  )
119
- logger.debug(f"{route.log_prefix}: value={value_res.ok_or_err()}")
134
+ logger.debug(f"{transfer.log_prefix}: value={value_res.ok_or_err()}")
120
135
  if isinstance(value_res, Err):
121
- logger.info(f"{route.log_prefix}: calc value error, {value_res.err}")
136
+ logger.info(f"{transfer.log_prefix}: calc value error, {value_res.err}")
122
137
 
123
138
  return value_res.ok
124
139
 
125
140
 
126
- def _check_value_min_limit(route: TxRoute, value: int, config: Config) -> bool:
141
+ def _check_value_min_limit(transfer: Transfer, value: int, config: Config) -> bool:
127
142
  """Returns False if the transfer should be skipped."""
128
143
  if config.value_min_limit:
129
144
  if config.token:
@@ -131,7 +146,7 @@ def _check_value_min_limit(route: TxRoute, value: int, config: Config) -> bool:
131
146
  else:
132
147
  value_min_limit = calcs.calc_sol_expression(config.value_min_limit)
133
148
  if value < value_min_limit:
134
- logger.info(f"{route.log_prefix}: value<value_min_limit, value={_value_with_suffix(value, config)}")
149
+ logger.info(f"{transfer.log_prefix}: value<value_min_limit, value={_value_with_suffix(value, config)}")
135
150
  return True
136
151
 
137
152
 
@@ -141,62 +156,70 @@ def _value_with_suffix(value: int, config: Config) -> str:
141
156
  return f"{lamports_to_sol(value, config.round_ndigits)}sol"
142
157
 
143
158
 
144
- def _send_tx(route: TxRoute, value: int, config: Config) -> Signature | None:
145
- logger.debug(f"{route.log_prefix}: value={_value_with_suffix(value, config)}")
159
+ def _send_tx(transfer: Transfer, value: int, config: Config) -> Signature | None:
160
+ logger.debug(f"{transfer.log_prefix}: value={_value_with_suffix(value, config)}")
146
161
  if config.token:
147
- res = transfer.transfer_token_with_retries(
162
+ res = transfer_token_with_retries(
148
163
  nodes=config.nodes,
149
164
  token_mint_address=config.token,
150
- from_address=route.from_address,
151
- private_key=config.private_keys[route.from_address],
152
- to_address=route.to_address,
165
+ from_address=transfer.from_address,
166
+ private_key=config.private_keys[transfer.from_address],
167
+ to_address=transfer.to_address,
153
168
  amount=value,
154
169
  decimals=config.token_decimals,
155
170
  proxies=config.proxies,
156
171
  retries=3,
157
172
  )
158
173
  else:
159
- res = transfer.transfer_sol_with_retries(
174
+ res = transfer_sol_with_retries(
160
175
  nodes=config.nodes,
161
- from_address=route.from_address,
162
- private_key=config.private_keys[route.from_address],
163
- to_address=route.to_address,
176
+ from_address=transfer.from_address,
177
+ private_key=config.private_keys[transfer.from_address],
178
+ to_address=transfer.to_address,
164
179
  lamports=value,
165
180
  proxies=config.proxies,
166
181
  retries=3,
167
182
  )
168
183
 
169
184
  if isinstance(res, Err):
170
- logger.info(f"{route.log_prefix}: tx error {res.err}")
185
+ logger.info(f"{transfer.log_prefix}: tx error {res.err}")
171
186
  return None
172
187
  return res.ok
173
188
 
174
189
 
175
- def _transfer(route: TxRoute, config: Config, cmd_params: TransferCmdParams) -> None:
190
+ def _transfer(transfer: Transfer, config: Config, cmd_params: TransferCmdParams) -> None:
176
191
  transfer_sol_fee = 5000
177
192
 
178
- value = _calc_value(route, config, transfer_sol_fee)
193
+ value = _calc_value(transfer, config, transfer_sol_fee)
179
194
  if value is None:
180
195
  return
181
196
 
182
- if not _check_value_min_limit(route, value, config):
197
+ if not _check_value_min_limit(transfer, value, config):
183
198
  return
184
199
 
185
200
  if cmd_params.emulate:
186
- logger.info(f"{route.log_prefix}: emulate, value={_value_with_suffix(value, config)}")
201
+ logger.info(f"{transfer.log_prefix}: emulate, value={_value_with_suffix(value, config)}")
187
202
  return
188
203
 
189
- signature = _send_tx(route, value, config)
204
+ signature = _send_tx(transfer, value, config)
190
205
  if signature is None:
191
206
  return
192
207
 
193
208
  status = "UNKNOWN"
194
209
  if not cmd_params.no_confirmation:
195
- logger.debug(f"{route.log_prefix}: waiting for confirmation, sig={signature}")
196
- if cli_utils.wait_confirmation(config.nodes, config.proxies, signature, route.log_prefix):
210
+ logger.debug(f"{transfer.log_prefix}: waiting for confirmation, sig={signature}")
211
+ if cli_utils.wait_confirmation(config.nodes, config.proxies, signature, transfer.log_prefix):
197
212
  status = "OK"
198
213
 
199
- logger.info(f"{route.log_prefix}: sig={signature}, value={_value_with_suffix(value, config)}, status={status}")
214
+ logger.info(f"{transfer.log_prefix}: sig={signature}, value={_value_with_suffix(value, config)}, status={status}")
215
+
216
+
217
+ def _print_transfers(config: Config) -> None:
218
+ table = Table("n", "from_address", "to_address", "value", title="transfers")
219
+ for count, transfer in enumerate(config.transfers, start=1):
220
+ table.add_row(str(count), transfer.from_address, transfer.to_address, transfer.value)
221
+ console = Console()
222
+ console.print(table)
200
223
 
201
224
 
202
225
  def _print_balances(config: Config) -> None:
@@ -206,7 +229,7 @@ def _print_balances(config: Config) -> None:
206
229
  headers = ["n", "from_address", "sol", "to_address", "sol"]
207
230
  table = Table(*headers, title="balances")
208
231
  with Live(table, refresh_per_second=0.5):
209
- for count, route in enumerate(config.routes):
232
+ for count, route in enumerate(config.transfers):
210
233
  from_sol_balance = _get_sol_balance_str(route.from_address, config)
211
234
  to_sol_balance = _get_sol_balance_str(route.to_address, config)
212
235
  from_t_balance = _get_token_balance_str(route.from_address, config) if config.token else ""
@@ -2,9 +2,11 @@ accounts = """
2
2
  9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM # binance
3
3
  61aq585V8cR2sZBeawJFt2NPqmN7zDi1sws4KLs5xHXV # Jupiter cold wallet
4
4
  """
5
+
5
6
  tokens = """
6
7
  EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v # USDC
7
8
  JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN # JUP
8
9
  """
10
+
9
11
  nodes = "https://api.mainnet-beta.solana.com"
10
12
  # proxies = "env_url: MM_SOL_PROXIES_URL"
@@ -0,0 +1,35 @@
1
+ # Each line is a transfer instruction, with format: from_address to_address [value]
2
+ # Value is optional. If value is not set, default_value will be used
3
+ # value is an expression that can contain variable 'balance' and 'random' function
4
+ transfers = """
5
+ # for sol transfer use 'sol' suffix, example: 1.2sol. For other tokens use 't' suffix, example: 1.2t
6
+ Bd8CxCTLez2ckVTqEJjuZkWjYFSRbo8fA1qYbd7yFVP9 Eaft9xXzfgbRqsHd65WspoaxTtH7pkznM9YA8tsDKGwj 1.2t
7
+ Fc2TRJVCpFZpRz56mFnQETctib1zwFnwHcS7HoQSgUzZ EVJctTWikt29rUXBf49tyQdK87x837HtvpCwqeSjp1Ur 0.6balance-random(1t,2.50t)-100
8
+ 6TW4WswDgGmEB5HELBtEdwC1tQJq9Xa1msDjPw94sgai GGb7gb5EzW8GZZWX552eiC9r1SY4Pqtgbqf9UMrBrEzy # default_value will be used
9
+ file: /path/to/other/transfers.txt # transfers from this file will be added
10
+ """
11
+
12
+ token = "6VBTMLgv256c7scudNf8T5GoTJcEE8WfgcJhxbGYPQ8G" # if token is not specified, then SOL is used
13
+
14
+ private_keys = """
15
+ 5VTfgpKKkckrsK33vcw6cEgv8SjLiwaorU8sd2ftjo2sx4tCV6N44dF4P9VigLaKNT2vpX3VuiFAiNpEBnMq3CiB
16
+ DE9poAKvs6tENFbADZ25W1zfKeiCbuDnFbafkBgo4rT28ZGkemqnF1zAqX9WGvBKUXSRVhXgX1RHe3qn11xfjR8
17
+ file: ./path/to/privates.txt
18
+ # Extra keys are not a problem, nor is their order.
19
+ """
20
+
21
+ # default_value is used if transfer.value is not set in transfers. It's optional.
22
+ default_value = "0.2balance+random(1t,2.50t)-100" # If transferring SOL, the suffix ‘sol’ is used. For any other tokens, the suffix ‘t’ is used.
23
+
24
+ delay = "random(10, 100)" # seconds, optional
25
+
26
+ proxies = """
27
+ http://usr:pass@123.123.123.123:1234
28
+ env_url: MM_SOL_PROXIES_URL
29
+ url: https://site.com/api/proxies
30
+ """
31
+
32
+ nodes = """
33
+ https://api.devnet.solana.com
34
+ http://localhost:8899
35
+ """
@@ -1,6 +1,6 @@
1
1
  from collections.abc import Callable
2
2
 
3
- from mm_crypto_utils import AddressToPrivate, ConfigValidators, TxRoute
3
+ from mm_crypto_utils import AddressToPrivate, ConfigValidators, Transfer
4
4
 
5
5
  from mm_sol.account import get_public_key, is_address
6
6
  from mm_sol.constants import SUFFIX_DECIMALS
@@ -16,8 +16,8 @@ class Validators(ConfigValidators):
16
16
  return ConfigValidators.addresses(unique, is_address=is_address)
17
17
 
18
18
  @staticmethod
19
- def sol_routes() -> Callable[[str], list[TxRoute]]:
20
- return ConfigValidators.routes(is_address)
19
+ def sol_transfers() -> Callable[[str], list[Transfer]]:
20
+ return ConfigValidators.transfers(is_address)
21
21
 
22
22
  @staticmethod
23
23
  def sol_private_keys() -> Callable[[str], AddressToPrivate]:
@@ -196,33 +196,37 @@ wheels = [
196
196
 
197
197
  [[package]]
198
198
  name = "cryptography"
199
- version = "44.0.0"
199
+ version = "44.0.1"
200
200
  source = { registry = "https://pypi.org/simple" }
201
201
  dependencies = [
202
202
  { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
203
203
  ]
204
- sdist = { url = "https://files.pythonhosted.org/packages/91/4c/45dfa6829acffa344e3967d6006ee4ae8be57af746ae2eba1c431949b32c/cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", size = 710657 }
205
- wheels = [
206
- { url = "https://files.pythonhosted.org/packages/55/09/8cc67f9b84730ad330b3b72cf867150744bf07ff113cda21a15a1c6d2c7c/cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", size = 6541833 },
207
- { url = "https://files.pythonhosted.org/packages/7e/5b/3759e30a103144e29632e7cb72aec28cedc79e514b2ea8896bb17163c19b/cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", size = 3922710 },
208
- { url = "https://files.pythonhosted.org/packages/5f/58/3b14bf39f1a0cfd679e753e8647ada56cddbf5acebffe7db90e184c76168/cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", size = 4137546 },
209
- { url = "https://files.pythonhosted.org/packages/98/65/13d9e76ca19b0ba5603d71ac8424b5694415b348e719db277b5edc985ff5/cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", size = 3915420 },
210
- { url = "https://files.pythonhosted.org/packages/b1/07/40fe09ce96b91fc9276a9ad272832ead0fddedcba87f1190372af8e3039c/cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", size = 4154498 },
211
- { url = "https://files.pythonhosted.org/packages/75/ea/af65619c800ec0a7e4034207aec543acdf248d9bffba0533342d1bd435e1/cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", size = 3932569 },
212
- { url = "https://files.pythonhosted.org/packages/c7/af/d1deb0c04d59612e3d5e54203159e284d3e7a6921e565bb0eeb6269bdd8a/cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", size = 4016721 },
213
- { url = "https://files.pythonhosted.org/packages/bd/69/7ca326c55698d0688db867795134bdfac87136b80ef373aaa42b225d6dd5/cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", size = 4240915 },
214
- { url = "https://files.pythonhosted.org/packages/ef/d4/cae11bf68c0f981e0413906c6dd03ae7fa864347ed5fac40021df1ef467c/cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", size = 2757925 },
215
- { url = "https://files.pythonhosted.org/packages/64/b1/50d7739254d2002acae64eed4fc43b24ac0cc44bf0a0d388d1ca06ec5bb1/cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", size = 3202055 },
216
- { url = "https://files.pythonhosted.org/packages/11/18/61e52a3d28fc1514a43b0ac291177acd1b4de00e9301aaf7ef867076ff8a/cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", size = 6542801 },
217
- { url = "https://files.pythonhosted.org/packages/1a/07/5f165b6c65696ef75601b781a280fc3b33f1e0cd6aa5a92d9fb96c410e97/cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", size = 3922613 },
218
- { url = "https://files.pythonhosted.org/packages/28/34/6b3ac1d80fc174812486561cf25194338151780f27e438526f9c64e16869/cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", size = 4137925 },
219
- { url = "https://files.pythonhosted.org/packages/d0/c7/c656eb08fd22255d21bc3129625ed9cd5ee305f33752ef2278711b3fa98b/cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", size = 3915417 },
220
- { url = "https://files.pythonhosted.org/packages/ef/82/72403624f197af0db6bac4e58153bc9ac0e6020e57234115db9596eee85d/cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", size = 4155160 },
221
- { url = "https://files.pythonhosted.org/packages/a2/cd/2f3c440913d4329ade49b146d74f2e9766422e1732613f57097fea61f344/cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", size = 3932331 },
222
- { url = "https://files.pythonhosted.org/packages/7f/df/8be88797f0a1cca6e255189a57bb49237402b1880d6e8721690c5603ac23/cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", size = 4017372 },
223
- { url = "https://files.pythonhosted.org/packages/af/36/5ccc376f025a834e72b8e52e18746b927f34e4520487098e283a719c205e/cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", size = 4239657 },
224
- { url = "https://files.pythonhosted.org/packages/46/b0/f4f7d0d0bcfbc8dd6296c1449be326d04217c57afb8b2594f017eed95533/cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", size = 2758672 },
225
- { url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", size = 3202071 },
204
+ sdist = { url = "https://files.pythonhosted.org/packages/c7/67/545c79fe50f7af51dbad56d16b23fe33f63ee6a5d956b3cb68ea110cbe64/cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14", size = 710819 }
205
+ wheels = [
206
+ { 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 },
207
+ { 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 },
208
+ { 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 },
209
+ { 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 },
210
+ { 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 },
211
+ { 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 },
212
+ { 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 },
213
+ { 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 },
214
+ { 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 },
215
+ { 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 },
216
+ { url = "https://files.pythonhosted.org/packages/38/78/74ea9eb547d13c34e984e07ec8a473eb55b19c1451fe7fc8077c6a4b0548/cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a", size = 2771882 },
217
+ { url = "https://files.pythonhosted.org/packages/cf/6c/3907271ee485679e15c9f5e93eac6aa318f859b0aed8d369afd636fafa87/cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00", size = 3206989 },
218
+ { 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 },
219
+ { 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 },
220
+ { 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 },
221
+ { 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 },
222
+ { 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 },
223
+ { 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 },
224
+ { 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 },
225
+ { 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 },
226
+ { 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 },
227
+ { 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 },
228
+ { url = "https://files.pythonhosted.org/packages/30/6f/4eca9e2e0f13ae459acd1ca7d9f0257ab86e68f44304847610afcb813dc9/cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9", size = 2772371 },
229
+ { url = "https://files.pythonhosted.org/packages/d2/05/5533d30f53f10239616a357f080892026db2d550a40c393d0a8a7af834a9/cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f", size = 3207303 },
226
230
  ]
227
231
 
228
232
  [[package]]
@@ -298,19 +302,6 @@ wheels = [
298
302
  { url = "https://files.pythonhosted.org/packages/d5/34/e8b383f35b77c402d28563d2b8f83159319b509bc5f760b15d60b0abf165/hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c", size = 32611 },
299
303
  ]
300
304
 
301
- [[package]]
302
- name = "html5lib"
303
- version = "1.1"
304
- source = { registry = "https://pypi.org/simple" }
305
- dependencies = [
306
- { name = "six" },
307
- { name = "webencodings" },
308
- ]
309
- sdist = { url = "https://files.pythonhosted.org/packages/ac/b6/b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2/html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f", size = 272215 }
310
- wheels = [
311
- { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173 },
312
- ]
313
-
314
305
  [[package]]
315
306
  name = "httpcore"
316
307
  version = "1.0.7"
@@ -481,22 +472,23 @@ wheels = [
481
472
 
482
473
  [[package]]
483
474
  name = "mm-crypto-utils"
484
- version = "0.1.5"
475
+ version = "0.2.4"
485
476
  source = { registry = "https://pypi.org/simple" }
486
477
  dependencies = [
487
478
  { name = "loguru" },
488
479
  { name = "mm-std" },
489
480
  ]
490
481
  wheels = [
491
- { url = "https://files.pythonhosted.org/packages/2f/81/65963aa5b653b33c69235a9f5cb2d3a0b29d1e985a9325782d9ddad94ec7/mm_crypto_utils-0.1.5-py3-none-any.whl", hash = "sha256:3ee4d35c5f6d2cf6c4d9b192992be75abf8b6afd477528857021f5d958ce5779", size = 7779 },
482
+ { url = "https://files.pythonhosted.org/packages/1b/80/261c463cad1176b14d92b7390328f89184307f201d9d3117012abe5e8a72/mm_crypto_utils-0.2.4-py3-none-any.whl", hash = "sha256:487214228ce79ffb9a8afeef13d67b578393558d03a0268d4b7747174f9ac7ce", size = 8255 },
492
483
  ]
493
484
 
494
485
  [[package]]
495
486
  name = "mm-sol"
496
- version = "0.4.0"
487
+ version = "0.5.1"
497
488
  source = { editable = "." }
498
489
  dependencies = [
499
490
  { name = "base58" },
491
+ { name = "cryptography" },
500
492
  { name = "jinja2" },
501
493
  { name = "mm-crypto-utils" },
502
494
  { name = "mnemonic" },
@@ -517,10 +509,11 @@ dev = [
517
509
  [package.metadata]
518
510
  requires-dist = [
519
511
  { name = "base58", specifier = "~=2.1.1" },
512
+ { name = "cryptography", specifier = ">=44.0.1" },
520
513
  { name = "jinja2", specifier = ">=3.1.5" },
521
- { name = "mm-crypto-utils", specifier = ">=0.1.5" },
514
+ { name = "mm-crypto-utils", specifier = ">=0.2.4" },
522
515
  { name = "mnemonic", specifier = "==0.21" },
523
- { name = "solana", specifier = "~=0.36.3" },
516
+ { name = "solana", specifier = "~=0.36.5" },
524
517
  { name = "typer", specifier = ">=0.15.1" },
525
518
  ]
526
519
 
@@ -528,15 +521,15 @@ requires-dist = [
528
521
  dev = [
529
522
  { name = "bandit", specifier = "~=1.8.2" },
530
523
  { name = "mypy", specifier = "~=1.15.0" },
531
- { name = "pip-audit", specifier = "~=2.7.3" },
524
+ { name = "pip-audit", specifier = "~=2.8.0" },
532
525
  { name = "pytest", specifier = "~=8.3.4" },
533
526
  { name = "pytest-xdist", specifier = "~=3.6.1" },
534
- { name = "ruff", specifier = "~=0.9.4" },
527
+ { name = "ruff", specifier = "~=0.9.6" },
535
528
  ]
536
529
 
537
530
  [[package]]
538
531
  name = "mm-std"
539
- version = "0.2.1"
532
+ version = "0.3.0"
540
533
  source = { registry = "https://pypi.org/simple" }
541
534
  dependencies = [
542
535
  { name = "cryptography" },
@@ -548,7 +541,7 @@ dependencies = [
548
541
  { name = "rich" },
549
542
  ]
550
543
  wheels = [
551
- { url = "https://files.pythonhosted.org/packages/f3/ef/cb423cc357cc116313fcd97e9d0ff673234f5f1725f4a73929ced27b1d00/mm_std-0.2.1-py3-none-any.whl", hash = "sha256:71fa84f2fa897901c925614327123e8d0bc6ae61ff7873479dc9a53889442237", size = 14620 },
544
+ { url = "https://files.pythonhosted.org/packages/41/b3/8e14a0eaf34b2db3f4c97eacafff63d63bb8c28f7baf718b3bc99f948dc2/mm_std-0.3.0-py3-none-any.whl", hash = "sha256:3aaab32cb88c29741d7a37cea4b2cb74548ec9b94ea4f8ebf0149f678ad921a3", size = 14693 },
552
545
  ]
553
546
 
554
547
  [[package]]
@@ -674,22 +667,22 @@ wheels = [
674
667
 
675
668
  [[package]]
676
669
  name = "pip-audit"
677
- version = "2.7.3"
670
+ version = "2.8.0"
678
671
  source = { registry = "https://pypi.org/simple" }
679
672
  dependencies = [
680
673
  { name = "cachecontrol", extra = ["filecache"] },
681
674
  { name = "cyclonedx-python-lib" },
682
- { name = "html5lib" },
683
675
  { name = "packaging" },
684
676
  { name = "pip-api" },
685
677
  { name = "pip-requirements-parser" },
678
+ { name = "platformdirs" },
686
679
  { name = "requests" },
687
680
  { name = "rich" },
688
681
  { name = "toml" },
689
682
  ]
690
- sdist = { url = "https://files.pythonhosted.org/packages/46/2f/d030d0d3a50b776f910dd87dc1d57dd4a27bfad176b85882f463632e4747/pip_audit-2.7.3.tar.gz", hash = "sha256:08891bbf179bffe478521f150818112bae998424f58bf9285c0078965aef38bc", size = 50365 }
683
+ sdist = { url = "https://files.pythonhosted.org/packages/e8/c8/44ccea85bd2024f1ebe55eb6cdaf1f2183359176689eed3c0b01926c24ad/pip_audit-2.8.0.tar.gz", hash = "sha256:9816cbd94de6f618a8965c117433006b3d565a708dc05d5a7be47ab65b66fa05", size = 51073 }
691
684
  wheels = [
692
- { url = "https://files.pythonhosted.org/packages/4d/4a/c908ec8a527698a6539b431d70454e18aef04d4190ff48107ed4d3df99ff/pip_audit-2.7.3-py3-none-any.whl", hash = "sha256:46a11faee3323f76adf7987de8171daeb660e8f57d8088cc27fb1c1e5c7747b0", size = 56266 },
685
+ { url = "https://files.pythonhosted.org/packages/11/0c/be5c42643284b2cfc5d9d36b576b7465268a163bd7df481a3979a3d87a0b/pip_audit-2.8.0-py3-none-any.whl", hash = "sha256:200f50d56cb6fba3a9189c20d53250354f72f161d63b6ef77ae5de2b53044566", size = 57002 },
693
686
  ]
694
687
 
695
688
  [[package]]
@@ -705,6 +698,15 @@ wheels = [
705
698
  { url = "https://files.pythonhosted.org/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", size = 35648 },
706
699
  ]
707
700
 
701
+ [[package]]
702
+ name = "platformdirs"
703
+ version = "4.3.6"
704
+ source = { registry = "https://pypi.org/simple" }
705
+ sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 }
706
+ wheels = [
707
+ { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 },
708
+ ]
709
+
708
710
  [[package]]
709
711
  name = "pluggy"
710
712
  version = "1.5.0"
@@ -911,27 +913,27 @@ wheels = [
911
913
 
912
914
  [[package]]
913
915
  name = "ruff"
914
- version = "0.9.4"
915
- source = { registry = "https://pypi.org/simple" }
916
- sdist = { url = "https://files.pythonhosted.org/packages/c0/17/529e78f49fc6f8076f50d985edd9a2cf011d1dbadb1cdeacc1d12afc1d26/ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7", size = 3599458 }
917
- wheels = [
918
- { url = "https://files.pythonhosted.org/packages/b6/f8/3fafb7804d82e0699a122101b5bee5f0d6e17c3a806dcbc527bb7d3f5b7a/ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706", size = 11668400 },
919
- { url = "https://files.pythonhosted.org/packages/2e/a6/2efa772d335da48a70ab2c6bb41a096c8517ca43c086ea672d51079e3d1f/ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf", size = 11628395 },
920
- { url = "https://files.pythonhosted.org/packages/dc/d7/cd822437561082f1c9d7225cc0d0fbb4bad117ad7ac3c41cd5d7f0fa948c/ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b", size = 11090052 },
921
- { url = "https://files.pythonhosted.org/packages/9e/67/3660d58e893d470abb9a13f679223368ff1684a4ef40f254a0157f51b448/ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137", size = 11882221 },
922
- { url = "https://files.pythonhosted.org/packages/79/d1/757559995c8ba5f14dfec4459ef2dd3fcea82ac43bc4e7c7bf47484180c0/ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e", size = 11424862 },
923
- { url = "https://files.pythonhosted.org/packages/c0/96/7915a7c6877bb734caa6a2af424045baf6419f685632469643dbd8eb2958/ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec", size = 12626735 },
924
- { url = "https://files.pythonhosted.org/packages/0e/cc/dadb9b35473d7cb17c7ffe4737b4377aeec519a446ee8514123ff4a26091/ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b", size = 13255976 },
925
- { url = "https://files.pythonhosted.org/packages/5f/c3/ad2dd59d3cabbc12df308cced780f9c14367f0321e7800ca0fe52849da4c/ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a", size = 12752262 },
926
- { url = "https://files.pythonhosted.org/packages/c7/17/5f1971e54bd71604da6788efd84d66d789362b1105e17e5ccc53bba0289b/ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214", size = 14401648 },
927
- { url = "https://files.pythonhosted.org/packages/30/24/6200b13ea611b83260501b6955b764bb320e23b2b75884c60ee7d3f0b68e/ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231", size = 12414702 },
928
- { url = "https://files.pythonhosted.org/packages/34/cb/f5d50d0c4ecdcc7670e348bd0b11878154bc4617f3fdd1e8ad5297c0d0ba/ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b", size = 11859608 },
929
- { url = "https://files.pythonhosted.org/packages/d6/f4/9c8499ae8426da48363bbb78d081b817b0f64a9305f9b7f87eab2a8fb2c1/ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6", size = 11485702 },
930
- { url = "https://files.pythonhosted.org/packages/18/59/30490e483e804ccaa8147dd78c52e44ff96e1c30b5a95d69a63163cdb15b/ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c", size = 12067782 },
931
- { url = "https://files.pythonhosted.org/packages/3d/8c/893fa9551760b2f8eb2a351b603e96f15af167ceaf27e27ad873570bc04c/ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0", size = 12483087 },
932
- { url = "https://files.pythonhosted.org/packages/23/15/f6751c07c21ca10e3f4a51ea495ca975ad936d780c347d9808bcedbd7182/ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402", size = 9852302 },
933
- { url = "https://files.pythonhosted.org/packages/12/41/2d2d2c6a72e62566f730e49254f602dfed23019c33b5b21ea8f8917315a1/ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e", size = 10850051 },
934
- { url = "https://files.pythonhosted.org/packages/c6/e6/3d6ec3bc3d254e7f005c543a661a41c3e788976d0e52a1ada195bd664344/ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41", size = 10078251 },
916
+ version = "0.9.6"
917
+ source = { registry = "https://pypi.org/simple" }
918
+ sdist = { url = "https://files.pythonhosted.org/packages/2a/e1/e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be/ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9", size = 3639454 }
919
+ wheels = [
920
+ { url = "https://files.pythonhosted.org/packages/76/e3/3d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be/ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba", size = 11714128 },
921
+ { 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 },
922
+ { 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 },
923
+ { 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 },
924
+ { 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 },
925
+ { 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 },
926
+ { 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 },
927
+ { 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 },
928
+ { 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 },
929
+ { 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 },
930
+ { 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 },
931
+ { 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 },
932
+ { 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 },
933
+ { 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 },
934
+ { url = "https://files.pythonhosted.org/packages/a5/7d/7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2/ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d", size = 9949214 },
935
+ { url = "https://files.pythonhosted.org/packages/ee/30/c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37/ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa", size = 10999914 },
936
+ { url = "https://files.pythonhosted.org/packages/e8/a8/d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c/ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a", size = 10177499 },
935
937
  ]
936
938
 
937
939
  [[package]]
@@ -943,15 +945,6 @@ wheels = [
943
945
  { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 },
944
946
  ]
945
947
 
946
- [[package]]
947
- name = "six"
948
- version = "1.16.0"
949
- source = { registry = "https://pypi.org/simple" }
950
- sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041 }
951
- wheels = [
952
- { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 },
953
- ]
954
-
955
948
  [[package]]
956
949
  name = "sniffio"
957
950
  version = "1.3.1"
@@ -972,7 +965,7 @@ wheels = [
972
965
 
973
966
  [[package]]
974
967
  name = "solana"
975
- version = "0.36.3"
968
+ version = "0.36.5"
976
969
  source = { registry = "https://pypi.org/simple" }
977
970
  dependencies = [
978
971
  { name = "construct-typing" },
@@ -981,9 +974,9 @@ dependencies = [
981
974
  { name = "typing-extensions" },
982
975
  { name = "websockets" },
983
976
  ]
984
- sdist = { url = "https://files.pythonhosted.org/packages/34/d6/5c8b044ab5d4566a74bd2880785ec0d8e5b5e0c5f90dc2a5245b114788c9/solana-0.36.3.tar.gz", hash = "sha256:b0d46ea1e196425945d78e50f541fd67fe3c116f411b950bbc8f33dd5aef5f19", size = 52018 }
977
+ sdist = { url = "https://files.pythonhosted.org/packages/c8/e7/18ffc3d25e8f772f6b20d8dfd27a0d275576403e4d52def0a94021741506/solana-0.36.5.tar.gz", hash = "sha256:8c81de111903d01b3b5659130840ee1711092ab02982cf5e1ea851ed9ddcb011", size = 52108 }
985
978
  wheels = [
986
- { url = "https://files.pythonhosted.org/packages/a9/38/9495868167e8101e82ff2ec5b9db4e48561be9605b8f7c6bad9c84c8d530/solana-0.36.3-py3-none-any.whl", hash = "sha256:8d7c7e65d735b6e059cfc35d8fbde8edf6953cf9a9cc511d9db3a05953712625", size = 62180 },
979
+ { url = "https://files.pythonhosted.org/packages/f4/3f/9c6a8bff32b7b622ac1566c52bde16239290b9d1e042c1164bdba22fef8b/solana-0.36.5-py3-none-any.whl", hash = "sha256:6b2023ba8623841ccac96e73e374a9d0e0d450436d368178fdd0537ed308d04c", size = 62217 },
987
980
  ]
988
981
 
989
982
  [[package]]
@@ -1069,15 +1062,6 @@ wheels = [
1069
1062
  { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 },
1070
1063
  ]
1071
1064
 
1072
- [[package]]
1073
- name = "webencodings"
1074
- version = "0.5.1"
1075
- source = { registry = "https://pypi.org/simple" }
1076
- sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 }
1077
- wheels = [
1078
- { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 },
1079
- ]
1080
-
1081
1065
  [[package]]
1082
1066
  name = "websockets"
1083
1067
  version = "11.0.3"
@@ -1,23 +0,0 @@
1
- routes = """
2
- Bd8CxCTLez2ckVTqEJjuZkWjYFSRbo8fA1qYbd7yFVP9 Eaft9xXzfgbRqsHd65WspoaxTtH7pkznM9YA8tsDKGwj # comments are allowed
3
- Fc2TRJVCpFZpRz56mFnQETctib1zwFnwHcS7HoQSgUzZ EVJctTWikt29rUXBf49tyQdK87x837HtvpCwqeSjp1Ur
4
- file: /from/addresses.txt /to/addresses.txt
5
- """
6
- token = "6VBTMLgv256c7scudNf8T5GoTJcEE8WfgcJhxbGYPQ8G" # if token is not specified, then SOL is used
7
- private_keys = """
8
- 5VTfgpKKkckrsK33vcw6cEgv8SjLiwaorU8sd2ftjo2sx4tCV6N44dF4P9VigLaKNT2vpX3VuiFAiNpEBnMq3CiB
9
- DE9poAKvs6tENFbADZ25W1zfKeiCbuDnFbafkBgo4rT28ZGkemqnF1zAqX9WGvBKUXSRVhXgX1RHe3qn11xfjR8
10
- file: ./path/to/privates.txt
11
- # Extra keys are not a problem, nor is their order.
12
- """
13
- value = "0.2balance + random(1t, 2.50t) - 100" # If transferring SOL, the suffix ‘sol’ is used. For any other tokens, the suffix ‘t’ is used.
14
- delay = "random(10, 100)" # seconds, optional
15
- proxies = """
16
- http://usr:pass@123.123.123.123:1234
17
- env_url: MM_SOL_PROXIES_URL
18
- url: https://site.com/api/proxies
19
- """
20
- nodes = """
21
- https://api.devnet.solana.com
22
- http://localhost:8899
23
- """
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