mm-sol 0.4.0__py3-none-any.whl → 0.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mm_sol/cli/cli.py +2 -0
- mm_sol/cli/cli_utils.py +4 -6
- mm_sol/cli/cmd/transfer_cmd.py +65 -42
- mm_sol/cli/examples/balances.toml +2 -0
- mm_sol/cli/examples/transfer.toml +17 -5
- mm_sol/cli/validators.py +3 -3
- {mm_sol-0.4.0.dist-info → mm_sol-0.5.0.dist-info}/METADATA +3 -3
- {mm_sol-0.4.0.dist-info → mm_sol-0.5.0.dist-info}/RECORD +10 -10
- {mm_sol-0.4.0.dist-info → mm_sol-0.5.0.dist-info}/WHEEL +0 -0
- {mm_sol-0.4.0.dist-info → mm_sol-0.5.0.dist-info}/entry_points.txt +0 -0
mm_sol/cli/cli.py
CHANGED
|
@@ -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,
|
mm_sol/cli/cli_utils.py
CHANGED
|
@@ -21,12 +21,10 @@ class BaseConfigParams(BaseModel):
|
|
|
21
21
|
print_config_and_exit: bool
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
def print_config(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
mm_sol/cli/cmd/transfer_cmd.py
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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.
|
|
106
|
+
for i, route in enumerate(config.transfers):
|
|
93
107
|
_transfer(route, config, cmd_params)
|
|
94
|
-
if
|
|
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.
|
|
97
|
-
|
|
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(
|
|
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=
|
|
106
|
-
wallet_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=
|
|
115
|
-
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"{
|
|
134
|
+
logger.debug(f"{transfer.log_prefix}: value={value_res.ok_or_err()}")
|
|
120
135
|
if isinstance(value_res, Err):
|
|
121
|
-
logger.info(f"{
|
|
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(
|
|
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"{
|
|
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(
|
|
145
|
-
logger.debug(f"{
|
|
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 =
|
|
162
|
+
res = transfer_token_with_retries(
|
|
148
163
|
nodes=config.nodes,
|
|
149
164
|
token_mint_address=config.token,
|
|
150
|
-
from_address=
|
|
151
|
-
private_key=config.private_keys[
|
|
152
|
-
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 =
|
|
174
|
+
res = transfer_sol_with_retries(
|
|
160
175
|
nodes=config.nodes,
|
|
161
|
-
from_address=
|
|
162
|
-
private_key=config.private_keys[
|
|
163
|
-
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"{
|
|
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(
|
|
190
|
+
def _transfer(transfer: Transfer, config: Config, cmd_params: TransferCmdParams) -> None:
|
|
176
191
|
transfer_sol_fee = 5000
|
|
177
192
|
|
|
178
|
-
value = _calc_value(
|
|
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(
|
|
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"{
|
|
201
|
+
logger.info(f"{transfer.log_prefix}: emulate, value={_value_with_suffix(value, config)}")
|
|
187
202
|
return
|
|
188
203
|
|
|
189
|
-
signature = _send_tx(
|
|
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"{
|
|
196
|
-
if cli_utils.wait_confirmation(config.nodes, config.proxies, signature,
|
|
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"{
|
|
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.
|
|
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"
|
|
@@ -1,22 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
|
5
10
|
"""
|
|
11
|
+
|
|
6
12
|
token = "6VBTMLgv256c7scudNf8T5GoTJcEE8WfgcJhxbGYPQ8G" # if token is not specified, then SOL is used
|
|
13
|
+
|
|
7
14
|
private_keys = """
|
|
8
15
|
5VTfgpKKkckrsK33vcw6cEgv8SjLiwaorU8sd2ftjo2sx4tCV6N44dF4P9VigLaKNT2vpX3VuiFAiNpEBnMq3CiB
|
|
9
16
|
DE9poAKvs6tENFbADZ25W1zfKeiCbuDnFbafkBgo4rT28ZGkemqnF1zAqX9WGvBKUXSRVhXgX1RHe3qn11xfjR8
|
|
10
17
|
file: ./path/to/privates.txt
|
|
11
18
|
# Extra keys are not a problem, nor is their order.
|
|
12
19
|
"""
|
|
13
|
-
|
|
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
|
+
|
|
14
24
|
delay = "random(10, 100)" # seconds, optional
|
|
25
|
+
|
|
15
26
|
proxies = """
|
|
16
27
|
http://usr:pass@123.123.123.123:1234
|
|
17
28
|
env_url: MM_SOL_PROXIES_URL
|
|
18
29
|
url: https://site.com/api/proxies
|
|
19
30
|
"""
|
|
31
|
+
|
|
20
32
|
nodes = """
|
|
21
33
|
https://api.devnet.solana.com
|
|
22
34
|
http://localhost:8899
|
mm_sol/cli/validators.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from collections.abc import Callable
|
|
2
2
|
|
|
3
|
-
from mm_crypto_utils import AddressToPrivate, ConfigValidators,
|
|
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
|
|
20
|
-
return ConfigValidators.
|
|
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]:
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mm-sol
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Requires-Python: >=3.12
|
|
5
5
|
Requires-Dist: base58~=2.1.1
|
|
6
6
|
Requires-Dist: jinja2>=3.1.5
|
|
7
|
-
Requires-Dist: mm-crypto-utils>=0.
|
|
7
|
+
Requires-Dist: mm-crypto-utils>=0.2.3
|
|
8
8
|
Requires-Dist: mnemonic==0.21
|
|
9
|
-
Requires-Dist: solana~=0.36.
|
|
9
|
+
Requires-Dist: solana~=0.36.5
|
|
10
10
|
Requires-Dist: typer>=0.15.1
|
|
@@ -12,21 +12,21 @@ mm_sol/transfer.py,sha256=taf2NTLpo-bxISeaILARXEGLldUvqvP-agp5IDva7Hw,5825
|
|
|
12
12
|
mm_sol/utils.py,sha256=NE0G564GiT9d7rW_lPPxUb1eq62WiXh28xtvtzNQIqw,556
|
|
13
13
|
mm_sol/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
mm_sol/cli/calcs.py,sha256=-r9RlsQyOziTDf84uIsvTgZmsUdNrVeazu3vTj9hhNA,1887
|
|
15
|
-
mm_sol/cli/cli.py,sha256=
|
|
16
|
-
mm_sol/cli/cli_utils.py,sha256=
|
|
17
|
-
mm_sol/cli/validators.py,sha256=
|
|
15
|
+
mm_sol/cli/cli.py,sha256=a28Cy1X2bRSIAAJu2HHoPoTJYOPvff-anVcL0BJnwRI,4610
|
|
16
|
+
mm_sol/cli/cli_utils.py,sha256=nFdY8tJFZxyssEBEFCc3VTNJt447e6vMnugx4GBPL4o,1840
|
|
17
|
+
mm_sol/cli/validators.py,sha256=M_Rr7JoG3TUYTDAGkjQLDH6l9i9FOrSpss30KdY3UlM,1379
|
|
18
18
|
mm_sol/cli/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
19
|
mm_sol/cli/cmd/balance_cmd.py,sha256=DfUZY3-Hr-F7Y0xp1faol0yLnPu6iDU3b839VhdwAbw,2587
|
|
20
20
|
mm_sol/cli/cmd/balances_cmd.py,sha256=gMRZXAnCOPESsKRqz33ALPzSOqGGeZF225kMRO6sV-c,2876
|
|
21
21
|
mm_sol/cli/cmd/example_cmd.py,sha256=M5dvRg9jvpVUwxvMRiRnO77aKR7c57bMY9booxMAswM,222
|
|
22
22
|
mm_sol/cli/cmd/node_cmd.py,sha256=2AEAjq2M9f8-RZiI0rif6wITdns9QUb4Kr34QPsI2CA,238
|
|
23
|
-
mm_sol/cli/cmd/transfer_cmd.py,sha256=
|
|
23
|
+
mm_sol/cli/cmd/transfer_cmd.py,sha256=eQzD7LispR4KFMUlXdXMBGbXs7b0A-iHJHs7VkxH1UA,11021
|
|
24
24
|
mm_sol/cli/cmd/wallet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
25
|
mm_sol/cli/cmd/wallet/keypair_cmd.py,sha256=cRHVVTs9zNYmUozZ8ZlJoutn9V6r8I1AEHBrszR7dTE,538
|
|
26
26
|
mm_sol/cli/cmd/wallet/mnemonic_cmd.py,sha256=IiON_fJT5AFfIr_E1LR6_iDYZ3c_jWCFc-wSYqk61V8,648
|
|
27
|
-
mm_sol/cli/examples/balances.toml,sha256=
|
|
28
|
-
mm_sol/cli/examples/transfer.toml,sha256=
|
|
29
|
-
mm_sol-0.
|
|
30
|
-
mm_sol-0.
|
|
31
|
-
mm_sol-0.
|
|
32
|
-
mm_sol-0.
|
|
27
|
+
mm_sol/cli/examples/balances.toml,sha256=333g2EkyYBDW7OWFGMIWVZGkdFQMMo0Ag-bg-BvS4Zg,349
|
|
28
|
+
mm_sol/cli/examples/transfer.toml,sha256=kOCdmuwmhlOam4LVtlcYTKF0PoZYHWMlv9gWxNSXMOk,1624
|
|
29
|
+
mm_sol-0.5.0.dist-info/METADATA,sha256=oszZ4Bv24rOTDdMZf6y5FugE0yCiSqANtii1_NluRKc,259
|
|
30
|
+
mm_sol-0.5.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
31
|
+
mm_sol-0.5.0.dist-info/entry_points.txt,sha256=MrYnosumy9nsITSAw5TiR3WXDwsdoF0YvUIlZ38TLLs,46
|
|
32
|
+
mm_sol-0.5.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|