mm-balance 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_balance/balance_fetcher.py +5 -3
- mm_balance/cli.py +4 -3
- mm_balance/command_runner.py +4 -3
- mm_balance/config.py +10 -9
- mm_balance/constants.py +2 -2
- mm_balance/diff.py +13 -11
- mm_balance/output/formats/json_format.py +2 -2
- mm_balance/output/formats/table_format.py +8 -8
- mm_balance/price.py +3 -2
- mm_balance/result.py +1 -1
- mm_balance/rpc.py +2 -2
- mm_balance/token_decimals.py +7 -3
- mm_balance/utils.py +8 -0
- mm_balance-0.5.0.dist-info/METADATA +10 -0
- mm_balance-0.5.0.dist-info/RECORD +22 -0
- mm_balance-0.4.0.dist-info/METADATA +0 -10
- mm_balance-0.4.0.dist-info/RECORD +0 -22
- {mm_balance-0.4.0.dist-info → mm_balance-0.5.0.dist-info}/WHEEL +0 -0
- {mm_balance-0.4.0.dist-info → mm_balance-0.5.0.dist-info}/entry_points.txt +0 -0
mm_balance/balance_fetcher.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from decimal import Decimal
|
|
3
3
|
|
|
4
|
-
from
|
|
4
|
+
from mm_concurrency import AsyncTaskRunner
|
|
5
|
+
from mm_result import Result
|
|
5
6
|
from rich.progress import TaskID
|
|
6
7
|
|
|
7
8
|
from mm_balance import rpc
|
|
@@ -9,6 +10,7 @@ from mm_balance.config import Config
|
|
|
9
10
|
from mm_balance.constants import Network
|
|
10
11
|
from mm_balance.output import utils
|
|
11
12
|
from mm_balance.token_decimals import TokenDecimals
|
|
13
|
+
from mm_balance.utils import PrintFormat
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
@dataclass
|
|
@@ -39,7 +41,7 @@ class BalanceFetcher:
|
|
|
39
41
|
with self.progress_bar:
|
|
40
42
|
runner = AsyncTaskRunner(max_concurrent_tasks=10)
|
|
41
43
|
for network in self.config.networks():
|
|
42
|
-
runner.
|
|
44
|
+
runner.add(f"process_{network}", self._process_network(network))
|
|
43
45
|
await runner.run()
|
|
44
46
|
|
|
45
47
|
def get_group_tasks(self, group_index: int, network: Network) -> list[Task]:
|
|
@@ -54,7 +56,7 @@ class BalanceFetcher:
|
|
|
54
56
|
async def _process_network(self, network: Network) -> None:
|
|
55
57
|
runner = AsyncTaskRunner(max_concurrent_tasks=self.config.workers[network])
|
|
56
58
|
for idx, task in enumerate(self.tasks[network]):
|
|
57
|
-
runner.
|
|
59
|
+
runner.add(str(idx), self._get_balance(network, task.wallet_address, task.token_address))
|
|
58
60
|
res = await runner.run()
|
|
59
61
|
|
|
60
62
|
# TODO: print job.exceptions if present
|
mm_balance/cli.py
CHANGED
|
@@ -4,12 +4,13 @@ import pkgutil
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from typing import Annotated
|
|
6
6
|
|
|
7
|
+
import mm_print
|
|
7
8
|
import typer
|
|
8
|
-
from mm_std import PrintFormat, fatal, pretty_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
14
|
|
|
14
15
|
app = typer.Typer(no_args_is_help=True, pretty_exceptions_enable=False, add_completion=False)
|
|
15
16
|
|
|
@@ -24,8 +25,8 @@ def example_callback(value: bool) -> None:
|
|
|
24
25
|
if value:
|
|
25
26
|
data = pkgutil.get_data(__name__, "config/example.toml")
|
|
26
27
|
if data is None:
|
|
27
|
-
fatal("Example config not found")
|
|
28
|
-
|
|
28
|
+
mm_print.fatal("Example config not found")
|
|
29
|
+
mm_print.toml(toml=data.decode("utf-8"))
|
|
29
30
|
raise typer.Exit
|
|
30
31
|
|
|
31
32
|
|
mm_balance/command_runner.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import getpass
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
import mm_print
|
|
5
5
|
from pydantic import BaseModel
|
|
6
6
|
|
|
7
7
|
from mm_balance.balance_fetcher import BalanceFetcher
|
|
@@ -11,6 +11,7 @@ from mm_balance.output.formats import json_format, table_format
|
|
|
11
11
|
from mm_balance.price import Prices, get_prices
|
|
12
12
|
from mm_balance.result import create_balances_result
|
|
13
13
|
from mm_balance.token_decimals import get_token_decimals
|
|
14
|
+
from mm_balance.utils import PrintFormat
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
class CommandParameters(BaseModel):
|
|
@@ -27,7 +28,7 @@ class CommandParameters(BaseModel):
|
|
|
27
28
|
async def run(params: CommandParameters) -> None:
|
|
28
29
|
zip_password = "" # nosec
|
|
29
30
|
if params.config_path.name.endswith(".zip"):
|
|
30
|
-
zip_password = getpass.getpass("zip password")
|
|
31
|
+
zip_password = getpass.getpass("zip password: ")
|
|
31
32
|
config = Config.read_toml_config_or_exit(params.config_path, zip_password=zip_password)
|
|
32
33
|
if params.print_config:
|
|
33
34
|
config.print_and_exit()
|
|
@@ -62,7 +63,7 @@ async def run(params: CommandParameters) -> None:
|
|
|
62
63
|
elif config.settings.print_format is PrintFormat.JSON:
|
|
63
64
|
json_format.print_result(config, token_decimals, prices, workers, result)
|
|
64
65
|
else:
|
|
65
|
-
fatal("Unsupported print format")
|
|
66
|
+
mm_print.fatal("Unsupported print format")
|
|
66
67
|
|
|
67
68
|
if params.save_balances:
|
|
68
69
|
BalancesDict.from_balances_result(result).save_to_path(params.save_balances)
|
mm_balance/config.py
CHANGED
|
@@ -4,19 +4,20 @@ from decimal import Decimal
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from typing import Annotated, Self
|
|
6
6
|
|
|
7
|
+
import mm_print
|
|
7
8
|
import pydash
|
|
8
|
-
from
|
|
9
|
-
from mm_std import BaseConfig, PrintFormat, fatal
|
|
9
|
+
from mm_cryptocurrency import ConfigValidators, CryptocurrencyConfig
|
|
10
10
|
from pydantic import BeforeValidator, Field, StringConstraints, model_validator
|
|
11
11
|
|
|
12
12
|
from mm_balance.constants import DEFAULT_NODES, TOKEN_ADDRESS, Network
|
|
13
|
+
from mm_balance.utils import PrintFormat
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
class Validators(ConfigValidators):
|
|
16
17
|
pass
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
class AssetGroup(
|
|
20
|
+
class AssetGroup(CryptocurrencyConfig):
|
|
20
21
|
"""
|
|
21
22
|
Represents a group of cryptocurrency assets of the same type.
|
|
22
23
|
|
|
@@ -30,7 +31,7 @@ class AssetGroup(BaseConfig):
|
|
|
30
31
|
token: str | None = None # Token address. If None, it's a native token
|
|
31
32
|
decimals: int | None = None
|
|
32
33
|
coingecko_id: str | None = None
|
|
33
|
-
addresses: Annotated[list[str], BeforeValidator(Validators.addresses(
|
|
34
|
+
addresses: Annotated[list[str], BeforeValidator(Validators.addresses(deduplicate=True))]
|
|
34
35
|
share: Decimal = Decimal(1)
|
|
35
36
|
|
|
36
37
|
@property
|
|
@@ -57,7 +58,7 @@ class AssetGroup(BaseConfig):
|
|
|
57
58
|
if path.is_file():
|
|
58
59
|
result += path.read_text().strip().splitlines()
|
|
59
60
|
else:
|
|
60
|
-
fatal(f"File with addresses not found: {path}")
|
|
61
|
+
mm_print.fatal(f"File with addresses not found: {path}")
|
|
61
62
|
elif line.startswith("group:"):
|
|
62
63
|
group_name = line.removeprefix("group:").strip()
|
|
63
64
|
address_group = next((ag for ag in address_groups if ag.name == group_name), None)
|
|
@@ -72,12 +73,12 @@ class AssetGroup(BaseConfig):
|
|
|
72
73
|
self.addresses = pydash.uniq(result)
|
|
73
74
|
|
|
74
75
|
|
|
75
|
-
class AddressCollection(
|
|
76
|
+
class AddressCollection(CryptocurrencyConfig):
|
|
76
77
|
name: str
|
|
77
|
-
addresses: Annotated[list[str], BeforeValidator(
|
|
78
|
+
addresses: Annotated[list[str], BeforeValidator(Validators.addresses(deduplicate=True))]
|
|
78
79
|
|
|
79
80
|
|
|
80
|
-
class Settings(
|
|
81
|
+
class Settings(CryptocurrencyConfig):
|
|
81
82
|
proxies: Annotated[list[str], Field(default_factory=list), BeforeValidator(Validators.proxies())]
|
|
82
83
|
round_ndigits: int = 4
|
|
83
84
|
print_format: PrintFormat = PrintFormat.TABLE
|
|
@@ -87,7 +88,7 @@ class Settings(BaseConfig):
|
|
|
87
88
|
format_number_separator: str = "," # as thousands separators
|
|
88
89
|
|
|
89
90
|
|
|
90
|
-
class Config(
|
|
91
|
+
class Config(CryptocurrencyConfig):
|
|
91
92
|
groups: list[AssetGroup] = Field(alias="coins")
|
|
92
93
|
addresses: list[AddressCollection] = Field(default_factory=list)
|
|
93
94
|
nodes: dict[Network, list[str]] = Field(default_factory=dict)
|
mm_balance/constants.py
CHANGED
|
@@ -64,9 +64,9 @@ TICKER_TO_COINGECKO_ID = {
|
|
|
64
64
|
USD_STABLECOINS = ["USDT", "USDC"]
|
|
65
65
|
|
|
66
66
|
DEFAULT_NODES: dict[Network, list[str]] = {
|
|
67
|
-
NETWORK_ARBITRUM_ONE: ["https://arb1.arbitrum.io/rpc", "https://arbitrum.
|
|
67
|
+
NETWORK_ARBITRUM_ONE: ["https://arb1.arbitrum.io/rpc", "https://arbitrum.drpc.org"],
|
|
68
68
|
NETWORK_BITCOIN: [],
|
|
69
|
-
NETWORK_ETHEREUM: ["https://ethereum.publicnode.com", "https://rpc.
|
|
69
|
+
NETWORK_ETHEREUM: ["https://ethereum.publicnode.com", "https://eth.merkle.io", "https://rpc.flashbots.net"],
|
|
70
70
|
NETWORK_SOLANA: ["https://api.mainnet-beta.solana.com"],
|
|
71
71
|
NETWORK_OP_MAINNET: ["https://mainnet.optimism.io", "https://optimism.llamarpc.com"],
|
|
72
72
|
NETWORK_APTOS: ["https://fullnode.mainnet.aptoslabs.com/v1"],
|
mm_balance/diff.py
CHANGED
|
@@ -5,11 +5,12 @@ import re
|
|
|
5
5
|
from decimal import Decimal
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
|
|
8
|
+
import mm_print
|
|
8
9
|
from deepdiff.diff import DeepDiff
|
|
9
|
-
from mm_std import PrintFormat, print_json, print_plain, print_table
|
|
10
10
|
from pydantic import BaseModel, RootModel
|
|
11
11
|
|
|
12
12
|
from mm_balance.result import Balance, BalancesResult
|
|
13
|
+
from mm_balance.utils import PrintFormat
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
class BalancesDict(RootModel[dict[str, dict[str, dict[str, Decimal]]]]): # network->ticker->address->balance
|
|
@@ -71,23 +72,23 @@ class Diff(BaseModel):
|
|
|
71
72
|
and not self.address_removed
|
|
72
73
|
and not self.balance_changed
|
|
73
74
|
):
|
|
74
|
-
|
|
75
|
+
mm_print.plain("Diff: no changes")
|
|
75
76
|
return
|
|
76
77
|
|
|
77
|
-
|
|
78
|
+
mm_print.plain("\nDiff")
|
|
78
79
|
|
|
79
80
|
if self.network_added:
|
|
80
|
-
|
|
81
|
+
mm_print.plain(f"networks added: {self.network_added}")
|
|
81
82
|
if self.network_removed:
|
|
82
|
-
|
|
83
|
+
mm_print.plain(f"networks removed: {self.network_removed}")
|
|
83
84
|
if self.ticker_added:
|
|
84
|
-
|
|
85
|
+
mm_print.plain(f"tickers added: {self.ticker_added}")
|
|
85
86
|
if self.ticker_removed:
|
|
86
|
-
|
|
87
|
+
mm_print.plain(f"tickers removed: {self.ticker_removed}")
|
|
87
88
|
if self.address_added:
|
|
88
|
-
|
|
89
|
+
mm_print.plain(f"addresses added: {self.address_added}")
|
|
89
90
|
if self.address_removed:
|
|
90
|
-
|
|
91
|
+
mm_print.plain(f"addresses removed: {self.address_removed}")
|
|
91
92
|
|
|
92
93
|
if self.balance_changed:
|
|
93
94
|
rows = []
|
|
@@ -96,10 +97,11 @@ class Diff(BaseModel):
|
|
|
96
97
|
for address in self.balance_changed[network][ticker]:
|
|
97
98
|
old_value, new_value = self.balance_changed[network][ticker][address]
|
|
98
99
|
rows.append([network, ticker, address, old_value, new_value, new_value - old_value])
|
|
99
|
-
|
|
100
|
+
mm_print.table("", ["Network", "Ticker", "Address", "Old", "New", "Change"], rows)
|
|
100
101
|
|
|
101
102
|
def _print_json(self) -> None:
|
|
102
|
-
|
|
103
|
+
# mm_print.json(data=self.model_dump(), type_handlers=str) ?? default?
|
|
104
|
+
mm_print.json(data=self.model_dump())
|
|
103
105
|
|
|
104
106
|
@staticmethod
|
|
105
107
|
def calc(balances1: BalancesDict, balances2: BalancesDict) -> Diff:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import mm_print
|
|
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
|
+
mm_print.json(data)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from decimal import Decimal
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import mm_print
|
|
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
|
+
mm_print.table("Nodes", ["network", "nodes"], rows)
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def print_proxy_count(config: Config) -> None:
|
|
21
|
-
|
|
21
|
+
mm_print.table("Proxies", ["count"], [[len(config.settings.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
|
+
mm_print.table("Token Decimals", ["network", "decimals"], rows)
|
|
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
|
+
mm_print.table("Prices", ["coin", "usd"], rows)
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
def print_result(config: Config, result: BalancesResult, workers: BalanceFetcher) -> None:
|
|
@@ -57,7 +57,7 @@ def _print_errors(config: Config, workers: BalanceFetcher) -> None:
|
|
|
57
57
|
for task in error_tasks:
|
|
58
58
|
group = config.groups[task.group_index]
|
|
59
59
|
rows.append([group.ticker + " / " + group.network, task.wallet_address, task.balance.error]) # type: ignore[union-attr]
|
|
60
|
-
|
|
60
|
+
mm_print.table("Errors", ["coin", "address", "error"], rows)
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
def _print_total(config: Config, total: Total, is_share_total: bool) -> None:
|
|
@@ -80,7 +80,7 @@ def _print_total(config: Config, total: Total, is_share_total: bool) -> None:
|
|
|
80
80
|
rows.append(["stablecoin_sum", format_number(total.stablecoin_sum, config.settings.format_number_separator, "$")])
|
|
81
81
|
rows.append(["total_usd_sum", format_number(total.total_usd_sum, config.settings.format_number_separator, "$")])
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
mm_print.table(table_name, headers, rows)
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
def _print_group(config: Config, group: GroupResult) -> None:
|
|
@@ -118,4 +118,4 @@ def _print_group(config: Config, group: GroupResult) -> None:
|
|
|
118
118
|
table_headers = ["address", "balance"]
|
|
119
119
|
if config.settings.price:
|
|
120
120
|
table_headers += ["usd"]
|
|
121
|
-
|
|
121
|
+
mm_print.table(group_name, table_headers, rows)
|
mm_balance/price.py
CHANGED
|
@@ -2,7 +2,8 @@ from collections import defaultdict
|
|
|
2
2
|
from decimal import Decimal
|
|
3
3
|
|
|
4
4
|
import pydash
|
|
5
|
-
from
|
|
5
|
+
from mm_cryptocurrency import random_proxy
|
|
6
|
+
from mm_http import http_request
|
|
6
7
|
|
|
7
8
|
from mm_balance.config import AssetGroup, Config
|
|
8
9
|
from mm_balance.constants import RETRIES_COINGECKO_PRICES, TICKER_TO_COINGECKO_ID
|
|
@@ -29,7 +30,7 @@ async def get_prices(config: Config) -> Prices:
|
|
|
29
30
|
|
|
30
31
|
url = f"https://api.coingecko.com/api/v3/simple/price?ids={','.join(coingecko_map.values())}&vs_currencies=usd"
|
|
31
32
|
for _ in range(RETRIES_COINGECKO_PRICES):
|
|
32
|
-
res = await http_request(url, proxy=
|
|
33
|
+
res = await http_request(url, proxy=random_proxy(config.settings.proxies))
|
|
33
34
|
if res.status_code != 200:
|
|
34
35
|
continue
|
|
35
36
|
|
mm_balance/result.py
CHANGED
|
@@ -110,7 +110,7 @@ def _create_group_result(config: Config, group: AssetGroup, tasks: list[Task], p
|
|
|
110
110
|
balance_sum += balance.balance
|
|
111
111
|
usd_sum += balance.usd_value
|
|
112
112
|
else:
|
|
113
|
-
balance = task.balance.
|
|
113
|
+
balance = task.balance.unwrap_err()
|
|
114
114
|
addresses.append(AddressBalance(address=task.wallet_address, balance=balance))
|
|
115
115
|
|
|
116
116
|
balance_sum_share = balance_sum * group.share
|
mm_balance/rpc.py
CHANGED
|
@@ -2,10 +2,10 @@ from decimal import Decimal
|
|
|
2
2
|
|
|
3
3
|
from mm_apt import retry as apt_retry
|
|
4
4
|
from mm_btc.blockstream import BlockstreamClient
|
|
5
|
-
from
|
|
5
|
+
from mm_cryptocurrency import Nodes, Proxies
|
|
6
6
|
from mm_eth import retry as eth_retry
|
|
7
|
+
from mm_result import Result
|
|
7
8
|
from mm_sol import retry as sol_retry
|
|
8
|
-
from mm_std import Result
|
|
9
9
|
|
|
10
10
|
from mm_balance.constants import (
|
|
11
11
|
NETWORK_APTOS,
|
mm_balance/token_decimals.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import mm_print
|
|
2
2
|
|
|
3
3
|
from mm_balance import rpc
|
|
4
4
|
from mm_balance.config import Config
|
|
@@ -30,7 +30,7 @@ async def get_token_decimals(config: Config) -> TokenDecimals:
|
|
|
30
30
|
elif group.network in (NETWORK_BITCOIN, NETWORK_APTOS):
|
|
31
31
|
result[group.network][None] = 8
|
|
32
32
|
else:
|
|
33
|
-
fatal(f"Can't get token decimals for native token on network: {group.network}")
|
|
33
|
+
mm_print.fatal(f"Can't get token decimals for native token on network: {group.network}")
|
|
34
34
|
continue
|
|
35
35
|
|
|
36
36
|
# get token_decimals via RPC
|
|
@@ -43,7 +43,11 @@ async def get_token_decimals(config: Config) -> TokenDecimals:
|
|
|
43
43
|
)
|
|
44
44
|
|
|
45
45
|
if res.is_err():
|
|
46
|
-
|
|
46
|
+
msg = f"can't get decimals for token {group.ticker} / {group.token}, error={res.unwrap_err()}"
|
|
47
|
+
if config.settings.print_debug:
|
|
48
|
+
msg += f"\n{res.extra}"
|
|
49
|
+
mm_print.fatal(msg)
|
|
50
|
+
|
|
47
51
|
result[group.network][group.token] = res.unwrap()
|
|
48
52
|
|
|
49
53
|
return result
|
mm_balance/utils.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from decimal import Decimal
|
|
2
|
+
from enum import StrEnum, unique
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
def fnumber(value: Decimal, separator: str, extra: str | None = None) -> str:
|
|
@@ -20,3 +21,10 @@ def round_decimal(value: Decimal, round_ndigits: int) -> Decimal:
|
|
|
20
21
|
if value == Decimal(0):
|
|
21
22
|
return Decimal(0)
|
|
22
23
|
return round(value, round_ndigits)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@unique
|
|
27
|
+
class PrintFormat(StrEnum):
|
|
28
|
+
PLAIN = "plain"
|
|
29
|
+
TABLE = "table"
|
|
30
|
+
JSON = "json"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mm-balance
|
|
3
|
+
Version: 0.5.0
|
|
4
|
+
Requires-Python: >=3.13
|
|
5
|
+
Requires-Dist: deepdiff==8.5.0
|
|
6
|
+
Requires-Dist: mm-apt==0.4.1
|
|
7
|
+
Requires-Dist: mm-btc==0.5.2
|
|
8
|
+
Requires-Dist: mm-concurrency>=0.0.1
|
|
9
|
+
Requires-Dist: mm-eth==0.7.0
|
|
10
|
+
Requires-Dist: mm-sol==0.7.0
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
mm_balance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
mm_balance/balance_fetcher.py,sha256=OCRQz_8lYxBKIicwXR3ysQOYxbLfYKRfaLWiFLnR0c8,3239
|
|
3
|
+
mm_balance/cli.py,sha256=6qif4QExl4vZDYrasc2MAizmwe1xtvsncbxEdJkqK-M,2709
|
|
4
|
+
mm_balance/command_runner.py,sha256=chA43ZrWBrSKnL7VBuc_gIFs3zgmWm2XK66Vqz_3QKs,2875
|
|
5
|
+
mm_balance/config.py,sha256=r_tFtgRv17SJXoCKpiTLCk3ukcONG-TDFdo88vjdE9E,4970
|
|
6
|
+
mm_balance/constants.py,sha256=LhyW1EfNP5E8st-RPvD7p3QoIowFH2W14tkCf6NzveU,2468
|
|
7
|
+
mm_balance/diff.py,sha256=1NLzfzgOR34FTUFulWjOhUxNsMjt3W5u_7106FLBuaY,7172
|
|
8
|
+
mm_balance/price.py,sha256=s8B9TgbwAyB5x1bgOTbcftivCvCr40UmFmoOaXjBKyQ,1588
|
|
9
|
+
mm_balance/result.py,sha256=vBz_V-ZCkEhrf-Utc7VB_3eP0cuL9pAmEkVJbOpdKIc,5173
|
|
10
|
+
mm_balance/rpc.py,sha256=nNJoXIBen4xe0WS6nFYvL_7VyRzNe7we__swj6xN-bo,6126
|
|
11
|
+
mm_balance/token_decimals.py,sha256=leLKHJDmQzt8gnLvkARN96pYoEnus20_WNBPKDXDpKw,2067
|
|
12
|
+
mm_balance/utils.py,sha256=9vsm84f5MUp0s3Auy3JAHJ7saSWlLIlXkwoxqsuZrPU,765
|
|
13
|
+
mm_balance/config/example.toml,sha256=f3Jr40ziOCv_Txf-BysS89c9r7uS-IYHuvwbQ-iftUs,1802
|
|
14
|
+
mm_balance/output/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
+
mm_balance/output/utils.py,sha256=zyN9igdaXGY_vKfc-3dJ13mH1T7JDke3AeB4MY_3AsA,842
|
|
16
|
+
mm_balance/output/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
mm_balance/output/formats/json_format.py,sha256=uNs2P1J6QhxCsHo8TOqG6aQbDfBkVjIwYyo96d2K17Q,910
|
|
18
|
+
mm_balance/output/formats/table_format.py,sha256=sXVoKqDoVQXzt_iNyxfcQwG5lH-l8Ko5bm4_OZGKUfg,4788
|
|
19
|
+
mm_balance-0.5.0.dist-info/METADATA,sha256=Pjj-dEDVcj_fe1vklSG_ALmxFv44ngOpGpoJjF0ZWxY,262
|
|
20
|
+
mm_balance-0.5.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
21
|
+
mm_balance-0.5.0.dist-info/entry_points.txt,sha256=rSnP0ZW1a3ACNwTWM7T53CmOycKbzhG43m2_wseENng,50
|
|
22
|
+
mm_balance-0.5.0.dist-info/RECORD,,
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: mm-balance
|
|
3
|
-
Version: 0.4.0
|
|
4
|
-
Requires-Python: >=3.12
|
|
5
|
-
Requires-Dist: deepdiff==8.4.2
|
|
6
|
-
Requires-Dist: mm-apt==0.3.4
|
|
7
|
-
Requires-Dist: mm-btc==0.4.2
|
|
8
|
-
Requires-Dist: mm-eth==0.6.1
|
|
9
|
-
Requires-Dist: mm-sol==0.6.2
|
|
10
|
-
Requires-Dist: typer==0.15.2
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
mm_balance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
mm_balance/balance_fetcher.py,sha256=HUYoZkBdRSPb3AQ5MANOf1H9PQEyizaftXM4oCwp0Bs,3192
|
|
3
|
-
mm_balance/cli.py,sha256=0ZD0fEhzEgrBrXyxUVfuMikrcqJ5w9LSJST4U8DlSIE,2699
|
|
4
|
-
mm_balance/command_runner.py,sha256=4rWzQfGEznTNTm_tfVlp46FGlpUD0Wd7zFr0UyL1aws,2845
|
|
5
|
-
mm_balance/config.py,sha256=yVB-46HR7saXSsGKbHoxsu6cRMUVTSiuoEPSpSSiOv0,4886
|
|
6
|
-
mm_balance/constants.py,sha256=K1qOTHZNmv3_AsLAWzrRG5XCDBMOhVr1NLnL1_2bC08,2446
|
|
7
|
-
mm_balance/diff.py,sha256=GPRbykty2TIBBM8jpYXOV9Itjyd_mz0BTUsQ8KX7cNo,7099
|
|
8
|
-
mm_balance/price.py,sha256=QVnd0PTn-1ylVLJu230zVpGv5Bs8MgBkantU0pq2osE,1568
|
|
9
|
-
mm_balance/result.py,sha256=yx691T0E6FAe-NSiFMnf1KHBgbCAZPBBQ9xLgKs4_1U,5175
|
|
10
|
-
mm_balance/rpc.py,sha256=-alZDHjpcxna3fHDu_qDGCRMBupFU9x2NeOLGoUQM7U,6121
|
|
11
|
-
mm_balance/token_decimals.py,sha256=di4-LVkXmqAFGc9vrXF_Kq1Oqx3YHWZhavjXrXmigC0,1953
|
|
12
|
-
mm_balance/utils.py,sha256=_UMX3TV350Sr222tAnxGUf0R5McpwloNTQC-U-xiuHc,636
|
|
13
|
-
mm_balance/config/example.toml,sha256=f3Jr40ziOCv_Txf-BysS89c9r7uS-IYHuvwbQ-iftUs,1802
|
|
14
|
-
mm_balance/output/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
-
mm_balance/output/utils.py,sha256=zyN9igdaXGY_vKfc-3dJ13mH1T7JDke3AeB4MY_3AsA,842
|
|
16
|
-
mm_balance/output/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
mm_balance/output/formats/json_format.py,sha256=ki0AK7Azft5SF9v14_8X_QT-NtyNWqw0MlQmxtV-VH8,921
|
|
18
|
-
mm_balance/output/formats/table_format.py,sha256=aVf34CK0oVyzm5_mYWnV5BG7eFUah4BYE6DJD1-8bRk,4782
|
|
19
|
-
mm_balance-0.4.0.dist-info/METADATA,sha256=IBj1ayGa0HlsY9yLV-qL5eSdmLGeCN5k74n_xh9sf7k,254
|
|
20
|
-
mm_balance-0.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
21
|
-
mm_balance-0.4.0.dist-info/entry_points.txt,sha256=rSnP0ZW1a3ACNwTWM7T53CmOycKbzhG43m2_wseENng,50
|
|
22
|
-
mm_balance-0.4.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|