mm-balance 0.6.1__tar.gz → 0.6.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mm_balance-0.6.1 → mm_balance-0.6.2}/.claude/settings.local.json +2 -1
- mm_balance-0.6.2/CLAUDE.md +24 -0
- mm_balance-0.6.2/PKG-INFO +10 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/pyproject.toml +8 -8
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/balance_fetcher.py +2 -2
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/cli.py +4 -4
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/command_runner.py +2 -3
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/config.py +2 -5
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/diff.py +16 -16
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/output/formats/json_format.py +2 -2
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/output/formats/table_format.py +11 -9
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/price.py +1 -1
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/result.py +2 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/token_decimals.py +4 -5
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/utils.py +10 -1
- {mm_balance-0.6.1 → mm_balance-0.6.2}/uv.lock +71 -73
- mm_balance-0.6.1/CLAUDE.md +0 -13
- mm_balance-0.6.1/PKG-INFO +0 -10
- {mm_balance-0.6.1 → mm_balance-0.6.2}/.gitignore +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/README.md +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/justfile +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/__init__.py +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/config/example.toml +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/constants.py +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/output/__init__.py +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/output/formats/__init__.py +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/output/utils.py +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/src/mm_balance/rpc.py +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/tests/__init__.py +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/tests/conftest.py +0 -0
- {mm_balance-0.6.1 → mm_balance-0.6.2}/tests/test_share_expression.py +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# AI Agent Start Guide
|
|
2
|
+
|
|
3
|
+
## Critical: Language
|
|
4
|
+
RESPOND IN ENGLISH. Always. No exceptions.
|
|
5
|
+
User's language does NOT determine your response language.
|
|
6
|
+
Only switch if user EXPLICITLY requests it (e.g., "respond in {language}").
|
|
7
|
+
Language switching applies ONLY to chat. All code, comments, commit messages, and files must ALWAYS be in English — no exceptions.
|
|
8
|
+
|
|
9
|
+
## Mandatory Rules (external)
|
|
10
|
+
These files are REQUIRED. Read them fully and follow all rules.
|
|
11
|
+
- `~/.claude/shared-rules/general.md`
|
|
12
|
+
- `~/.claude/shared-rules/python.md`
|
|
13
|
+
|
|
14
|
+
## Project Reading (context)
|
|
15
|
+
These files are REQUIRED for project understanding.
|
|
16
|
+
- `README.md`
|
|
17
|
+
|
|
18
|
+
## Preflight (mandatory)
|
|
19
|
+
Before your first response:
|
|
20
|
+
1. Read all files listed above.
|
|
21
|
+
2. Do not answer until all are read.
|
|
22
|
+
3. In your first reply, list every file you have read from this document.
|
|
23
|
+
|
|
24
|
+
Failure to follow this protocol is considered an error.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mm-balance
|
|
3
|
+
Version: 0.6.2
|
|
4
|
+
Requires-Python: >=3.14
|
|
5
|
+
Requires-Dist: deepdiff==8.6.1
|
|
6
|
+
Requires-Dist: mm-apt==0.6.0
|
|
7
|
+
Requires-Dist: mm-btc==0.6.0
|
|
8
|
+
Requires-Dist: mm-concurrency~=0.2.0
|
|
9
|
+
Requires-Dist: mm-eth==0.8.0
|
|
10
|
+
Requires-Dist: mm-sol==0.8.0
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mm-balance"
|
|
3
|
-
version = "0.6.
|
|
3
|
+
version = "0.6.2"
|
|
4
4
|
description = ""
|
|
5
5
|
requires-python = ">=3.14"
|
|
6
6
|
dependencies = [
|
|
7
|
-
"mm-concurrency~=0.
|
|
8
|
-
"mm-apt==0.
|
|
9
|
-
"mm-btc==0.
|
|
10
|
-
"mm-eth==0.
|
|
11
|
-
"mm-sol==0.
|
|
7
|
+
"mm-concurrency~=0.2.0",
|
|
8
|
+
"mm-apt==0.6.0",
|
|
9
|
+
"mm-btc==0.6.0",
|
|
10
|
+
"mm-eth==0.8.0",
|
|
11
|
+
"mm-sol==0.8.0",
|
|
12
12
|
"deepdiff==8.6.1",
|
|
13
13
|
]
|
|
14
14
|
[project.scripts]
|
|
@@ -22,9 +22,9 @@ build-backend = "hatchling.build"
|
|
|
22
22
|
dev = [
|
|
23
23
|
"pytest~=9.0.2",
|
|
24
24
|
"pytest-xdist~=3.8.0",
|
|
25
|
-
"ruff~=0.
|
|
25
|
+
"ruff~=0.15.0",
|
|
26
26
|
"pip-audit~=2.10.0",
|
|
27
|
-
"bandit~=1.9.
|
|
27
|
+
"bandit~=1.9.3",
|
|
28
28
|
"mypy~=1.19.1",
|
|
29
29
|
]
|
|
30
30
|
|
|
@@ -39,7 +39,7 @@ class BalanceFetcher:
|
|
|
39
39
|
|
|
40
40
|
async def process(self) -> None:
|
|
41
41
|
with self.progress_bar:
|
|
42
|
-
runner = AsyncTaskRunner(
|
|
42
|
+
runner = AsyncTaskRunner(concurrency=10)
|
|
43
43
|
for network in self.config.networks():
|
|
44
44
|
runner.add(f"process_{network}", self._process_network(network))
|
|
45
45
|
await runner.run()
|
|
@@ -54,7 +54,7 @@ class BalanceFetcher:
|
|
|
54
54
|
return result
|
|
55
55
|
|
|
56
56
|
async def _process_network(self, network: Network) -> None:
|
|
57
|
-
runner = AsyncTaskRunner(
|
|
57
|
+
runner = AsyncTaskRunner(concurrency=self.config.workers[network])
|
|
58
58
|
for idx, task in enumerate(self.tasks[network]):
|
|
59
59
|
runner.add(str(idx), self._get_balance(network, task.wallet_address, task.token_address))
|
|
60
60
|
res = await runner.run()
|
|
@@ -4,13 +4,13 @@ import pkgutil
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from typing import Annotated
|
|
6
6
|
|
|
7
|
-
import mm_print
|
|
8
7
|
import typer
|
|
8
|
+
from mm_print import print_toml
|
|
9
9
|
|
|
10
10
|
from mm_balance import command_runner
|
|
11
11
|
from mm_balance.command_runner import CommandParameters
|
|
12
12
|
from mm_balance.constants import NETWORKS
|
|
13
|
-
from mm_balance.utils import PrintFormat
|
|
13
|
+
from mm_balance.utils import PrintFormat, fatal
|
|
14
14
|
|
|
15
15
|
app = typer.Typer(no_args_is_help=True, pretty_exceptions_enable=False, add_completion=False)
|
|
16
16
|
|
|
@@ -25,8 +25,8 @@ def example_callback(value: bool) -> None:
|
|
|
25
25
|
if value:
|
|
26
26
|
data = pkgutil.get_data(__name__, "config/example.toml")
|
|
27
27
|
if data is None:
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
fatal("Example config not found")
|
|
29
|
+
print_toml(data.decode("utf-8"))
|
|
30
30
|
raise typer.Exit
|
|
31
31
|
|
|
32
32
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import getpass
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
|
|
4
|
-
import mm_print
|
|
5
4
|
from pydantic import BaseModel
|
|
6
5
|
|
|
7
6
|
from mm_balance.balance_fetcher import BalanceFetcher
|
|
@@ -11,7 +10,7 @@ from mm_balance.output.formats import json_format, table_format
|
|
|
11
10
|
from mm_balance.price import Prices, get_prices
|
|
12
11
|
from mm_balance.result import create_balances_result
|
|
13
12
|
from mm_balance.token_decimals import get_token_decimals
|
|
14
|
-
from mm_balance.utils import PrintFormat
|
|
13
|
+
from mm_balance.utils import PrintFormat, fatal
|
|
15
14
|
|
|
16
15
|
|
|
17
16
|
class CommandParameters(BaseModel):
|
|
@@ -63,7 +62,7 @@ async def run(params: CommandParameters) -> None:
|
|
|
63
62
|
elif config.settings.print_format is PrintFormat.JSON:
|
|
64
63
|
json_format.print_result(config, token_decimals, prices, workers, result)
|
|
65
64
|
else:
|
|
66
|
-
|
|
65
|
+
fatal("Unsupported print format")
|
|
67
66
|
|
|
68
67
|
if params.save_balances:
|
|
69
68
|
BalancesDict.from_balances_result(result).save_to_path(params.save_balances)
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from decimal import Decimal
|
|
4
2
|
from pathlib import Path
|
|
5
3
|
from typing import Annotated, Self
|
|
6
4
|
|
|
7
|
-
import mm_print
|
|
8
5
|
import pydash
|
|
9
6
|
from mm_web3 import ConfigValidators, Web3CliConfig
|
|
10
7
|
from pydantic import BeforeValidator, Field, StringConstraints, model_validator
|
|
11
8
|
|
|
12
9
|
from mm_balance.constants import DEFAULT_NODES, TOKEN_ADDRESS, Network
|
|
13
|
-
from mm_balance.utils import PrintFormat, evaluate_share_expression
|
|
10
|
+
from mm_balance.utils import PrintFormat, evaluate_share_expression, fatal
|
|
14
11
|
|
|
15
12
|
|
|
16
13
|
class Validators(ConfigValidators):
|
|
@@ -62,7 +59,7 @@ class AssetGroup(Web3CliConfig):
|
|
|
62
59
|
if path.is_file():
|
|
63
60
|
result += path.read_text().strip().splitlines()
|
|
64
61
|
else:
|
|
65
|
-
|
|
62
|
+
fatal(f"File with addresses not found: {path}")
|
|
66
63
|
elif line.startswith("group:"):
|
|
67
64
|
group_name = line.removeprefix("group:").strip()
|
|
68
65
|
address_group = next((ag for ag in address_groups if ag.name == group_name), None)
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
import json
|
|
4
2
|
import re
|
|
5
3
|
from decimal import Decimal
|
|
6
4
|
from pathlib import Path
|
|
7
5
|
|
|
8
|
-
import mm_print
|
|
9
6
|
from deepdiff.diff import DeepDiff
|
|
7
|
+
from mm_print import print_json, print_plain, print_table
|
|
10
8
|
from pydantic import BaseModel, RootModel
|
|
11
9
|
|
|
12
10
|
from mm_balance.result import Balance, BalancesResult
|
|
@@ -21,7 +19,8 @@ class BalancesDict(RootModel[dict[str, dict[str, dict[str, Decimal]]]]): # netw
|
|
|
21
19
|
return set(self.model_dump()[network].keys())
|
|
22
20
|
|
|
23
21
|
def save_to_path(self, balances_file: Path) -> None:
|
|
24
|
-
|
|
22
|
+
with balances_file.open("w") as f:
|
|
23
|
+
json.dump(self.model_dump(), f, default=str, indent=2)
|
|
25
24
|
|
|
26
25
|
@staticmethod
|
|
27
26
|
def from_balances_result(result: BalancesResult) -> BalancesDict:
|
|
@@ -38,7 +37,8 @@ class BalancesDict(RootModel[dict[str, dict[str, dict[str, Decimal]]]]): # netw
|
|
|
38
37
|
|
|
39
38
|
@staticmethod
|
|
40
39
|
def from_file(path: Path) -> BalancesDict:
|
|
41
|
-
|
|
40
|
+
with path.open("r") as f:
|
|
41
|
+
return BalancesDict(json.load(f))
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
class Diff(BaseModel):
|
|
@@ -72,23 +72,23 @@ class Diff(BaseModel):
|
|
|
72
72
|
and not self.address_removed
|
|
73
73
|
and not self.balance_changed
|
|
74
74
|
):
|
|
75
|
-
|
|
75
|
+
print_plain("Diff: no changes")
|
|
76
76
|
return
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
print_plain("\nDiff")
|
|
79
79
|
|
|
80
80
|
if self.network_added:
|
|
81
|
-
|
|
81
|
+
print_plain(f"networks added: {self.network_added}")
|
|
82
82
|
if self.network_removed:
|
|
83
|
-
|
|
83
|
+
print_plain(f"networks removed: {self.network_removed}")
|
|
84
84
|
if self.ticker_added:
|
|
85
|
-
|
|
85
|
+
print_plain(f"tickers added: {self.ticker_added}")
|
|
86
86
|
if self.ticker_removed:
|
|
87
|
-
|
|
87
|
+
print_plain(f"tickers removed: {self.ticker_removed}")
|
|
88
88
|
if self.address_added:
|
|
89
|
-
|
|
89
|
+
print_plain(f"addresses added: {self.address_added}")
|
|
90
90
|
if self.address_removed:
|
|
91
|
-
|
|
91
|
+
print_plain(f"addresses removed: {self.address_removed}")
|
|
92
92
|
|
|
93
93
|
if self.balance_changed:
|
|
94
94
|
rows = []
|
|
@@ -97,11 +97,11 @@ class Diff(BaseModel):
|
|
|
97
97
|
for address in self.balance_changed[network][ticker]:
|
|
98
98
|
old_value, new_value = self.balance_changed[network][ticker][address]
|
|
99
99
|
rows.append([network, ticker, address, old_value, new_value, new_value - old_value])
|
|
100
|
-
|
|
100
|
+
print_table(["Network", "Ticker", "Address", "Old", "New", "Change"], rows)
|
|
101
101
|
|
|
102
102
|
def _print_json(self) -> None:
|
|
103
|
-
#
|
|
104
|
-
|
|
103
|
+
# print_json(data=self.model_dump(), type_handlers=str) ?? default?
|
|
104
|
+
print_json(data=self.model_dump())
|
|
105
105
|
|
|
106
106
|
@staticmethod
|
|
107
107
|
def calc(balances1: BalancesDict, balances2: BalancesDict) -> Diff:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
from mm_print import print_json
|
|
2
2
|
|
|
3
3
|
from mm_balance.balance_fetcher import BalanceFetcher
|
|
4
4
|
from mm_balance.config import Config
|
|
@@ -27,4 +27,4 @@ def print_result(
|
|
|
27
27
|
if errors:
|
|
28
28
|
data["errors"] = errors
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
print_json(data)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from decimal import Decimal
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
from mm_print import print_table
|
|
4
4
|
|
|
5
5
|
from mm_balance.balance_fetcher import BalanceFetcher
|
|
6
6
|
from mm_balance.config import Config
|
|
@@ -14,18 +14,18 @@ def print_nodes(config: Config) -> None:
|
|
|
14
14
|
rows = []
|
|
15
15
|
for network, nodes in config.nodes.items():
|
|
16
16
|
rows.append([network, "\n".join(nodes)])
|
|
17
|
-
|
|
17
|
+
print_table(["network", "nodes"], rows, title="Nodes")
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def print_proxy_count(config: Config) -> None:
|
|
21
|
-
|
|
21
|
+
print_table(["count"], [[len(config.settings.proxies)]], title="Proxies")
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
def print_token_decimals(token_decimals: TokenDecimals) -> None:
|
|
25
25
|
rows = []
|
|
26
26
|
for network, decimals in token_decimals.items():
|
|
27
27
|
rows.append([network, decimals])
|
|
28
|
-
|
|
28
|
+
print_table(["network", "decimals"], rows, title="Token Decimals")
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
def print_prices(config: Config, prices: Prices) -> None:
|
|
@@ -35,7 +35,7 @@ def print_prices(config: Config, prices: Prices) -> None:
|
|
|
35
35
|
rows.append(
|
|
36
36
|
[ticker, format_number(price, config.settings.format_number_separator, "$", config.settings.round_ndigits)]
|
|
37
37
|
)
|
|
38
|
-
|
|
38
|
+
print_table(["coin", "usd"], rows, title="Prices")
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
def print_result(config: Config, result: BalancesResult, workers: BalanceFetcher) -> None:
|
|
@@ -56,8 +56,10 @@ def _print_errors(config: Config, workers: BalanceFetcher) -> None:
|
|
|
56
56
|
rows = []
|
|
57
57
|
for task in error_tasks:
|
|
58
58
|
group = config.groups[task.group_index]
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
# task.balance is guaranteed to be non-None ResultErr here since get_errors() filters for is_err()
|
|
60
|
+
if task.balance is not None:
|
|
61
|
+
rows.append([group.ticker + " / " + group.network, task.wallet_address, task.balance.unwrap_err()])
|
|
62
|
+
print_table(["coin", "address", "error"], rows, title="Errors")
|
|
61
63
|
|
|
62
64
|
|
|
63
65
|
def _print_total(config: Config, total: Total, is_share_total: bool) -> None:
|
|
@@ -80,7 +82,7 @@ def _print_total(config: Config, total: Total, is_share_total: bool) -> None:
|
|
|
80
82
|
rows.append(["stablecoin_sum", format_number(total.stablecoin_sum, config.settings.format_number_separator, "$")])
|
|
81
83
|
rows.append(["total_usd_sum", format_number(total.total_usd_sum, config.settings.format_number_separator, "$")])
|
|
82
84
|
|
|
83
|
-
|
|
85
|
+
print_table(headers, rows, title=table_name)
|
|
84
86
|
|
|
85
87
|
|
|
86
88
|
def _print_group(config: Config, group: GroupResult) -> None:
|
|
@@ -118,4 +120,4 @@ def _print_group(config: Config, group: GroupResult) -> None:
|
|
|
118
120
|
table_headers = ["address", "balance"]
|
|
119
121
|
if config.settings.price:
|
|
120
122
|
table_headers += ["usd"]
|
|
121
|
-
|
|
123
|
+
print_table(table_headers, rows, title=group_name)
|
|
@@ -80,6 +80,8 @@ def _create_total(use_share: bool, groups: list[GroupResult]) -> Total:
|
|
|
80
80
|
if total_usd_sum > 0:
|
|
81
81
|
for ticker, usd_value in coin_usd_values.items():
|
|
82
82
|
if ticker in USD_STABLECOINS:
|
|
83
|
+
# Intentionally show total stablecoin share for all stablecoins.
|
|
84
|
+
# We care about combined stablecoin allocation, not individual USDT/USDC breakdown.
|
|
83
85
|
portfolio_share[ticker] = round(stablecoin_sum * 100 / total_usd_sum, 2)
|
|
84
86
|
else:
|
|
85
87
|
portfolio_share[ticker] = round(usd_value * 100 / total_usd_sum, 2)
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import mm_print
|
|
2
|
-
|
|
3
1
|
from mm_balance import rpc
|
|
4
2
|
from mm_balance.config import Config
|
|
5
3
|
from mm_balance.constants import NETWORK_APTOS, NETWORK_BITCOIN, NETWORK_SOLANA, Network
|
|
4
|
+
from mm_balance.utils import fatal
|
|
6
5
|
|
|
7
6
|
|
|
8
7
|
class TokenDecimals(dict[Network, dict[str | None, int]]): # {network: {None: 18}} -- None is for native token, ex. ETH
|
|
@@ -30,7 +29,7 @@ async def get_token_decimals(config: Config) -> TokenDecimals:
|
|
|
30
29
|
elif group.network in (NETWORK_BITCOIN, NETWORK_APTOS):
|
|
31
30
|
result[group.network][None] = 8
|
|
32
31
|
else:
|
|
33
|
-
|
|
32
|
+
fatal(f"Can't get token decimals for native token on network: {group.network}")
|
|
34
33
|
continue
|
|
35
34
|
|
|
36
35
|
# get token_decimals via RPC
|
|
@@ -45,8 +44,8 @@ async def get_token_decimals(config: Config) -> TokenDecimals:
|
|
|
45
44
|
if res.is_err():
|
|
46
45
|
msg = f"can't get decimals for token {group.ticker} / {group.token}, error={res.unwrap_err()}"
|
|
47
46
|
if config.settings.print_debug:
|
|
48
|
-
msg += f"\n{res.
|
|
49
|
-
|
|
47
|
+
msg += f"\n{res.context}"
|
|
48
|
+
fatal(msg)
|
|
50
49
|
|
|
51
50
|
result[group.network][group.token] = res.unwrap()
|
|
52
51
|
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import re
|
|
2
2
|
from decimal import Decimal
|
|
3
3
|
from enum import StrEnum, unique
|
|
4
|
+
from typing import NoReturn
|
|
5
|
+
|
|
6
|
+
import typer
|
|
4
7
|
|
|
5
8
|
|
|
6
9
|
def fnumber(value: Decimal, separator: str, extra: str | None = None) -> str:
|
|
@@ -15,7 +18,7 @@ def fnumber(value: Decimal, separator: str, extra: str | None = None) -> str:
|
|
|
15
18
|
def scale_and_round(value: int, decimals: int, round_ndigits: int) -> Decimal:
|
|
16
19
|
if value == 0:
|
|
17
20
|
return Decimal(0)
|
|
18
|
-
return round(Decimal(value / 10**decimals), round_ndigits)
|
|
21
|
+
return round(Decimal(value) / Decimal(10**decimals), round_ndigits)
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
def round_decimal(value: Decimal, round_ndigits: int) -> Decimal:
|
|
@@ -161,3 +164,9 @@ class PrintFormat(StrEnum):
|
|
|
161
164
|
PLAIN = "plain"
|
|
162
165
|
TABLE = "table"
|
|
163
166
|
JSON = "json"
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def fatal(message: str) -> NoReturn:
|
|
170
|
+
"""Print an error message and exit with code 1."""
|
|
171
|
+
typer.echo(message)
|
|
172
|
+
raise typer.Exit(1)
|
|
@@ -128,7 +128,7 @@ wheels = [
|
|
|
128
128
|
|
|
129
129
|
[[package]]
|
|
130
130
|
name = "bandit"
|
|
131
|
-
version = "1.9.
|
|
131
|
+
version = "1.9.3"
|
|
132
132
|
source = { registry = "https://pypi.org/simple" }
|
|
133
133
|
dependencies = [
|
|
134
134
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
@@ -136,9 +136,9 @@ dependencies = [
|
|
|
136
136
|
{ name = "rich" },
|
|
137
137
|
{ name = "stevedore" },
|
|
138
138
|
]
|
|
139
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
139
|
+
sdist = { url = "https://files.pythonhosted.org/packages/89/76/a7f3e639b78601118aaa4a394db2c66ae2597fbd8c39644c32874ed11e0c/bandit-1.9.3.tar.gz", hash = "sha256:ade4b9b7786f89ef6fc7344a52b34558caec5da74cb90373aed01de88472f774", size = 4242154, upload-time = "2026-01-19T04:05:22.802Z" }
|
|
140
140
|
wheels = [
|
|
141
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
141
|
+
{ url = "https://files.pythonhosted.org/packages/e0/0b/8bdc52111c83e2dc2f97403dc87c0830b8989d9ae45732b34b686326fb2c/bandit-1.9.3-py3-none-any.whl", hash = "sha256:4745917c88d2246def79748bde5e08b9d5e9b92f877863d43fab70cd8814ce6a", size = 134451, upload-time = "2026-01-19T04:05:20.938Z" },
|
|
142
142
|
]
|
|
143
143
|
|
|
144
144
|
[[package]]
|
|
@@ -933,19 +933,19 @@ wheels = [
|
|
|
933
933
|
|
|
934
934
|
[[package]]
|
|
935
935
|
name = "mm-apt"
|
|
936
|
-
version = "0.
|
|
936
|
+
version = "0.6.0"
|
|
937
937
|
source = { registry = "https://pypi.org/simple" }
|
|
938
938
|
dependencies = [
|
|
939
939
|
{ name = "mm-web3" },
|
|
940
940
|
]
|
|
941
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
941
|
+
sdist = { url = "https://files.pythonhosted.org/packages/4c/76/3b1b46eb0a8e2aa47d3ee9711c5783302a642d3ccd21d7c63ab7f10d0d0b/mm_apt-0.6.0.tar.gz", hash = "sha256:41d1b307b1c6849a2674bc39e42d5ed98ab3ea8040b061d0a8ea823ecfc315d8", size = 56243, upload-time = "2026-02-04T10:26:05.298Z" }
|
|
942
942
|
wheels = [
|
|
943
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
943
|
+
{ url = "https://files.pythonhosted.org/packages/15/7b/f894993e226ff9d68a8d3761e8978c6302d721352f4a348fd9e7142705ef/mm_apt-0.6.0-py3-none-any.whl", hash = "sha256:99ecd29ebd50e275d33eecea890fafe9f6bf2f1a0de249bc93fa386401b3fd03", size = 3842, upload-time = "2026-02-04T10:26:03.688Z" },
|
|
944
944
|
]
|
|
945
945
|
|
|
946
946
|
[[package]]
|
|
947
947
|
name = "mm-balance"
|
|
948
|
-
version = "0.6.
|
|
948
|
+
version = "0.6.2"
|
|
949
949
|
source = { editable = "." }
|
|
950
950
|
dependencies = [
|
|
951
951
|
{ name = "deepdiff" },
|
|
@@ -969,26 +969,26 @@ dev = [
|
|
|
969
969
|
[package.metadata]
|
|
970
970
|
requires-dist = [
|
|
971
971
|
{ name = "deepdiff", specifier = "==8.6.1" },
|
|
972
|
-
{ name = "mm-apt", specifier = "==0.
|
|
973
|
-
{ name = "mm-btc", specifier = "==0.
|
|
974
|
-
{ name = "mm-concurrency", specifier = "~=0.
|
|
975
|
-
{ name = "mm-eth", specifier = "==0.
|
|
976
|
-
{ name = "mm-sol", specifier = "==0.
|
|
972
|
+
{ name = "mm-apt", specifier = "==0.6.0" },
|
|
973
|
+
{ name = "mm-btc", specifier = "==0.6.0" },
|
|
974
|
+
{ name = "mm-concurrency", specifier = "~=0.2.0" },
|
|
975
|
+
{ name = "mm-eth", specifier = "==0.8.0" },
|
|
976
|
+
{ name = "mm-sol", specifier = "==0.8.0" },
|
|
977
977
|
]
|
|
978
978
|
|
|
979
979
|
[package.metadata.requires-dev]
|
|
980
980
|
dev = [
|
|
981
|
-
{ name = "bandit", specifier = "~=1.9.
|
|
981
|
+
{ name = "bandit", specifier = "~=1.9.3" },
|
|
982
982
|
{ name = "mypy", specifier = "~=1.19.1" },
|
|
983
983
|
{ name = "pip-audit", specifier = "~=2.10.0" },
|
|
984
984
|
{ name = "pytest", specifier = "~=9.0.2" },
|
|
985
985
|
{ name = "pytest-xdist", specifier = "~=3.8.0" },
|
|
986
|
-
{ name = "ruff", specifier = "~=0.
|
|
986
|
+
{ name = "ruff", specifier = "~=0.15.0" },
|
|
987
987
|
]
|
|
988
988
|
|
|
989
989
|
[[package]]
|
|
990
990
|
name = "mm-btc"
|
|
991
|
-
version = "0.
|
|
991
|
+
version = "0.6.0"
|
|
992
992
|
source = { registry = "https://pypi.org/simple" }
|
|
993
993
|
dependencies = [
|
|
994
994
|
{ name = "bit" },
|
|
@@ -998,37 +998,37 @@ dependencies = [
|
|
|
998
998
|
{ name = "mnemonic" },
|
|
999
999
|
{ name = "typer" },
|
|
1000
1000
|
]
|
|
1001
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1001
|
+
sdist = { url = "https://files.pythonhosted.org/packages/9f/86/01b17e76f1db8cf5531f27075e990cd05d291a4202aa694e00db4c7978e0/mm_btc-0.6.0.tar.gz", hash = "sha256:c05dc1d794a3888c24fd83a0f3c27dfa1b0f421478d1dff6dab5f3d9efd19152", size = 72768, upload-time = "2026-02-04T08:54:46.976Z" }
|
|
1002
1002
|
wheels = [
|
|
1003
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1003
|
+
{ url = "https://files.pythonhosted.org/packages/7d/ba/aa7ab9edc440cbac22bd05154885aa7038ddad791f4d82e848f419893b3c/mm_btc-0.6.0-py3-none-any.whl", hash = "sha256:ff34ba889540a5a55c2dad8f4d45da713a36bb3c3f7544512b401fedcec2b4d1", size = 9023, upload-time = "2026-02-04T08:54:45.435Z" },
|
|
1004
1004
|
]
|
|
1005
1005
|
|
|
1006
1006
|
[[package]]
|
|
1007
1007
|
name = "mm-concurrency"
|
|
1008
|
-
version = "0.
|
|
1008
|
+
version = "0.2.0"
|
|
1009
1009
|
source = { registry = "https://pypi.org/simple" }
|
|
1010
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1010
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f4/e7/55948fd568149955fb67d433602cdb5a2fb1f1faa0123498ac1f013c6af0/mm_concurrency-0.2.0.tar.gz", hash = "sha256:a86635b35774d89eb22caccb6c06aa90766952ddac7707e81095a68745394ac6", size = 45442, upload-time = "2026-01-30T10:46:57.045Z" }
|
|
1011
1011
|
wheels = [
|
|
1012
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1012
|
+
{ url = "https://files.pythonhosted.org/packages/84/71/9b76671f72fcaa4c80aebaab47bdb7805c414ccaecbc4e2a56a9007f4139/mm_concurrency-0.2.0-py3-none-any.whl", hash = "sha256:cce18bad2a63c2c11a6dd2cf06818fc58eb847efea02e5a4b2f3b6c37bedf809", size = 13859, upload-time = "2026-01-30T10:46:58.3Z" },
|
|
1013
1013
|
]
|
|
1014
1014
|
|
|
1015
1015
|
[[package]]
|
|
1016
1016
|
name = "mm-eth"
|
|
1017
|
-
version = "0.
|
|
1017
|
+
version = "0.8.0"
|
|
1018
1018
|
source = { registry = "https://pypi.org/simple" }
|
|
1019
1019
|
dependencies = [
|
|
1020
1020
|
{ name = "mm-web3" },
|
|
1021
1021
|
{ name = "typer" },
|
|
1022
1022
|
{ name = "web3" },
|
|
1023
1023
|
]
|
|
1024
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1024
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c0/2b/6ae479b276f8c0277fed2a41b8a475d8b847675c6068382293f4f434023a/mm_eth-0.8.0.tar.gz", hash = "sha256:ea86a536bd61186033cce5c2a8533b10efd37fa03d1ceab3d1cfd681ea7f8a8d", size = 97333, upload-time = "2026-02-04T12:11:39.819Z" }
|
|
1025
1025
|
wheels = [
|
|
1026
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1026
|
+
{ url = "https://files.pythonhosted.org/packages/7d/63/27d6c61981195dadbacd42bf46e01b41d62cea8a415acf0edba0fe8d60c4/mm_eth-0.8.0-py3-none-any.whl", hash = "sha256:9407675ab51604571de6988eb685090ba6ed729f2d4db32b4bdf03e1dabf39b4", size = 30777, upload-time = "2026-02-04T12:11:38.582Z" },
|
|
1027
1027
|
]
|
|
1028
1028
|
|
|
1029
1029
|
[[package]]
|
|
1030
1030
|
name = "mm-http"
|
|
1031
|
-
version = "0.
|
|
1031
|
+
version = "0.3.1"
|
|
1032
1032
|
source = { registry = "https://pypi.org/simple" }
|
|
1033
1033
|
dependencies = [
|
|
1034
1034
|
{ name = "aiohttp" },
|
|
@@ -1037,39 +1037,38 @@ dependencies = [
|
|
|
1037
1037
|
{ name = "pydantic" },
|
|
1038
1038
|
{ name = "pydash" },
|
|
1039
1039
|
{ name = "requests", extra = ["socks"] },
|
|
1040
|
-
{ name = "urllib3" },
|
|
1041
1040
|
]
|
|
1042
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1041
|
+
sdist = { url = "https://files.pythonhosted.org/packages/3a/58/531c37aa1bfb54d4e35788f46a32170902b52dbef6675f2e03b4af37c689/mm_http-0.3.1.tar.gz", hash = "sha256:1c7488ad08139dc4690d46ef1ba212e3ff0798a72562091cddaf23272d3f6cb8", size = 66046, upload-time = "2026-02-04T08:26:58.206Z" }
|
|
1043
1042
|
wheels = [
|
|
1044
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1043
|
+
{ url = "https://files.pythonhosted.org/packages/2a/ff/412555dcedf4e7937f1e3bda51a545fd8b99c12ae5a169b27728c2ab9984/mm_http-0.3.1-py3-none-any.whl", hash = "sha256:3767527e89c64bce9d7bef141df3e3addff3308270835f67198041d3f4feec65", size = 4949, upload-time = "2026-02-04T08:26:56.442Z" },
|
|
1045
1044
|
]
|
|
1046
1045
|
|
|
1047
1046
|
[[package]]
|
|
1048
1047
|
name = "mm-print"
|
|
1049
|
-
version = "0.
|
|
1048
|
+
version = "0.3.0"
|
|
1050
1049
|
source = { registry = "https://pypi.org/simple" }
|
|
1051
1050
|
dependencies = [
|
|
1052
1051
|
{ name = "mm-std" },
|
|
1053
1052
|
{ name = "rich" },
|
|
1054
1053
|
{ name = "tomlkit" },
|
|
1055
1054
|
]
|
|
1056
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1055
|
+
sdist = { url = "https://files.pythonhosted.org/packages/2a/a2/ca30dcf0fc19f31f924328df4a20f09bbcc4068f9f7623fa003bad2d9bb0/mm_print-0.3.0.tar.gz", hash = "sha256:9b9ddc362ad7f1ee3231e65dc9ec2ff3a535f9d922f330a4d73694a5eada7fa7", size = 31303, upload-time = "2026-01-23T11:26:35.413Z" }
|
|
1057
1056
|
wheels = [
|
|
1058
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1057
|
+
{ url = "https://files.pythonhosted.org/packages/bf/db/737d1564f6f45fc920d899f029ca019a910383d7f17d086b4ab631fc6e52/mm_print-0.3.0-py3-none-any.whl", hash = "sha256:232adc794101374716d736c011a61c3dc7934e72384b096d57ebe89ddfd25de5", size = 2028, upload-time = "2026-01-23T11:26:34.375Z" },
|
|
1059
1058
|
]
|
|
1060
1059
|
|
|
1061
1060
|
[[package]]
|
|
1062
1061
|
name = "mm-result"
|
|
1063
|
-
version = "0.
|
|
1062
|
+
version = "0.2.0"
|
|
1064
1063
|
source = { registry = "https://pypi.org/simple" }
|
|
1065
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1064
|
+
sdist = { url = "https://files.pythonhosted.org/packages/03/04/08740b05a9715cf41400d4e024d7c81c42900a31fe44c006c78b31001346/mm_result-0.2.0.tar.gz", hash = "sha256:68e6423b404a9f96481fda42d155b93a047c4c0e61578d355c29228ed018b4c3", size = 42576, upload-time = "2026-01-23T14:11:47.939Z" }
|
|
1066
1065
|
wheels = [
|
|
1067
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1066
|
+
{ url = "https://files.pythonhosted.org/packages/ae/07/2edaf6120e5ed2e8bb6fff86d93247274bb698401bca9e9a8f4bac54f9fa/mm_result-0.2.0-py3-none-any.whl", hash = "sha256:37a2200827e0399c230be894f009695969233b2eb217cf8fdbcfc39edb1dcb1a", size = 5495, upload-time = "2026-01-23T14:11:48.795Z" },
|
|
1068
1067
|
]
|
|
1069
1068
|
|
|
1070
1069
|
[[package]]
|
|
1071
1070
|
name = "mm-sol"
|
|
1072
|
-
version = "0.
|
|
1071
|
+
version = "0.8.0"
|
|
1073
1072
|
source = { registry = "https://pypi.org/simple" }
|
|
1074
1073
|
dependencies = [
|
|
1075
1074
|
{ name = "base58" },
|
|
@@ -1079,23 +1078,23 @@ dependencies = [
|
|
|
1079
1078
|
{ name = "solana" },
|
|
1080
1079
|
{ name = "typer" },
|
|
1081
1080
|
]
|
|
1082
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1081
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ee/4d/70300b1f88bbadee7bcdca0176dfcc30b05e6114dbf62b43451c90225731/mm_sol-0.8.0.tar.gz", hash = "sha256:7830b30965b44bd865009f4bcd603ff0f20e8de224ca1a08dc4da494fb17b95e", size = 79352, upload-time = "2026-02-04T12:07:02.48Z" }
|
|
1083
1082
|
wheels = [
|
|
1084
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1083
|
+
{ url = "https://files.pythonhosted.org/packages/fd/8e/a7653c278649811f135e7c1240c2189c3a32ae56a4602cc24a2ad9c66d58/mm_sol-0.8.0-py3-none-any.whl", hash = "sha256:047be50f56a4d0d277c9fe4dcc6b526d845527988f4250b7b369fc2d4b9e31b9", size = 25315, upload-time = "2026-02-04T12:07:01.404Z" },
|
|
1085
1084
|
]
|
|
1086
1085
|
|
|
1087
1086
|
[[package]]
|
|
1088
1087
|
name = "mm-std"
|
|
1089
|
-
version = "0.
|
|
1088
|
+
version = "0.7.1"
|
|
1090
1089
|
source = { registry = "https://pypi.org/simple" }
|
|
1091
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1090
|
+
sdist = { url = "https://files.pythonhosted.org/packages/80/9c/7ff712ef4b57e59416f95583cb3ae13e2ed40c9768fc34b89d4023ff2cc4/mm_std-0.7.1.tar.gz", hash = "sha256:7fa306e103eff001bb45ec51ca5aa7a31f269c4690fe6cd94e1b5fb252e0a032", size = 38077, upload-time = "2026-02-03T08:41:28.736Z" }
|
|
1092
1091
|
wheels = [
|
|
1093
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1092
|
+
{ url = "https://files.pythonhosted.org/packages/f1/86/d3d6653925530af1d83bd8776f51f4f40fed6b2b4c8ca0ae80c09d5bb32e/mm_std-0.7.1-py3-none-any.whl", hash = "sha256:1900c3520f27513d746ed53787391a1a001c68a60f7436c356e5746892a8cad4", size = 8542, upload-time = "2026-02-03T08:41:27.524Z" },
|
|
1094
1093
|
]
|
|
1095
1094
|
|
|
1096
1095
|
[[package]]
|
|
1097
1096
|
name = "mm-web3"
|
|
1098
|
-
version = "0.
|
|
1097
|
+
version = "0.6.2"
|
|
1099
1098
|
source = { registry = "https://pypi.org/simple" }
|
|
1100
1099
|
dependencies = [
|
|
1101
1100
|
{ name = "loguru" },
|
|
@@ -1103,9 +1102,9 @@ dependencies = [
|
|
|
1103
1102
|
{ name = "mm-print" },
|
|
1104
1103
|
{ name = "mm-std" },
|
|
1105
1104
|
]
|
|
1106
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1105
|
+
sdist = { url = "https://files.pythonhosted.org/packages/0e/b6/03b72575a62384b0937e495f8492a48d18b7d9b21170b2bf2f0a1cb94f3a/mm_web3-0.6.2.tar.gz", hash = "sha256:c87adf1f3573bb01c617f25fbb1e4eac233a1d0b9001a94f488c0726f4dfa167", size = 89719, upload-time = "2026-02-04T08:29:10.277Z" }
|
|
1107
1106
|
wheels = [
|
|
1108
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1107
|
+
{ url = "https://files.pythonhosted.org/packages/ff/7b/64b2dd1cce0d2709d0673ffdad4db94f71aa458e3af7e0fe13942eca26fc/mm_web3-0.6.2-py3-none-any.whl", hash = "sha256:8da304d3c6eb467edbd2de2560a8ffdbe5dff69894e3c9d9edbf72d9de55613a", size = 15337, upload-time = "2026-02-04T08:29:11.207Z" },
|
|
1109
1108
|
]
|
|
1110
1109
|
|
|
1111
1110
|
[[package]]
|
|
@@ -1480,14 +1479,14 @@ wheels = [
|
|
|
1480
1479
|
|
|
1481
1480
|
[[package]]
|
|
1482
1481
|
name = "pydash"
|
|
1483
|
-
version = "8.0.
|
|
1482
|
+
version = "8.0.6"
|
|
1484
1483
|
source = { registry = "https://pypi.org/simple" }
|
|
1485
1484
|
dependencies = [
|
|
1486
1485
|
{ name = "typing-extensions" },
|
|
1487
1486
|
]
|
|
1488
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1487
|
+
sdist = { url = "https://files.pythonhosted.org/packages/75/c1/1c55272f49d761cec38ddb80be9817935b9c91ebd6a8988e10f532868d56/pydash-8.0.6.tar.gz", hash = "sha256:b2821547e9723f69cf3a986be4db64de41730be149b2641947ecd12e1e11025a", size = 164338, upload-time = "2026-01-17T16:42:56.576Z" }
|
|
1489
1488
|
wheels = [
|
|
1490
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1489
|
+
{ url = "https://files.pythonhosted.org/packages/a5/b7/cc5e7974699db40014d58c7dd7c4ad4ffc244d36930dc9ec7d06ee67d7a9/pydash-8.0.6-py3-none-any.whl", hash = "sha256:ee70a81a5b292c007f28f03a4ee8e75c1f5d7576df5457b836ec7ab2839cc5d0", size = 101561, upload-time = "2026-01-17T16:42:55.448Z" },
|
|
1491
1490
|
]
|
|
1492
1491
|
|
|
1493
1492
|
[[package]]
|
|
@@ -1722,28 +1721,27 @@ wheels = [
|
|
|
1722
1721
|
|
|
1723
1722
|
[[package]]
|
|
1724
1723
|
name = "ruff"
|
|
1725
|
-
version = "0.
|
|
1726
|
-
source = { registry = "https://pypi.org/simple" }
|
|
1727
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1728
|
-
wheels = [
|
|
1729
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1730
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1731
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1732
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1733
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1734
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1735
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1736
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1737
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1738
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1739
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1740
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1741
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1742
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1743
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1744
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1745
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1746
|
-
{ url = "https://files.pythonhosted.org/packages/4d/e1/7348090988095e4e39560cfc2f7555b1b2a7357deba19167b600fdf5215d/ruff-0.14.13-py3-none-win_arm64.whl", hash = "sha256:7ab819e14f1ad9fe39f246cfcc435880ef7a9390d81a2b6ac7e01039083dd247", size = 13080224, upload-time = "2026-01-15T20:14:45.853Z" },
|
|
1724
|
+
version = "0.15.0"
|
|
1725
|
+
source = { registry = "https://pypi.org/simple" }
|
|
1726
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c8/39/5cee96809fbca590abea6b46c6d1c586b49663d1d2830a751cc8fc42c666/ruff-0.15.0.tar.gz", hash = "sha256:6bdea47cdbea30d40f8f8d7d69c0854ba7c15420ec75a26f463290949d7f7e9a", size = 4524893, upload-time = "2026-02-03T17:53:35.357Z" }
|
|
1727
|
+
wheels = [
|
|
1728
|
+
{ url = "https://files.pythonhosted.org/packages/bc/88/3fd1b0aa4b6330d6aaa63a285bc96c9f71970351579152d231ed90914586/ruff-0.15.0-py3-none-linux_armv6l.whl", hash = "sha256:aac4ebaa612a82b23d45964586f24ae9bc23ca101919f5590bdb368d74ad5455", size = 10354332, upload-time = "2026-02-03T17:52:54.892Z" },
|
|
1729
|
+
{ url = "https://files.pythonhosted.org/packages/72/f6/62e173fbb7eb75cc29fe2576a1e20f0a46f671a2587b5f604bfb0eaf5f6f/ruff-0.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dcd4be7cc75cfbbca24a98d04d0b9b36a270d0833241f776b788d59f4142b14d", size = 10767189, upload-time = "2026-02-03T17:53:19.778Z" },
|
|
1730
|
+
{ url = "https://files.pythonhosted.org/packages/99/e4/968ae17b676d1d2ff101d56dc69cf333e3a4c985e1ec23803df84fc7bf9e/ruff-0.15.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d747e3319b2bce179c7c1eaad3d884dc0a199b5f4d5187620530adf9105268ce", size = 10075384, upload-time = "2026-02-03T17:53:29.241Z" },
|
|
1731
|
+
{ url = "https://files.pythonhosted.org/packages/a2/bf/9843c6044ab9e20af879c751487e61333ca79a2c8c3058b15722386b8cae/ruff-0.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:650bd9c56ae03102c51a5e4b554d74d825ff3abe4db22b90fd32d816c2e90621", size = 10481363, upload-time = "2026-02-03T17:52:43.332Z" },
|
|
1732
|
+
{ url = "https://files.pythonhosted.org/packages/55/d9/4ada5ccf4cd1f532db1c8d44b6f664f2208d3d93acbeec18f82315e15193/ruff-0.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6664b7eac559e3048223a2da77769c2f92b43a6dfd4720cef42654299a599c9", size = 10187736, upload-time = "2026-02-03T17:53:00.522Z" },
|
|
1733
|
+
{ url = "https://files.pythonhosted.org/packages/86/e2/f25eaecd446af7bb132af0a1d5b135a62971a41f5366ff41d06d25e77a91/ruff-0.15.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f811f97b0f092b35320d1556f3353bf238763420ade5d9e62ebd2b73f2ff179", size = 10968415, upload-time = "2026-02-03T17:53:15.705Z" },
|
|
1734
|
+
{ url = "https://files.pythonhosted.org/packages/e7/dc/f06a8558d06333bf79b497d29a50c3a673d9251214e0d7ec78f90b30aa79/ruff-0.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:761ec0a66680fab6454236635a39abaf14198818c8cdf691e036f4bc0f406b2d", size = 11809643, upload-time = "2026-02-03T17:53:23.031Z" },
|
|
1735
|
+
{ url = "https://files.pythonhosted.org/packages/dd/45/0ece8db2c474ad7df13af3a6d50f76e22a09d078af63078f005057ca59eb/ruff-0.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:940f11c2604d317e797b289f4f9f3fa5555ffe4fb574b55ed006c3d9b6f0eb78", size = 11234787, upload-time = "2026-02-03T17:52:46.432Z" },
|
|
1736
|
+
{ url = "https://files.pythonhosted.org/packages/8a/d9/0e3a81467a120fd265658d127db648e4d3acfe3e4f6f5d4ea79fac47e587/ruff-0.15.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcbca3d40558789126da91d7ef9a7c87772ee107033db7191edefa34e2c7f1b4", size = 11112797, upload-time = "2026-02-03T17:52:49.274Z" },
|
|
1737
|
+
{ url = "https://files.pythonhosted.org/packages/b2/cb/8c0b3b0c692683f8ff31351dfb6241047fa873a4481a76df4335a8bff716/ruff-0.15.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9a121a96db1d75fa3eb39c4539e607f628920dd72ff1f7c5ee4f1b768ac62d6e", size = 11033133, upload-time = "2026-02-03T17:53:33.105Z" },
|
|
1738
|
+
{ url = "https://files.pythonhosted.org/packages/f8/5e/23b87370cf0f9081a8c89a753e69a4e8778805b8802ccfe175cc410e50b9/ruff-0.15.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5298d518e493061f2eabd4abd067c7e4fb89e2f63291c94332e35631c07c3662", size = 10442646, upload-time = "2026-02-03T17:53:06.278Z" },
|
|
1739
|
+
{ url = "https://files.pythonhosted.org/packages/e1/9a/3c94de5ce642830167e6d00b5c75aacd73e6347b4c7fc6828699b150a5ee/ruff-0.15.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:afb6e603d6375ff0d6b0cee563fa21ab570fd15e65c852cb24922cef25050cf1", size = 10195750, upload-time = "2026-02-03T17:53:26.084Z" },
|
|
1740
|
+
{ url = "https://files.pythonhosted.org/packages/30/15/e396325080d600b436acc970848d69df9c13977942fb62bb8722d729bee8/ruff-0.15.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:77e515f6b15f828b94dc17d2b4ace334c9ddb7d9468c54b2f9ed2b9c1593ef16", size = 10676120, upload-time = "2026-02-03T17:53:09.363Z" },
|
|
1741
|
+
{ url = "https://files.pythonhosted.org/packages/8d/c9/229a23d52a2983de1ad0fb0ee37d36e0257e6f28bfd6b498ee2c76361874/ruff-0.15.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6f6e80850a01eb13b3e42ee0ebdf6e4497151b48c35051aab51c101266d187a3", size = 11201636, upload-time = "2026-02-03T17:52:57.281Z" },
|
|
1742
|
+
{ url = "https://files.pythonhosted.org/packages/6f/b0/69adf22f4e24f3677208adb715c578266842e6e6a3cc77483f48dd999ede/ruff-0.15.0-py3-none-win32.whl", hash = "sha256:238a717ef803e501b6d51e0bdd0d2c6e8513fe9eec14002445134d3907cd46c3", size = 10465945, upload-time = "2026-02-03T17:53:12.591Z" },
|
|
1743
|
+
{ url = "https://files.pythonhosted.org/packages/51/ad/f813b6e2c97e9b4598be25e94a9147b9af7e60523b0cb5d94d307c15229d/ruff-0.15.0-py3-none-win_amd64.whl", hash = "sha256:dd5e4d3301dc01de614da3cdffc33d4b1b96fb89e45721f1598e5532ccf78b18", size = 11564657, upload-time = "2026-02-03T17:52:51.893Z" },
|
|
1744
|
+
{ url = "https://files.pythonhosted.org/packages/f6/b0/2d823f6e77ebe560f4e397d078487e8d52c1516b331e3521bc75db4272ca/ruff-0.15.0-py3-none-win_arm64.whl", hash = "sha256:c480d632cc0ca3f0727acac8b7d053542d9e114a462a145d0b00e7cd658c515a", size = 10865753, upload-time = "2026-02-03T17:53:03.014Z" },
|
|
1747
1745
|
]
|
|
1748
1746
|
|
|
1749
1747
|
[[package]]
|
|
@@ -1877,11 +1875,11 @@ wheels = [
|
|
|
1877
1875
|
|
|
1878
1876
|
[[package]]
|
|
1879
1877
|
name = "tomlkit"
|
|
1880
|
-
version = "0.
|
|
1878
|
+
version = "0.14.0"
|
|
1881
1879
|
source = { registry = "https://pypi.org/simple" }
|
|
1882
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1880
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c3/af/14b24e41977adb296d6bd1fb59402cf7d60ce364f90c890bd2ec65c43b5a/tomlkit-0.14.0.tar.gz", hash = "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064", size = 187167, upload-time = "2026-01-13T01:14:53.304Z" }
|
|
1883
1881
|
wheels = [
|
|
1884
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1882
|
+
{ url = "https://files.pythonhosted.org/packages/b5/11/87d6d29fb5d237229d67973a6c9e06e048f01cf4994dee194ab0ea841814/tomlkit-0.14.0-py3-none-any.whl", hash = "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680", size = 39310, upload-time = "2026-01-13T01:14:51.965Z" },
|
|
1885
1883
|
]
|
|
1886
1884
|
|
|
1887
1885
|
[[package]]
|
|
@@ -1952,7 +1950,7 @@ wheels = [
|
|
|
1952
1950
|
|
|
1953
1951
|
[[package]]
|
|
1954
1952
|
name = "web3"
|
|
1955
|
-
version = "7.14.
|
|
1953
|
+
version = "7.14.1"
|
|
1956
1954
|
source = { registry = "https://pypi.org/simple" }
|
|
1957
1955
|
dependencies = [
|
|
1958
1956
|
{ name = "aiohttp" },
|
|
@@ -1970,9 +1968,9 @@ dependencies = [
|
|
|
1970
1968
|
{ name = "typing-extensions" },
|
|
1971
1969
|
{ name = "websockets" },
|
|
1972
1970
|
]
|
|
1973
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1971
|
+
sdist = { url = "https://files.pythonhosted.org/packages/26/41/435cb36d36fc5142428292b876d0553d35af95e1582ecb7d8bcb64039d18/web3-7.14.1.tar.gz", hash = "sha256:856dc8517f362aefa75fdc298d975894055565dc866f21279f27fe060b7fb2c3", size = 2208998, upload-time = "2026-02-03T22:56:41.426Z" }
|
|
1974
1972
|
wheels = [
|
|
1975
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1973
|
+
{ url = "https://files.pythonhosted.org/packages/7f/d1/862bbf48867685de1a563de20a9bad2b8c5c5678b3f08adc0e06797783f5/web3-7.14.1-py3-none-any.whl", hash = "sha256:bec367ba44261f874662aed9b5e138aa7bb907700a30a7580b2264534e88ce12", size = 1371268, upload-time = "2026-02-03T22:56:36.577Z" },
|
|
1976
1974
|
]
|
|
1977
1975
|
|
|
1978
1976
|
[[package]]
|
mm_balance-0.6.1/CLAUDE.md
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Claude Guidelines
|
|
2
|
-
|
|
3
|
-
## Critical Guidelines
|
|
4
|
-
|
|
5
|
-
1. **Always communicate in English** - Regardless of the language the user speaks, always respond in English. All code, comments, and documentation must be in English.
|
|
6
|
-
|
|
7
|
-
2. **Minimal documentation** - Only add comments/documentation when it simplifies understanding and isn't obvious from the code itself. Keep it strictly relevant and concise.
|
|
8
|
-
|
|
9
|
-
3. **Critical thinking** - Always critically evaluate user ideas. Users can make mistakes. Think first about whether the user's idea is good before implementing.
|
|
10
|
-
|
|
11
|
-
4. **Lint after changes** - After making code changes, always run `just lint` to verify code quality and fix any linter issues.
|
|
12
|
-
|
|
13
|
-
5. **No disabling linter rules** - Never use special disabling comments (like `# noqa`, `# type: ignore`, `# ruff: noqa`, etc.) to turn off linter rules without explicit permission. If you believe a rule should be disabled, ask first.
|
mm_balance-0.6.1/PKG-INFO
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: mm-balance
|
|
3
|
-
Version: 0.6.1
|
|
4
|
-
Requires-Python: >=3.14
|
|
5
|
-
Requires-Dist: deepdiff==8.6.1
|
|
6
|
-
Requires-Dist: mm-apt==0.5.1
|
|
7
|
-
Requires-Dist: mm-btc==0.5.6
|
|
8
|
-
Requires-Dist: mm-concurrency~=0.1.0
|
|
9
|
-
Requires-Dist: mm-eth==0.7.4
|
|
10
|
-
Requires-Dist: mm-sol==0.7.4
|
|
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
|