eth-portfolio-temp 0.2.11__cp311-cp311-win_amd64.whl → 0.3.0__cp311-cp311-win_amd64.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.
Binary file
Binary file
@@ -97,6 +97,7 @@ shitcoins: Final = {
97
97
  "0x0e1CD6d2715432e4DBedFE969b0Eb2867FF61d5b",
98
98
  "0x9aE357521153FB07bE6F5792CE7a49752638fbb7",
99
99
  # Generally looks like shit
100
+ "0x5e43e50A3cB43Fb71eD2500bC847E8d25b8335f9",
100
101
  "0xE8ED1fca5af1c7dd46A3D5bbDFf7e99749D9e0aa",
101
102
  "0x00d0F0250364C431376cC64AADd3aa13c6A8998D",
102
103
  "0x256099A072ea5fd35eC134758440413095967109",
eth_portfolio/buckets.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Any, Final, Optional, Set
2
+ from typing import Any, Final, Optional, Set, Dict
3
3
 
4
4
  from a_sync import igather
5
5
  from eth_typing import ChecksumAddress
@@ -23,7 +23,9 @@ SORT_AS_STABLES: Final = STABLECOINS.keys() | STABLEISH_COINS[CHAINID]
23
23
  OTHER_LONG_TERM_ASSETS: Final[Set[ChecksumAddress]] = {}.get(CHAINID, set()) # type: ignore [call-overload]
24
24
 
25
25
 
26
- async def get_token_bucket(token: AnyAddressType) -> str:
26
+ async def get_token_bucket(
27
+ token: AnyAddressType, custom_buckets: Optional[Dict[str, str]] = None
28
+ ) -> str:
27
29
  """
28
30
  Categorize a token into a specific bucket based on its type.
29
31
 
@@ -35,6 +37,10 @@ async def get_token_bucket(token: AnyAddressType) -> str:
35
37
 
36
38
  Args:
37
39
  token: The address of the token to categorize.
40
+ custom_buckets: Optional mapping of token_address (lowercase) to bucket name.
41
+ If provided, after unwrapping the token, the function will check if the
42
+ unwrapped token address (lowercased) is present in this mapping and, if so,
43
+ return the mapped bucket name instead of using the default categorization logic.
38
44
 
39
45
  Returns:
40
46
  A string representing the bucket category of the token.
@@ -54,6 +60,12 @@ async def get_token_bucket(token: AnyAddressType) -> str:
54
60
  >>> await get_token_bucket("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE")
55
61
  'ETH'
56
62
 
63
+ Use a custom mapping:
64
+
65
+ >>> custom_buckets = {"0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": "My Stablecoin Bucket"}
66
+ >>> await get_token_bucket("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", custom_buckets=custom_buckets)
67
+ 'My Stablecoin Bucket'
68
+
57
69
  See Also:
58
70
  - :func:`_unwrap_token`
59
71
  - :func:`_is_stable`
@@ -64,6 +76,12 @@ async def get_token_bucket(token: AnyAddressType) -> str:
64
76
  except ContractNotVerified as e:
65
77
  return "Other short term assets"
66
78
 
79
+ # Check custom mapping AFTER unwrapping
80
+ if custom_buckets:
81
+ custom_bucket = custom_buckets.get(str(token_address).lower())
82
+ if custom_bucket is not None:
83
+ return custom_bucket
84
+
67
85
  if _is_stable(token_address):
68
86
  return "Cash & cash equivalents"
69
87
  if token_address in ETH_LIKE:
Binary file
Binary file
@@ -2,7 +2,7 @@ import asyncio
2
2
  from datetime import datetime, timezone
3
3
  from logging import getLogger
4
4
  from math import floor
5
- from typing import Awaitable, Callable, Final, Iterator, List, Optional, Tuple
5
+ from typing import Awaitable, Callable, Final, Iterator, List, Optional, Tuple, Dict
6
6
 
7
7
  import a_sync
8
8
  import eth_retry
@@ -60,16 +60,31 @@ class ExportablePortfolio(Portfolio):
60
60
  label: str = _DEFAULT_LABEL,
61
61
  concurrency: int = 40,
62
62
  load_prices: bool = True,
63
- get_bucket: Callable[[ChecksumAddress], Awaitable[str]] = get_token_bucket,
63
+ get_bucket: Callable[[ChecksumAddress], Awaitable[str]] = None,
64
64
  num_workers_transactions: int = 1000,
65
65
  asynchronous: bool = False,
66
+ custom_buckets: Optional[Dict[str, str]] = None,
66
67
  ):
67
68
  super().__init__(
68
69
  addresses, start_block, label, load_prices, num_workers_transactions, asynchronous
69
70
  )
70
- self.get_bucket = get_bucket
71
71
  self._semaphore = a_sync.Semaphore(concurrency)
72
72
 
73
+ # Lowercase all keys in custom_buckets if provided
74
+ self.custom_buckets = (
75
+ {k.lower(): v for k, v in custom_buckets.items()} if custom_buckets else None
76
+ )
77
+
78
+ # If get_bucket is not provided, use get_token_bucket with the lowercased mapping
79
+ if get_bucket is None:
80
+ self.get_bucket = lambda token: get_token_bucket(token, self.custom_buckets)
81
+ elif custom_buckets:
82
+ raise RuntimeError(
83
+ "You cannot pass in a custom get_bucket function AND a custom_buckets mapping, choose one."
84
+ )
85
+ else:
86
+ self.get_bucket = get_bucket
87
+
73
88
  @cached_property
74
89
  def _data_queries(self) -> Tuple[str, str]:
75
90
  label = self.label.lower().replace(" ", "_")
@@ -1,5 +1,6 @@
1
1
  from functools import lru_cache
2
2
  from subprocess import CalledProcessError, check_output
3
+ from typing import List
3
4
 
4
5
 
5
6
  def check_docker() -> None:
@@ -9,48 +10,58 @@ def check_docker() -> None:
9
10
  Raises:
10
11
  RuntimeError: If docker is not installed.
11
12
  """
13
+ print(" 🔍 checking your computer for docker")
12
14
  try:
13
15
  check_output(["docker", "--version"])
14
- print("docker found!")
15
16
  except (CalledProcessError, FileNotFoundError):
16
- print("checking your computer for docker")
17
17
  raise RuntimeError(
18
18
  "Docker is not installed. You must install Docker before using dao-treasury."
19
19
  ) from None
20
+ else:
21
+ print(" ✔️ eth-portfolio found docker!")
20
22
 
21
23
 
22
- def check_docker_compose() -> None:
24
+ def check_docker_compose() -> List[str]:
23
25
  """
24
- Check that docker-compose is installed on the user's system.
26
+ Check that either `docker-compose` or `docker compose` is installed on the user's system.
27
+
28
+ Returns:
29
+ A valid compose command.
25
30
 
26
31
  Raises:
27
32
  RuntimeError: If docker-compose is not installed.
28
33
  """
29
- try:
30
- check_output(["docker-compose", "--version"])
31
- print("docker-compose found!")
32
- except (CalledProcessError, FileNotFoundError):
33
- print("checking your computer for docker-compose")
34
+ for cmd in ["docker-compose", "docker compose"]:
35
+ print(f" 🔍 checking your computer for {cmd}")
36
+
34
37
  try:
35
- check_output(["docker", "compose", "--version"])
36
- print("docker compose found!")
38
+ check_output([*cmd.split(" "), "--version"])
37
39
  except (CalledProcessError, FileNotFoundError):
38
- print("docker-compose not found, checking your computer for docker compose")
39
- raise RuntimeError(
40
- "Docker Compose is not installed. You must install Docker Compose before using dao-treasury."
41
- ) from None
40
+ print(f" ❌ {cmd} not found")
41
+ continue
42
+ else:
43
+ print(f" ✔️ eth-portfolio found {cmd}!")
44
+ return cmd.split(" ")
45
+
46
+ raise RuntimeError(
47
+ "Docker Compose is not installed. You must install Docker Compose before using dao-treasury."
48
+ ) from None
42
49
 
43
50
 
44
51
  @lru_cache(maxsize=None)
45
- def check_system() -> None:
52
+ def check_system() -> List[str]:
46
53
  """
47
54
  Check that docker and docker-compose is installed on the user's system.
48
55
 
56
+ Returns:
57
+ A valid compose command.
58
+
49
59
  Raises:
50
60
  RuntimeError: If docker-compose is not installed.
51
61
  """
62
+ print("eth-portfolio is checking for the required docker dependencies...")
52
63
  check_docker()
53
- check_docker_compose()
64
+ return check_docker_compose()
54
65
 
55
66
 
56
67
  __all__ = ["check_docker", "check_docker_compose", "check_system"]
@@ -3,7 +3,7 @@ networks:
3
3
 
4
4
  services:
5
5
  grafana:
6
- image: grafana/grafana:12.2.0
6
+ image: grafana/grafana:12.2.1
7
7
  ports:
8
8
  - 127.0.0.1:${GRAFANA_PORT:-3000}:3000
9
9
  environment:
@@ -47,7 +47,7 @@ services:
47
47
  restart: always
48
48
 
49
49
  victoria-metrics:
50
- image: victoriametrics/victoria-metrics:v1.127.0
50
+ image: victoriametrics/victoria-metrics:v1.129.1
51
51
  volumes:
52
52
  - ~/.eth-portfolio/data/victoria/:/victoria-metrics-data
53
53
  command:
@@ -3,7 +3,7 @@ from functools import wraps
3
3
  from importlib import resources
4
4
  from os import path
5
5
  from subprocess import CalledProcessError, check_output
6
- from typing import Callable, Final, Iterable, List, Tuple, TypeVar
6
+ from typing import Callable, Final, Iterable, List, Literal, Tuple, TypeVar
7
7
 
8
8
  from typing_extensions import ParamSpec
9
9
 
@@ -12,33 +12,33 @@ from eth_portfolio_scripts.docker.check import check_system
12
12
 
13
13
  logger: Final = logging.getLogger(__name__)
14
14
 
15
- compose_file: Final = str(
15
+ COMPOSE_FILE: Final = str(
16
16
  resources.files("eth_portfolio_scripts").joinpath("docker/docker-compose.yaml")
17
17
  )
18
18
 
19
19
 
20
20
  def up(*services: str) -> None:
21
+ """Build and start the specified docker-compose services."""
21
22
  build(*services)
22
- print("starting the infra containers...")
23
+ _print_notice("starting", services)
23
24
  _exec_command(["up", "-d", *services])
24
25
 
25
26
 
26
27
  def down() -> None:
28
+ """Stop all of eth-portfolio's docker-compose services."""
27
29
  _exec_command(["down"])
28
30
 
29
31
 
30
32
  def build(*services: str) -> None:
31
- print("building the grafana containers")
33
+ """Build the specified docker-compose services."""
34
+ _print_notice("building", services)
32
35
  _exec_command(["build", *services])
33
36
 
34
37
 
35
- def stop(container_name: str) -> None:
36
- """
37
- Stop the specified container if it is running.
38
- Defaults to stopping the 'renderer' container.
39
- """
40
- print(f"stopping the {container_name} container...")
41
- _exec_command(["stop", container_name])
38
+ def stop(*services: str) -> None:
39
+ """Stop the specified docker-compose services, if running."""
40
+ _print_notice("stopping", services)
41
+ _exec_command(["stop", *services])
42
42
 
43
43
 
44
44
  _P = ParamSpec("_P")
@@ -67,12 +67,32 @@ def ensure_containers(fn: Callable[_P, _T]) -> Callable[_P, _T]:
67
67
  return compose_wrap
68
68
 
69
69
 
70
- def _exec_command(command: List[str], *, compose_options: Tuple[str, ...] = ()) -> None:
71
- check_system()
70
+ def _print_notice(
71
+ doing: Literal["building", "starting", "stopping"],
72
+ services: Tuple[str, ...],
73
+ ) -> None:
74
+ if len(services) == 0:
75
+ print(f"{doing} the backend containers")
76
+ elif len(services) == 1:
77
+ container = services[0]
78
+ print(f"{doing} the {container} container")
79
+ elif len(services) == 2:
80
+ first, second = services
81
+ print(f"{doing} the {first} and {second} containers")
82
+ else:
83
+ *all_but_last, last = services
84
+ print(f"{doing} the {', '.join(all_but_last)}, and {last} containers")
85
+
86
+
87
+ def _exec_command(
88
+ command: List[str],
89
+ *,
90
+ compose_file: str = COMPOSE_FILE,
91
+ compose_options: Tuple[str, ...] = (),
92
+ ) -> None:
93
+ compose = check_system()
94
+ full_command = [*compose, *compose_options, "-f", compose_file, *command]
72
95
  try:
73
- check_output(["docker", "compose", *compose_options, "-f", compose_file, *command])
96
+ check_output(full_command)
74
97
  except (CalledProcessError, FileNotFoundError) as e:
75
- try:
76
- check_output(["docker-compose", *compose_options, "-f", compose_file, *command])
77
- except (CalledProcessError, FileNotFoundError) as _e:
78
- raise RuntimeError(f"Error occurred while running {' '.join(command)}: {_e}") from _e
98
+ raise RuntimeError(f"Error occurred while running `{' '.join(full_command)}`: {e}") from e
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eth_portfolio_temp
3
- Version: 0.2.11
3
+ Version: 0.3.0
4
4
  Summary: eth-portfolio makes it easy to analyze your portfolio.
5
5
  Home-page: https://github.com/BobTheBuidler/eth-portfolio
6
6
  Author: BobTheBuidler
@@ -12,6 +12,7 @@ Requires-Dist: eth-brownie<1.23,>=1.22.0.dev0
12
12
  Requires-Dist: eth_retry<1,>=0.3.4
13
13
  Requires-Dist: evmspec>=0.4.1
14
14
  Requires-Dist: ez-a-sync>=0.32.27
15
+ Requires-Dist: faster-async-lru==2.0.5
15
16
  Requires-Dist: faster-eth-utils
16
17
  Requires-Dist: numpy<3
17
18
  Requires-Dist: pandas<3,>=1.4.3
@@ -1,22 +1,22 @@
1
- eth_portfolio__mypyc.cp311-win_amd64.pyd,sha256=S54D-Q4g-v8gpMi1-rY8eMyQhl52x0i4tKxvYl8vUNc,276480
1
+ eth_portfolio__mypyc.cp311-win_amd64.pyd,sha256=hBTtMuhS48H9dttfge54yxRqZvV0oWWzPcLhBSQkLZA,278528
2
2
  eth_portfolio/__init__.py,sha256=5GmHYzhUX2gOC4MScgXnqS8x2MawbpWOuWPmqlvCotA,525
3
- eth_portfolio/_argspec.cp311-win_amd64.pyd,sha256=5tBRX6-5bD1nBK1C0ba8ssxkV1wkOk0UGvX9Zt-5jVY,10752
3
+ eth_portfolio/_argspec.cp311-win_amd64.pyd,sha256=PBBXKTnbnsixcfcIWgepq08nSbTnhuUHC8Wgvcb49vk,10752
4
4
  eth_portfolio/_argspec.py,sha256=au8ycJ56-7UzbQVzYUOoMX9sToH0QNi2tS1O820xB3A,1637
5
5
  eth_portfolio/_cache.py,sha256=OntwbiDOrBV5JzHHDzJlxcEVrmKK5GG0uXeLeoDDbpA,4926
6
- eth_portfolio/_config.cp311-win_amd64.pyd,sha256=o2kIQByw615GVY6X-jHjyKL6vWnm9vJwCLgD7SN2qyc,10752
6
+ eth_portfolio/_config.cp311-win_amd64.pyd,sha256=Jr203ZRKxudeYhpcL169z9zqJ9DLK_XQepat5HDHXvo,10752
7
7
  eth_portfolio/_config.py,sha256=BSOvFS4D0oqgVTtBbtW2g2kpL8Mk6xiP0PipfXs_91A,102
8
8
  eth_portfolio/_decimal.py,sha256=DwLUg8pzeTIREG2sHgRK48hoWmjelWNvpEKj10Ra7to,5002
9
9
  eth_portfolio/_decorators.py,sha256=AvB-q69MvaFe0Ykh1os6hSewcUujURQ9onqobMaONOM,2899
10
10
  eth_portfolio/_exceptions.py,sha256=xb5VmCtBtXy9WXu_1ofoG4j9BJsMQXMVydCJNUulrNY,2500
11
- eth_portfolio/_shitcoins.cp311-win_amd64.pyd,sha256=fB173JoKgUbRuTzfBmNx0LIBJIQTh7hVxt6uzlFAkfg,10752
12
- eth_portfolio/_shitcoins.py,sha256=OZLQWpuNegNz_GXPod1yMZMLiryKY0ZL_fpq1HppnGM,17296
13
- eth_portfolio/_stableish.cp311-win_amd64.pyd,sha256=1hZfspeSbwc2kE4oSfQuxtO8L9-WoydIq530t1P8SLE,10752
11
+ eth_portfolio/_shitcoins.cp311-win_amd64.pyd,sha256=3ccIcTiXXPwE2PrzJE7j6o1BnRGKmZrQH8Ocn74qqG8,10752
12
+ eth_portfolio/_shitcoins.py,sha256=9i7tcwZN620oQkDBa_gSE4jqZn0TK52AyqZh0MIP8m4,17351
13
+ eth_portfolio/_stableish.cp311-win_amd64.pyd,sha256=svAo4MUAYlYMFxIXSIn9laFpCE6CiC2MOgYijCPcm3U,10752
14
14
  eth_portfolio/_stableish.py,sha256=8pdlYe2YcZ8rTzdCzg-ihRQLPtSFXBNDjtnvuTgPRcQ,2063
15
15
  eth_portfolio/_submodules.py,sha256=zne-2YyVFoKHwkLuHx8cdz5lpcwwSDw1edJ9v8G4c1A,2263
16
16
  eth_portfolio/_utils.py,sha256=iGck5SKUwpfnuZvLnKDR1A00obZNKx622Y9GY_TYiZA,7886
17
17
  eth_portfolio/address.py,sha256=RrFIWSx6jSITwh16Hqs6W6S9fz1KEaebQEk1vqL3HwI,14536
18
- eth_portfolio/buckets.py,sha256=c5_RLfMyJbnK_PBx5mmdL3YlIX67dD6LqnBxiAr52N0,6896
19
- eth_portfolio/constants.cp311-win_amd64.pyd,sha256=ZkMjckgql-xQIMVRrzUl-bAJ82aqiQVXb8R8w1Bk0NE,10752
18
+ eth_portfolio/buckets.py,sha256=n8FdgC_mf4DZPFkEu3v3LOamN1Kani8CIrhaLyg_6jY,7811
19
+ eth_portfolio/constants.cp311-win_amd64.pyd,sha256=o2q8-iayHB8hj7xHiekgCUv-5aQMK18RzaZxPYf7njI,10752
20
20
  eth_portfolio/constants.py,sha256=rUXWFaCGrrF_qzIdDvVzakQJsLnrGtFNn2EgRbZh8fQ,3741
21
21
  eth_portfolio/portfolio.py,sha256=FSJ1_FG120dN5vWSPyhbHfyuFHdmFqTHJ5_Ci-4Rts4,24909
22
22
  eth_portfolio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -28,13 +28,13 @@ eth_portfolio/_ledgers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
28
28
  eth_portfolio/_ledgers/address.py,sha256=wght92UXf6UIO9GNRzdMy3H43Em7kUk9ArtBsRF-xjw,33830
29
29
  eth_portfolio/_ledgers/portfolio.py,sha256=rAr5S1tksgLPUOK1J1FbIWgvTQNzTqrRp8oukiP2BTo,13427
30
30
  eth_portfolio/_loaders/__init__.py,sha256=YrBeRuA48cN2Bg2R2nXiNt1CsUIG_7N6ENIpY6aISPo,1735
31
- eth_portfolio/_loaders/_nonce.cp311-win_amd64.pyd,sha256=Hq5qT9DGOn5v7IP1Vq_EdUac1T_oae7sAQEQ7OWeCTE,10752
31
+ eth_portfolio/_loaders/_nonce.cp311-win_amd64.pyd,sha256=Hf0vVu5lX-PFoEyld-eh49Hbd91ZGs5o1BzUWspxOBw,10752
32
32
  eth_portfolio/_loaders/_nonce.py,sha256=bA-5fZG8ALuADgQGrnoxt6p6j7QEwI6vIGnZRF1Zx7M,6481
33
- eth_portfolio/_loaders/balances.cp311-win_amd64.pyd,sha256=IQattELFgAcphyuhwep-NNUbKS8hALvSYAwnek2_Hmg,10752
33
+ eth_portfolio/_loaders/balances.cp311-win_amd64.pyd,sha256=xFG1h6ngL6ZTmHpaYw6L4pmDxXeHiEGFYkmWkVuVgWQ,10752
34
34
  eth_portfolio/_loaders/balances.py,sha256=_v-x1M3lzDHPt8svHmCcpxZKw0BaGHfZimhkwgphY8A,3226
35
35
  eth_portfolio/_loaders/token_transfer.py,sha256=itaWVDyotG0EYPb4o94UOpxYvTdE6YIuUR2pzpXAnwI,8748
36
36
  eth_portfolio/_loaders/transaction.py,sha256=oOG3cFdLAa10k2hpN17GO7Wtq-rpUJ1oo7hLAKDjbDc,9393
37
- eth_portfolio/_loaders/utils.cp311-win_amd64.pyd,sha256=i-BtkOtxnNhAR0hlQbEJMr6Ivc68uu1rTjhAJ2JyGas,10752
37
+ eth_portfolio/_loaders/utils.cp311-win_amd64.pyd,sha256=pBzeBuc49Cv994hNuVZeq0yCUum5IQLRmEMhwgwbVN0,10752
38
38
  eth_portfolio/_loaders/utils.py,sha256=gJvIikinjCPj-elQVep55VTya9slSARApx-FJKYwnkE,2333
39
39
  eth_portfolio/_ydb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
40
  eth_portfolio/_ydb/token_transfers.py,sha256=HUTeWShcQD4IzocTHmBOreml0jbVttLcaed1fNiJ2qg,5297
@@ -58,26 +58,26 @@ eth_portfolio/typing/balance/single.py,sha256=NmtWXqCWMIkaoyvfL67Rh0wWurLf55fVaD
58
58
  eth_portfolio_scripts/__init__.py,sha256=DIBnQmjmhmNL1lO9Lq4QptrZmC7u6_N3p9zRjcZ9vbY,281
59
59
  eth_portfolio_scripts/_args.py,sha256=M33vPkja62XEJeCZAqacNSBCqbzse07wepwyBOtkvVo,682
60
60
  eth_portfolio_scripts/_logging.py,sha256=EgW8ozQZLAgt_cUgqe5BYZLMVQwB6X-0gq0T-BvqlTY,369
61
- eth_portfolio_scripts/_portfolio.py,sha256=XP6fUfZfv2hBdW6PCBdpUyT3TRAU56u2QKWwhmHBTAE,7333
61
+ eth_portfolio_scripts/_portfolio.py,sha256=PJiGlQyoyUyqUh0HCL7HkV09OkEZXmybVFiGkMLsmXU,8003
62
62
  eth_portfolio_scripts/_utils.py,sha256=lj2B79G8YX21ATNp_v-onsU_kNFZF3unBclCVp3AIn8,3163
63
- eth_portfolio_scripts/balances.cp311-win_amd64.pyd,sha256=kWsHQJuBLZU6vXfdhPEeT_4qrq0O0gN_i7ocPrGB72k,10752
63
+ eth_portfolio_scripts/balances.cp311-win_amd64.pyd,sha256=a_AB-MnUb99GSZG6JgUlQCJuC3wEYSyrPoh7F_vr3lE,10752
64
64
  eth_portfolio_scripts/balances.py,sha256=Fr8NGCt5yhvu7LnLH27oOVKcL2XwowmAVezXUOIEzd0,1640
65
65
  eth_portfolio_scripts/main.py,sha256=VfwWEVOu4oxp5M-rQLGo-XlDKlG_Q7Y4cLiXMUSXeZg,3804
66
66
  eth_portfolio_scripts/py.typed,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
67
- eth_portfolio_scripts/docker/__init__.cp311-win_amd64.pyd,sha256=CzeDXSYoDeiX-TzH8DqKmoi25tSgXsBYtyoVXJSE_oc,10752
67
+ eth_portfolio_scripts/docker/__init__.cp311-win_amd64.pyd,sha256=N5MSH_gNeLwHqgUs2VmSG6n7ibWm__d2yWQHLiLhFs4,10752
68
68
  eth_portfolio_scripts/docker/__init__.py,sha256=R27uZPLUEK2--fb9IrxrDUk6R5_IVFJSv7s_ia7p5Xk,409
69
- eth_portfolio_scripts/docker/check.cp311-win_amd64.pyd,sha256=-PLOA-feIqOLPjz6rW3Mo0ouflVYr6s_RKB2-hrCOIg,10752
70
- eth_portfolio_scripts/docker/check.py,sha256=JFxUxGRSz20EgjKqCLBkCqR4N1ihzO_3ykU3jPzp_UU,1801
71
- eth_portfolio_scripts/docker/docker-compose.yaml,sha256=lUOGWbZZIapyk8aafIz0Rtvu-ir2hN8jZvfGEsnqQ7I,1870
72
- eth_portfolio_scripts/docker/docker_compose.cp311-win_amd64.pyd,sha256=Pf_75rF4Jj1PLRoLCiq9wK33ia_5pdUmkmRInYZqZcM,10752
73
- eth_portfolio_scripts/docker/docker_compose.py,sha256=tewgCWZP6g9sVFHbQnGC1au-bTnvuvXMZgTKKgpmeOc,2304
69
+ eth_portfolio_scripts/docker/check.cp311-win_amd64.pyd,sha256=bOOTBDpYS8xkAESvEw_3vadE5FXK3dpkytgxnnW_r1s,10752
70
+ eth_portfolio_scripts/docker/check.py,sha256=mf853kj0_M2iI3d2KuWuwsXtSieP9qWhvTJdrqX8iU8,1997
71
+ eth_portfolio_scripts/docker/docker-compose.yaml,sha256=lCLNTFUYGty_ogZPrhiQMh-lHiw25hrhWXr7T7jyss4,1870
72
+ eth_portfolio_scripts/docker/docker_compose.cp311-win_amd64.pyd,sha256=XwK0dLTh5g7-A62QnBu96uozklounxKiTjeU0FtfzKs,10752
73
+ eth_portfolio_scripts/docker/docker_compose.py,sha256=w1Z4XfSCC1vVLnss74XbkHUBVb0P2-zOIkMyidkZh38,2903
74
74
  eth_portfolio_scripts/docker/.grafana/dashboards/dashboards.yaml,sha256=wktTI-OAdF_khhbciZFo4Gt2V9bUjbe7GLqwdzTKf0U,212
75
75
  eth_portfolio_scripts/docker/.grafana/dashboards/Portfolio/Balances.json,sha256=XGMV8e4tDak53e9bmymwAB4uqZmAIcU5JlRT3OiwTeU,70750
76
76
  eth_portfolio_scripts/docker/.grafana/datasources/datasources.yml,sha256=8PPH_QDhfbRRh3IidskW46rifJejloa1a9I1KCw2FTk,199
77
77
  eth_portfolio_scripts/victoria/__init__.py,sha256=R0VvKiAC0e57zZNihcCptVkFO5CBHIbp2trFYuyY01M,2038
78
78
  eth_portfolio_scripts/victoria/types.py,sha256=KNq8aIiNXeiDnCKL7xycmouo0YeKI-sbQkIcTymcSYk,745
79
- eth_portfolio_temp-0.2.11.dist-info/METADATA,sha256=zTwDhiJAiYCjQ9ecAtKhE2Dipf9appPYLqApov5vTRI,800
80
- eth_portfolio_temp-0.2.11.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
81
- eth_portfolio_temp-0.2.11.dist-info/entry_points.txt,sha256=yqoC6X3LU1NA_-oJ6mloEYEPNmS-0hPS9OtEwgIeDGU,66
82
- eth_portfolio_temp-0.2.11.dist-info/top_level.txt,sha256=4MlbY-Yj8oGBGL8piXiO4SOpk2gZFF9ZXVTObTZOzqM,57
83
- eth_portfolio_temp-0.2.11.dist-info/RECORD,,
79
+ eth_portfolio_temp-0.3.0.dist-info/METADATA,sha256=L4dDUoA00AY00y10JBW00rFwvWeiFMCepzvQmqvaurM,839
80
+ eth_portfolio_temp-0.3.0.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
81
+ eth_portfolio_temp-0.3.0.dist-info/entry_points.txt,sha256=yqoC6X3LU1NA_-oJ6mloEYEPNmS-0hPS9OtEwgIeDGU,66
82
+ eth_portfolio_temp-0.3.0.dist-info/top_level.txt,sha256=4MlbY-Yj8oGBGL8piXiO4SOpk2gZFF9ZXVTObTZOzqM,57
83
+ eth_portfolio_temp-0.3.0.dist-info/RECORD,,