mm-balance 0.4.1__py3-none-any.whl → 0.5.1__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.
@@ -1,7 +1,8 @@
1
1
  from dataclasses import dataclass
2
2
  from decimal import Decimal
3
3
 
4
- from mm_std import AsyncTaskRunner, PrintFormat, Result
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.add_task(f"process_{network}", self._process_network(network))
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.add_task(str(idx), self._get_balance(network, task.wallet_address, task.token_address))
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
- pretty_print_toml(data.decode("utf-8"))
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
 
@@ -1,7 +1,7 @@
1
1
  import getpass
2
2
  from pathlib import Path
3
3
 
4
- from mm_std import PrintFormat, fatal
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):
@@ -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 mm_crypto_utils import ConfigValidators
9
- from mm_std import BaseConfig, PrintFormat, fatal
9
+ from mm_web3 import ConfigValidators, Web3CliConfig
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(BaseConfig):
20
+ class AssetGroup(Web3CliConfig):
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(unique=True))]
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(BaseConfig):
76
+ class AddressCollection(Web3CliConfig):
76
77
  name: str
77
- addresses: Annotated[list[str], BeforeValidator(ConfigValidators.addresses(unique=True))]
78
+ addresses: Annotated[list[str], BeforeValidator(Validators.addresses(deduplicate=True))]
78
79
 
79
80
 
80
- class Settings(BaseConfig):
81
+ class Settings(Web3CliConfig):
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(BaseConfig):
91
+ class Config(Web3CliConfig):
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/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
- print_plain("Diff: no changes")
75
+ mm_print.plain("Diff: no changes")
75
76
  return
76
77
 
77
- print_plain("\nDiff")
78
+ mm_print.plain("\nDiff")
78
79
 
79
80
  if self.network_added:
80
- print_plain(f"networks added: {self.network_added}")
81
+ mm_print.plain(f"networks added: {self.network_added}")
81
82
  if self.network_removed:
82
- print_plain(f"networks removed: {self.network_removed}")
83
+ mm_print.plain(f"networks removed: {self.network_removed}")
83
84
  if self.ticker_added:
84
- print_plain(f"tickers added: {self.ticker_added}")
85
+ mm_print.plain(f"tickers added: {self.ticker_added}")
85
86
  if self.ticker_removed:
86
- print_plain(f"tickers removed: {self.ticker_removed}")
87
+ mm_print.plain(f"tickers removed: {self.ticker_removed}")
87
88
  if self.address_added:
88
- print_plain(f"addresses added: {self.address_added}")
89
+ mm_print.plain(f"addresses added: {self.address_added}")
89
90
  if self.address_removed:
90
- print_plain(f"addresses removed: {self.address_removed}")
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
- print_table("", ["Network", "Ticker", "Address", "Old", "New", "Change"], rows)
100
+ mm_print.table("", ["Network", "Ticker", "Address", "Old", "New", "Change"], rows)
100
101
 
101
102
  def _print_json(self) -> None:
102
- print_json(data=self.model_dump(), default_serializer=str)
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
- from mm_std import print_json
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
- print_json(data)
30
+ mm_print.json(data)
@@ -1,6 +1,6 @@
1
1
  from decimal import Decimal
2
2
 
3
- from mm_std import print_table
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
- print_table("Nodes", ["network", "nodes"], rows)
17
+ mm_print.table("Nodes", ["network", "nodes"], rows)
18
18
 
19
19
 
20
20
  def print_proxy_count(config: Config) -> None:
21
- print_table("Proxies", ["count"], [[len(config.settings.proxies)]])
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
- print_table("Token Decimals", ["network", "decimals"], rows)
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
- print_table("Prices", ["coin", "usd"], rows)
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
- print_table("Errors", ["coin", "address", "error"], rows)
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
- print_table(table_name, headers, rows)
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
- print_table(group_name, table_headers, rows)
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 mm_std import http_request, random_str_choice
5
+ from mm_http import http_request
6
+ from mm_web3 import random_proxy
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=random_str_choice(config.settings.proxies))
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.unwrap_error()
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 mm_crypto_utils import Nodes, Proxies
6
5
  from mm_eth import retry as eth_retry
6
+ from mm_result import Result
7
7
  from mm_sol import retry as sol_retry
8
- from mm_std import Result
8
+ from mm_web3 import Nodes, Proxies
9
9
 
10
10
  from mm_balance.constants import (
11
11
  NETWORK_APTOS,
@@ -1,4 +1,4 @@
1
- from mm_std import fatal
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
- fatal(f"can't get decimals for token {group.ticker} / {group.token}, error={res.unwrap_error()}")
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.1
4
+ Requires-Python: >=3.13
5
+ Requires-Dist: deepdiff==8.5.0
6
+ Requires-Dist: mm-apt==0.4.2
7
+ Requires-Dist: mm-btc==0.5.3
8
+ Requires-Dist: mm-concurrency~=0.1.0
9
+ Requires-Dist: mm-eth==0.7.1
10
+ Requires-Dist: mm-sol==0.7.1
@@ -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=CFcVUeibWoqhS5XiRQxiNZAbHv_Tcn1Fw9tgCDiD1Ac,4925
6
+ mm_balance/constants.py,sha256=LhyW1EfNP5E8st-RPvD7p3QoIowFH2W14tkCf6NzveU,2468
7
+ mm_balance/diff.py,sha256=1NLzfzgOR34FTUFulWjOhUxNsMjt3W5u_7106FLBuaY,7172
8
+ mm_balance/price.py,sha256=M9OQuU_krXttRBsMx6uabzw4GuTyK08K8psOoKMqD0E,1578
9
+ mm_balance/result.py,sha256=vBz_V-ZCkEhrf-Utc7VB_3eP0cuL9pAmEkVJbOpdKIc,5173
10
+ mm_balance/rpc.py,sha256=Z-rHJdhD8ScghUchV2M6rb8jyiPfB3nChEWFXjcBQOo,6116
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.1.dist-info/METADATA,sha256=-bEyKIfgjnZTgBUhg9SvJy_qXJDtIESUR9YmM1Q5kT8,262
20
+ mm_balance-0.5.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
21
+ mm_balance-0.5.1.dist-info/entry_points.txt,sha256=rSnP0ZW1a3ACNwTWM7T53CmOycKbzhG43m2_wseENng,50
22
+ mm_balance-0.5.1.dist-info/RECORD,,
@@ -1,9 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: mm-balance
3
- Version: 0.4.1
4
- Requires-Python: >=3.12
5
- Requires-Dist: deepdiff==8.5.0
6
- Requires-Dist: mm-apt==0.3.5
7
- Requires-Dist: mm-btc==0.4.2
8
- Requires-Dist: mm-eth==0.6.2
9
- Requires-Dist: mm-sol==0.6.3
@@ -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=4l1X3NuNOBZfMV3DOvN2vk84-0vBrrvpLTPKZUh3iI4,2847
5
- mm_balance/config.py,sha256=yVB-46HR7saXSsGKbHoxsu6cRMUVTSiuoEPSpSSiOv0,4886
6
- mm_balance/constants.py,sha256=LhyW1EfNP5E8st-RPvD7p3QoIowFH2W14tkCf6NzveU,2468
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.1.dist-info/METADATA,sha256=Abo_biJsHKB2lloNqln5zQi4uXim2u5Yk8OpIegH9bk,225
20
- mm_balance-0.4.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
21
- mm_balance-0.4.1.dist-info/entry_points.txt,sha256=rSnP0ZW1a3ACNwTWM7T53CmOycKbzhG43m2_wseENng,50
22
- mm_balance-0.4.1.dist-info/RECORD,,