mm-sol 0.2.6__py3-none-any.whl → 0.2.8__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/account.py +5 -5
- mm_sol/cli/calcs.py +25 -17
- mm_sol/cli/cli.py +20 -1
- mm_sol/cli/cmd/balances_cmd.py +3 -3
- mm_sol/cli/cmd/transfer_sol_cmd.py +16 -14
- mm_sol/cli/cmd/transfer_token_cmd.py +135 -0
- mm_sol/cli/validators.py +6 -0
- mm_sol/token.py +3 -1
- {mm_sol-0.2.6.dist-info → mm_sol-0.2.8.dist-info}/METADATA +3 -3
- {mm_sol-0.2.6.dist-info → mm_sol-0.2.8.dist-info}/RECORD +12 -11
- {mm_sol-0.2.6.dist-info → mm_sol-0.2.8.dist-info}/WHEEL +0 -0
- {mm_sol-0.2.6.dist-info → mm_sol-0.2.8.dist-info}/entry_points.txt +0 -0
mm_sol/account.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import contextlib
|
|
1
2
|
import random
|
|
2
3
|
|
|
3
4
|
import base58
|
|
@@ -84,9 +85,8 @@ def is_empty_account(*, address: str, node: str | None = None, nodes: list[str]
|
|
|
84
85
|
return Err(error or "unknown response", data=data)
|
|
85
86
|
|
|
86
87
|
|
|
87
|
-
def
|
|
88
|
-
|
|
88
|
+
def is_address(pubkey: str) -> bool:
|
|
89
|
+
with contextlib.suppress(Exception):
|
|
89
90
|
Pubkey.from_string(pubkey)
|
|
90
|
-
return True
|
|
91
|
-
|
|
92
|
-
return False
|
|
91
|
+
return True
|
|
92
|
+
return False
|
mm_sol/cli/calcs.py
CHANGED
|
@@ -4,10 +4,10 @@ from decimal import Decimal
|
|
|
4
4
|
import mm_crypto_utils
|
|
5
5
|
from loguru import logger
|
|
6
6
|
from mm_crypto_utils import Nodes, Proxies
|
|
7
|
-
from mm_std import
|
|
7
|
+
from mm_std import Ok, Result
|
|
8
8
|
from mm_std.str import split_on_plus_minus_tokens
|
|
9
9
|
|
|
10
|
-
from mm_sol.balance import get_sol_balance_with_retries
|
|
10
|
+
from mm_sol.balance import get_sol_balance_with_retries, get_token_balance_with_retries
|
|
11
11
|
from mm_sol.converters import lamports_to_sol, sol_to_lamports, to_lamports
|
|
12
12
|
|
|
13
13
|
|
|
@@ -69,25 +69,33 @@ def is_sol_value_less_min_limit(value_min_limit: str | None, value: int, log_pre
|
|
|
69
69
|
return False
|
|
70
70
|
|
|
71
71
|
|
|
72
|
-
def calc_sol_value(
|
|
73
|
-
*,
|
|
74
|
-
nodes: Nodes,
|
|
75
|
-
value_str: str,
|
|
76
|
-
address: str,
|
|
77
|
-
proxies: Proxies,
|
|
78
|
-
fee: int = 5000,
|
|
79
|
-
log_prefix: str | None = None,
|
|
80
|
-
) -> int | None:
|
|
72
|
+
def calc_sol_value(*, nodes: Nodes, value_str: str, address: str, proxies: Proxies, fee: int = 5000) -> Result[int]:
|
|
81
73
|
balance_value = None
|
|
82
74
|
if "balance" in value_str.lower():
|
|
83
|
-
prefix = mm_crypto_utils.get_log_prefix(log_prefix)
|
|
84
75
|
res = get_sol_balance_with_retries(nodes, address, proxies=proxies, retries=5)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
logger.info(f"{prefix}balance error, {res.err}")
|
|
88
|
-
return None
|
|
76
|
+
if res.is_err():
|
|
77
|
+
return res
|
|
89
78
|
balance_value = res.ok
|
|
90
79
|
value = calc_var_value(value_str, var_name="balance", var_value=balance_value)
|
|
91
80
|
if "balance" in value_str.lower():
|
|
92
81
|
value = value - fee
|
|
93
|
-
return value
|
|
82
|
+
return Ok(value)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def calc_token_value(
|
|
86
|
+
*, nodes: Nodes, value_str: str, wallet_address: str, token_mint_address: str, token_decimals: int, proxies: Proxies
|
|
87
|
+
) -> Result[int]:
|
|
88
|
+
balance_value = None
|
|
89
|
+
if "balance" in value_str.lower():
|
|
90
|
+
res = get_token_balance_with_retries(
|
|
91
|
+
nodes=nodes,
|
|
92
|
+
owner_address=wallet_address,
|
|
93
|
+
token_mint_address=token_mint_address,
|
|
94
|
+
proxies=proxies,
|
|
95
|
+
retries=5,
|
|
96
|
+
)
|
|
97
|
+
if res.is_err():
|
|
98
|
+
return res
|
|
99
|
+
balance_value = res.ok
|
|
100
|
+
value = calc_var_value(value_str, var_name="balance", var_value=balance_value, decimals=token_decimals)
|
|
101
|
+
return Ok(value)
|
mm_sol/cli/cli.py
CHANGED
|
@@ -5,7 +5,7 @@ import typer
|
|
|
5
5
|
from mm_std import print_plain
|
|
6
6
|
|
|
7
7
|
from . import cli_utils
|
|
8
|
-
from .cmd import balance_cmd, balances_cmd, example_cmd, node_cmd, transfer_sol_cmd
|
|
8
|
+
from .cmd import balance_cmd, balances_cmd, example_cmd, node_cmd, transfer_sol_cmd, transfer_token_cmd
|
|
9
9
|
from .cmd.wallet import keypair_cmd, new_cmd
|
|
10
10
|
|
|
11
11
|
app = typer.Typer(no_args_is_help=True, pretty_exceptions_enable=False, add_completion=False)
|
|
@@ -73,6 +73,25 @@ def transfer_sol_command(
|
|
|
73
73
|
)
|
|
74
74
|
|
|
75
75
|
|
|
76
|
+
@app.command(name="transfer-token", help="Transfer token from one or many accounts")
|
|
77
|
+
def transfer_token_command(
|
|
78
|
+
config_path: str,
|
|
79
|
+
print_balances: bool = typer.Option(False, "--balances", "-b", help="Print balances and exit"),
|
|
80
|
+
print_config: bool = typer.Option(False, "--config", "-c", help="Print config and exit"),
|
|
81
|
+
emulate: bool = typer.Option(False, "--emulate", "-e", help="Emulate transaction posting"),
|
|
82
|
+
no_confirmation: bool = typer.Option(False, "--no-confirmation", "-nc", help="Do not wait for confirmation"),
|
|
83
|
+
debug: bool = typer.Option(False, "--debug", "-d", help="Print debug info"),
|
|
84
|
+
) -> None:
|
|
85
|
+
transfer_token_cmd.run(
|
|
86
|
+
config_path,
|
|
87
|
+
print_balances=print_balances,
|
|
88
|
+
print_config=print_config,
|
|
89
|
+
debug=debug,
|
|
90
|
+
no_confirmation=no_confirmation,
|
|
91
|
+
emulate=emulate,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
76
95
|
@app.command(name="node", help="Check RPC urls")
|
|
77
96
|
def node_command(
|
|
78
97
|
urls: Annotated[list[str], typer.Argument()],
|
mm_sol/cli/cmd/balances_cmd.py
CHANGED
|
@@ -10,14 +10,14 @@ from pydantic import BeforeValidator, Field, model_validator
|
|
|
10
10
|
|
|
11
11
|
import mm_sol.converters
|
|
12
12
|
from mm_sol import balance
|
|
13
|
-
from mm_sol.account import
|
|
13
|
+
from mm_sol.account import is_address
|
|
14
14
|
from mm_sol.balance import get_token_balance_with_retries
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class Config(BaseConfig):
|
|
18
|
-
accounts: Annotated[list[str], BeforeValidator(ConfigValidators.addresses(unique=True, is_address=
|
|
18
|
+
accounts: Annotated[list[str], BeforeValidator(ConfigValidators.addresses(unique=True, is_address=is_address))]
|
|
19
19
|
nodes: Annotated[list[str], BeforeValidator(ConfigValidators.nodes())]
|
|
20
|
-
tokens: Annotated[list[str], BeforeValidator(ConfigValidators.addresses(unique=True, is_address=
|
|
20
|
+
tokens: Annotated[list[str], BeforeValidator(ConfigValidators.addresses(unique=True, is_address=is_address))]
|
|
21
21
|
proxies_url: str | None = None
|
|
22
22
|
proxies: list[str] = Field(default_factory=list)
|
|
23
23
|
|
|
@@ -6,25 +6,26 @@ from typing import Annotated, Self
|
|
|
6
6
|
|
|
7
7
|
import mm_crypto_utils
|
|
8
8
|
from loguru import logger
|
|
9
|
-
from mm_crypto_utils import AddressToPrivate,
|
|
9
|
+
from mm_crypto_utils import AddressToPrivate, TxRoute
|
|
10
10
|
from mm_std import BaseConfig, Err, utc_now
|
|
11
11
|
from pydantic import BeforeValidator, Field, model_validator
|
|
12
12
|
from solders.signature import Signature
|
|
13
13
|
|
|
14
14
|
from mm_sol import transfer
|
|
15
|
-
from mm_sol.account import get_public_key,
|
|
15
|
+
from mm_sol.account import get_public_key, is_address
|
|
16
16
|
from mm_sol.cli import calcs, cli_utils, validators
|
|
17
|
+
from mm_sol.cli.validators import Validators
|
|
17
18
|
from mm_sol.converters import lamports_to_sol
|
|
18
19
|
from mm_sol.utils import get_client
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
class Config(BaseConfig):
|
|
22
|
-
nodes: Annotated[list[str], BeforeValidator(
|
|
23
|
-
routes: Annotated[list[TxRoute], BeforeValidator(
|
|
23
|
+
nodes: Annotated[list[str], BeforeValidator(Validators.nodes())]
|
|
24
|
+
routes: Annotated[list[TxRoute], BeforeValidator(Validators.routes(is_address))]
|
|
24
25
|
routes_from_file: Path | None = None
|
|
25
26
|
routes_to_file: Path | None = None
|
|
26
27
|
private_keys: Annotated[
|
|
27
|
-
AddressToPrivate, Field(default_factory=AddressToPrivate), BeforeValidator(
|
|
28
|
+
AddressToPrivate, Field(default_factory=AddressToPrivate), BeforeValidator(Validators.private_keys(get_public_key))
|
|
28
29
|
]
|
|
29
30
|
private_keys_file: Path | None = None
|
|
30
31
|
proxies_url: str | None = None
|
|
@@ -33,8 +34,8 @@ class Config(BaseConfig):
|
|
|
33
34
|
value_min_limit: str | None = None
|
|
34
35
|
delay: str | None = None # in seconds
|
|
35
36
|
round_ndigits: int = 5
|
|
36
|
-
log_debug: Annotated[Path | None, BeforeValidator(
|
|
37
|
-
log_info: Annotated[Path | None, BeforeValidator(
|
|
37
|
+
log_debug: Annotated[Path | None, BeforeValidator(Validators.log_file())] = None
|
|
38
|
+
log_info: Annotated[Path | None, BeforeValidator(Validators.log_file())] = None
|
|
38
39
|
|
|
39
40
|
@property
|
|
40
41
|
def from_addresses(self) -> list[str]:
|
|
@@ -44,7 +45,7 @@ class Config(BaseConfig):
|
|
|
44
45
|
def final_validator(self) -> Self:
|
|
45
46
|
# routes_files
|
|
46
47
|
if self.routes_from_file and self.routes_to_file:
|
|
47
|
-
self.routes += TxRoute.from_files(self.routes_from_file, self.routes_to_file,
|
|
48
|
+
self.routes += TxRoute.from_files(self.routes_from_file, self.routes_to_file, is_address)
|
|
48
49
|
if not self.routes:
|
|
49
50
|
raise ValueError("routes is empty")
|
|
50
51
|
|
|
@@ -101,9 +102,7 @@ def run(
|
|
|
101
102
|
|
|
102
103
|
def _run_transfers(config: Config, *, no_confirmation: bool, emulate: bool) -> None:
|
|
103
104
|
logger.info(f"started at {utc_now()} UTC")
|
|
104
|
-
logger.debug(
|
|
105
|
-
f"config={config.model_dump(exclude={'private_keys', 'addresses_map', 'proxies'}) | {'version': cli_utils.get_version()}}"
|
|
106
|
-
)
|
|
105
|
+
logger.debug(f"config={config.model_dump(exclude={'private_keys'}) | {'version': cli_utils.get_version()}}")
|
|
107
106
|
for i, route in enumerate(config.routes):
|
|
108
107
|
_transfer(
|
|
109
108
|
from_address=route.from_address,
|
|
@@ -123,11 +122,14 @@ def _transfer(*, from_address: str, to_address: str, config: Config, no_confirma
|
|
|
123
122
|
log_prefix = f"{from_address}->{to_address}"
|
|
124
123
|
fee = 5000
|
|
125
124
|
# get value
|
|
126
|
-
|
|
127
|
-
nodes=config.nodes, value_str=config.value, address=from_address, proxies=config.proxies,
|
|
125
|
+
value_res = calcs.calc_sol_value(
|
|
126
|
+
nodes=config.nodes, value_str=config.value, address=from_address, proxies=config.proxies, fee=fee
|
|
128
127
|
)
|
|
129
|
-
|
|
128
|
+
logger.debug(f"{log_prefix}value={value_res.ok_or_err()}")
|
|
129
|
+
if isinstance(value_res, Err):
|
|
130
|
+
logger.info(f"{log_prefix}calc value error, {value_res.err}")
|
|
130
131
|
return
|
|
132
|
+
value = value_res.ok
|
|
131
133
|
|
|
132
134
|
# value_min_limit
|
|
133
135
|
if calcs.is_sol_value_less_min_limit(config.value_min_limit, value, log_prefix=log_prefix):
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import time
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Annotated, Self
|
|
6
|
+
|
|
7
|
+
import mm_crypto_utils
|
|
8
|
+
import typer
|
|
9
|
+
from loguru import logger
|
|
10
|
+
from mm_crypto_utils import AddressToPrivate, TxRoute
|
|
11
|
+
from mm_std import BaseConfig, Err, fatal, utc_now
|
|
12
|
+
from pydantic import AfterValidator, BeforeValidator, Field, model_validator
|
|
13
|
+
|
|
14
|
+
from mm_sol.account import get_public_key, is_address
|
|
15
|
+
from mm_sol.cli import calcs, cli_utils
|
|
16
|
+
from mm_sol.cli.validators import Validators
|
|
17
|
+
from mm_sol.token import get_decimals_with_retries
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Config(BaseConfig):
|
|
21
|
+
nodes: Annotated[list[str], BeforeValidator(Validators.nodes())]
|
|
22
|
+
routes: Annotated[list[TxRoute], BeforeValidator(Validators.routes(is_address))]
|
|
23
|
+
routes_from_file: Path | None = None
|
|
24
|
+
routes_to_file: Path | None = None
|
|
25
|
+
private_keys: Annotated[
|
|
26
|
+
AddressToPrivate, Field(default_factory=AddressToPrivate), BeforeValidator(Validators.private_keys(get_public_key))
|
|
27
|
+
]
|
|
28
|
+
private_keys_file: Path | None = None
|
|
29
|
+
proxies_url: str | None = None
|
|
30
|
+
proxies: list[str] = Field(default_factory=list)
|
|
31
|
+
token: Annotated[str, AfterValidator(Validators.address(is_address))]
|
|
32
|
+
value: str
|
|
33
|
+
value_min_limit: str | None = None
|
|
34
|
+
delay: str | None = None # in seconds
|
|
35
|
+
round_ndigits: int = 5
|
|
36
|
+
log_debug: Annotated[Path | None, BeforeValidator(Validators.log_file())] = None
|
|
37
|
+
log_info: Annotated[Path | None, BeforeValidator(Validators.log_file())] = None
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def from_addresses(self) -> list[str]:
|
|
41
|
+
return [r.from_address for r in self.routes]
|
|
42
|
+
|
|
43
|
+
@model_validator(mode="after")
|
|
44
|
+
def final_validator(self) -> Self:
|
|
45
|
+
# routes_files
|
|
46
|
+
if self.routes_from_file and self.routes_to_file:
|
|
47
|
+
self.routes += TxRoute.from_files(self.routes_from_file, self.routes_to_file, is_address)
|
|
48
|
+
if not self.routes:
|
|
49
|
+
raise ValueError("routes is empty")
|
|
50
|
+
|
|
51
|
+
# load private keys from file
|
|
52
|
+
if self.private_keys_file:
|
|
53
|
+
self.private_keys.update(AddressToPrivate.from_file(self.private_keys_file, get_public_key))
|
|
54
|
+
|
|
55
|
+
# check all private keys exist
|
|
56
|
+
if not self.private_keys.contains_all_addresses(self.from_addresses):
|
|
57
|
+
raise ValueError("private keys are not set for all addresses")
|
|
58
|
+
|
|
59
|
+
# fetch proxies from proxies_url
|
|
60
|
+
proxies_url = self.proxies_url or os.getenv("MM_PROXIES_URL", "")
|
|
61
|
+
if proxies_url:
|
|
62
|
+
self.proxies += mm_crypto_utils.fetch_proxies_or_fatal(proxies_url)
|
|
63
|
+
|
|
64
|
+
return self
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def run(
|
|
68
|
+
config_path: str,
|
|
69
|
+
*,
|
|
70
|
+
print_balances: bool,
|
|
71
|
+
print_config: bool,
|
|
72
|
+
debug: bool,
|
|
73
|
+
no_confirmation: bool,
|
|
74
|
+
emulate: bool,
|
|
75
|
+
) -> None:
|
|
76
|
+
config = Config.read_config_or_exit(config_path)
|
|
77
|
+
|
|
78
|
+
if print_config:
|
|
79
|
+
config.print_and_exit({"private_keys", "proxies"})
|
|
80
|
+
|
|
81
|
+
mm_crypto_utils.init_logger(debug, config.log_debug, config.log_info)
|
|
82
|
+
|
|
83
|
+
decimals_res = get_decimals_with_retries(config.nodes, config.token, retries=3, proxies=config.proxies)
|
|
84
|
+
if isinstance(decimals_res, Err):
|
|
85
|
+
fatal(f"can't get decimals for token={config.token}, error={decimals_res.err}")
|
|
86
|
+
|
|
87
|
+
token_decimals = decimals_res.ok
|
|
88
|
+
logger.debug(f"token decimals={token_decimals}")
|
|
89
|
+
|
|
90
|
+
if print_balances:
|
|
91
|
+
# cli_utils.print_balances(config.nodes, config.from_addresses, round_ndigits=config.round_ndigits, proxies=config.proxies) # noqa: E501
|
|
92
|
+
typer.echo("Not implemented yet")
|
|
93
|
+
sys.exit(0)
|
|
94
|
+
|
|
95
|
+
_run_transfers(config, token_decimals, no_confirmation=no_confirmation, emulate=emulate)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _run_transfers(config: Config, token_decimals: int, *, no_confirmation: bool, emulate: bool) -> None:
|
|
99
|
+
logger.info(f"started at {utc_now()} UTC")
|
|
100
|
+
logger.debug(f"config={config.model_dump(exclude={'private_keys'}) | {'version': cli_utils.get_version()}}")
|
|
101
|
+
for i, route in enumerate(config.routes):
|
|
102
|
+
_transfer(
|
|
103
|
+
route=route,
|
|
104
|
+
token_decimals=token_decimals,
|
|
105
|
+
config=config,
|
|
106
|
+
no_confirmation=no_confirmation,
|
|
107
|
+
emulate=emulate,
|
|
108
|
+
)
|
|
109
|
+
if not emulate and config.delay is not None and i < len(config.routes) - 1:
|
|
110
|
+
delay_value = mm_crypto_utils.calc_decimal_value(config.delay)
|
|
111
|
+
logger.debug(f"delay {delay_value} seconds")
|
|
112
|
+
time.sleep(float(delay_value))
|
|
113
|
+
logger.info(f"finished at {utc_now()} UTC")
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _transfer(*, route: TxRoute, config: Config, token_decimals: int, no_confirmation: bool, emulate: bool) -> None:
|
|
117
|
+
log_prefix = f"{route.from_address}->{route.to_address}"
|
|
118
|
+
fee = 5000
|
|
119
|
+
|
|
120
|
+
# get value
|
|
121
|
+
value_res = calcs.calc_token_value(
|
|
122
|
+
nodes=config.nodes,
|
|
123
|
+
value_str=config.value,
|
|
124
|
+
wallet_address=route.from_address,
|
|
125
|
+
proxies=config.proxies,
|
|
126
|
+
token_mint_address=config.token,
|
|
127
|
+
token_decimals=token_decimals,
|
|
128
|
+
)
|
|
129
|
+
logger.debug(f"{log_prefix}: value={value_res.ok_or_err()}")
|
|
130
|
+
if isinstance(value_res, Err):
|
|
131
|
+
logger.info(f"{log_prefix}: calc value error, {value_res.err}")
|
|
132
|
+
return
|
|
133
|
+
value = value_res.ok
|
|
134
|
+
|
|
135
|
+
logger.debug(f"{log_prefix}: value={value}, fee={fee}, no_confirmation={no_confirmation}, emulate={emulate}")
|
mm_sol/cli/validators.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from mm_crypto_utils import ConfigValidators
|
|
2
|
+
|
|
1
3
|
from mm_sol.cli import calcs
|
|
2
4
|
|
|
3
5
|
|
|
@@ -9,3 +11,7 @@ def is_valid_var_lamports(value: str | None, base_name: str = "var", decimals: i
|
|
|
9
11
|
return True # noqa: TRY300
|
|
10
12
|
except ValueError:
|
|
11
13
|
return False
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Validators(ConfigValidators):
|
|
17
|
+
pass
|
mm_sol/token.py
CHANGED
|
@@ -7,12 +7,14 @@ from mm_sol.utils import get_client
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
def get_decimals(node: str, token_mint_address: str, timeout: float = 10, proxy: str | None = None) -> Result[int]:
|
|
10
|
+
data = None
|
|
10
11
|
try:
|
|
11
12
|
client = get_client(node, proxy=proxy, timeout=timeout)
|
|
12
13
|
res = client.get_token_supply(Pubkey.from_string(token_mint_address))
|
|
14
|
+
data = res
|
|
13
15
|
return Ok(res.value.decimals)
|
|
14
16
|
except Exception as e:
|
|
15
|
-
return Err(e)
|
|
17
|
+
return Err(e, data=data)
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
def get_decimals_with_retries(
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mm-sol
|
|
3
|
-
Version: 0.2.
|
|
4
|
-
Requires-Python: >=3.
|
|
3
|
+
Version: 0.2.8
|
|
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.0.
|
|
7
|
+
Requires-Dist: mm-crypto-utils>=0.0.15
|
|
8
8
|
Requires-Dist: solana~=0.36.3
|
|
9
9
|
Requires-Dist: typer>=0.15.1
|
|
@@ -1,31 +1,32 @@
|
|
|
1
1
|
mm_sol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
mm_sol/account.py,sha256=
|
|
2
|
+
mm_sol/account.py,sha256=32PR3kAoZJLEtKzwfWeQXnMxZeFO8NVXjG8HnHpnJgM,3225
|
|
3
3
|
mm_sol/balance.py,sha256=Idx7h9yhRLbrIEDFCBI5QSHE7OT2pYWEZrbHj9XFrkM,3147
|
|
4
4
|
mm_sol/block.py,sha256=4Lc4TANgpGvPflVumC9MR-3vIl1dedGyci3cgzczuds,1794
|
|
5
5
|
mm_sol/converters.py,sha256=jY3wZeo1326z8M-AMS4OEzspRaGt4Tbk0y2SPI-oDFE,1153
|
|
6
6
|
mm_sol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
7
|
mm_sol/rpc.py,sha256=TspD_KZQp_KJDQzRknxaT8DR03okok26UWDQWF7Zflg,8031
|
|
8
8
|
mm_sol/solana_cli.py,sha256=ig3OoTvmkrl7MFQSZjRHIraLSmtse0_9kn5Nsw8_zb0,8258
|
|
9
|
-
mm_sol/token.py,sha256=
|
|
9
|
+
mm_sol/token.py,sha256=O8z3UE3iZGYLWw8fnd9weYMcoQO0m88noqbRO_jntGg,1092
|
|
10
10
|
mm_sol/transfer.py,sha256=-76gSHbQGOZeOgVgo10QWjAcv_9mnGrBNvpRCvXBlZQ,5872
|
|
11
11
|
mm_sol/utils.py,sha256=NE0G564GiT9d7rW_lPPxUb1eq62WiXh28xtvtzNQIqw,556
|
|
12
12
|
mm_sol/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
-
mm_sol/cli/calcs.py,sha256=
|
|
14
|
-
mm_sol/cli/cli.py,sha256=
|
|
13
|
+
mm_sol/cli/calcs.py,sha256=jtFTODBHOkeSR5SARksQ7dDw2BATQYdhc8PtUskfEPk,4152
|
|
14
|
+
mm_sol/cli/cli.py,sha256=SZwvxbiEXHgnhZ_Zg7GsgOm0Y2-WYHSQSuaO2xTaOnk,4496
|
|
15
15
|
mm_sol/cli/cli_utils.py,sha256=EJTWdccXg8mvkK7E-Dt7zmULzc1WoqFlbu8ASGT2SVI,1381
|
|
16
|
-
mm_sol/cli/validators.py,sha256=
|
|
16
|
+
mm_sol/cli/validators.py,sha256=uKAZfKx4a11kLnxnD98duCMUEswj9UTJkWVVjlW0cDw,500
|
|
17
17
|
mm_sol/cli/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
18
|
mm_sol/cli/cmd/balance_cmd.py,sha256=DfUZY3-Hr-F7Y0xp1faol0yLnPu6iDU3b839VhdwAbw,2587
|
|
19
|
-
mm_sol/cli/cmd/balances_cmd.py,sha256=
|
|
19
|
+
mm_sol/cli/cmd/balances_cmd.py,sha256=yfiRMR3inxz0eXKR4rC9Ii8XsED_3mn46LX_C6Zf0MA,2624
|
|
20
20
|
mm_sol/cli/cmd/example_cmd.py,sha256=bK_z4du0UPGAoiHnYdi6iaZim_kKlYw4NKBbzvyes28,221
|
|
21
21
|
mm_sol/cli/cmd/node_cmd.py,sha256=2AEAjq2M9f8-RZiI0rif6wITdns9QUb4Kr34QPsI2CA,238
|
|
22
|
-
mm_sol/cli/cmd/transfer_sol_cmd.py,sha256=
|
|
22
|
+
mm_sol/cli/cmd/transfer_sol_cmd.py,sha256=BmPCKr9D1rc7EQ9fuuShlrhiYYli1v1EHY3gkygrFJU,7083
|
|
23
|
+
mm_sol/cli/cmd/transfer_token_cmd.py,sha256=bfDhy0s1i9qaXeGWLk1CnSnxS6wJKdDAM4f3f07RWJA,5148
|
|
23
24
|
mm_sol/cli/cmd/wallet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
25
|
mm_sol/cli/cmd/wallet/keypair_cmd.py,sha256=cRHVVTs9zNYmUozZ8ZlJoutn9V6r8I1AEHBrszR7dTE,538
|
|
25
26
|
mm_sol/cli/cmd/wallet/new_cmd.py,sha256=hcP9NZPkwYkTBEvT5rBntFtCIvx1QnPGn5FUDnvz5sM,425
|
|
26
27
|
mm_sol/cli/examples/balances.yml,sha256=SoFcf_IhgA2zrbihrVpqm-ikes80wLFGVzafrjO00UY,290
|
|
27
28
|
mm_sol/cli/examples/transfer-sol.yml,sha256=YFIM36NhaSEPeck6yQMvcgy3MWxgsfDqmMLRqz6P1dk,346
|
|
28
|
-
mm_sol-0.2.
|
|
29
|
-
mm_sol-0.2.
|
|
30
|
-
mm_sol-0.2.
|
|
31
|
-
mm_sol-0.2.
|
|
29
|
+
mm_sol-0.2.8.dist-info/METADATA,sha256=ijsNaal8AmUCRafckp2F6XPP_D1Ejn9RU4pwdq839cA,230
|
|
30
|
+
mm_sol-0.2.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
31
|
+
mm_sol-0.2.8.dist-info/entry_points.txt,sha256=MrYnosumy9nsITSAw5TiR3WXDwsdoF0YvUIlZ38TLLs,46
|
|
32
|
+
mm_sol-0.2.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|