eth-portfolio-temp 0.2.11__cp310-cp310-macosx_11_0_arm64.whl → 0.3.1__cp310-cp310-macosx_11_0_arm64.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.
Files changed (25) hide show
  1. eth_portfolio/_argspec.cpython-310-darwin.so +0 -0
  2. eth_portfolio/_config.cpython-310-darwin.so +0 -0
  3. eth_portfolio/_loaders/_nonce.cpython-310-darwin.so +0 -0
  4. eth_portfolio/_loaders/balances.cpython-310-darwin.so +0 -0
  5. eth_portfolio/_loaders/utils.cpython-310-darwin.so +0 -0
  6. eth_portfolio/_shitcoins.cpython-310-darwin.so +0 -0
  7. eth_portfolio/_shitcoins.py +8 -0
  8. eth_portfolio/_stableish.cpython-310-darwin.so +0 -0
  9. eth_portfolio/buckets.py +20 -2
  10. eth_portfolio/constants.cpython-310-darwin.so +0 -0
  11. eth_portfolio/constants.py +5 -0
  12. eth_portfolio__mypyc.cpython-310-darwin.so +0 -0
  13. eth_portfolio_scripts/_portfolio.py +18 -3
  14. eth_portfolio_scripts/balances.cpython-310-darwin.so +0 -0
  15. eth_portfolio_scripts/docker/__init__.cpython-310-darwin.so +0 -0
  16. eth_portfolio_scripts/docker/check.cpython-310-darwin.so +0 -0
  17. eth_portfolio_scripts/docker/check.py +28 -17
  18. eth_portfolio_scripts/docker/docker-compose.yaml +2 -2
  19. eth_portfolio_scripts/docker/docker_compose.cpython-310-darwin.so +0 -0
  20. eth_portfolio_scripts/docker/docker_compose.py +38 -18
  21. {eth_portfolio_temp-0.2.11.dist-info → eth_portfolio_temp-0.3.1.dist-info}/METADATA +2 -1
  22. {eth_portfolio_temp-0.2.11.dist-info → eth_portfolio_temp-0.3.1.dist-info}/RECORD +25 -25
  23. {eth_portfolio_temp-0.2.11.dist-info → eth_portfolio_temp-0.3.1.dist-info}/WHEEL +0 -0
  24. {eth_portfolio_temp-0.2.11.dist-info → eth_portfolio_temp-0.3.1.dist-info}/entry_points.txt +0 -0
  25. {eth_portfolio_temp-0.2.11.dist-info → eth_portfolio_temp-0.3.1.dist-info}/top_level.txt +0 -0
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",
@@ -185,6 +186,13 @@ shitcoins: Final = {
185
186
  "0xc6a76f7ad66d0e6Ccd1AaAd6e7568c9bd55Dce62",
186
187
  "0xB4d4334eB5a251cbE5cC7Afb0Ba26119aCE62281",
187
188
  "0xE5c5AE39B98eFd9D3c9E0F2a5457D98fFA4b0b46",
189
+ "0x912033c6644008DD8438A5C07738a513f38Ded5D",
190
+ "0xffE49E3BB3725d499223611e571215029877A6Cf",
191
+ "0x7d593cC8E0b8ceBF645342AaFf5631e689FB5249",
192
+ "0x3E67A4D218061263202c1480ddB479080C59dd0E",
193
+ "0xac4607A2D8a2bfA721955a23D3F290B0E176612E",
194
+ "0x27ed436e67515C1dD33633537EEBd59207c51806",
195
+ "0x92b48cf18a947c66557CE4aC829D6DB012D11Aa5",
188
196
  # Generally looks like shit (symbol ERC20)
189
197
  "0x2adA6e459089292264133d8D7c85f6907423E444",
190
198
  "0x356F680eE21c8CeFfA460c38D20A137F3D07D9af",
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:
@@ -41,6 +41,10 @@ ETH_LIKE: Final = {
41
41
  "0xBe9895146f7AF43049ca1c1AE358B0541Ea49704", # cbETH
42
42
  "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", # weETH
43
43
  "0x7C07F7aBe10CE8e33DC6C5aD68FE033085256A84", # icETH
44
+ "0xAa6E8127831c9DE45ae56bB1b0d4D4Da6e5665BD", # ETH2x-FLI
45
+ "0xE72B141DF173b999AE7c1aDcbF60Cc9833Ce56a8", # ETH+
46
+ "0x3d1E5Cf16077F349e999d6b21A4f646e83Cd90c5", # dETH
47
+ "0x005F893EcD7bF9667195642f7649DA8163e23658", # dgnETH
44
48
  },
45
49
  }.get(chain.id, set())
46
50
 
@@ -78,5 +82,6 @@ INTL_STABLECOINS: Final = {
78
82
  "0x1CC481cE2BD2EC7Bf67d1Be64d4878b16078F309", # ibCHF
79
83
  "0x269895a3dF4D73b077Fc823dD6dA1B95f72Aaf9B", # sKRW
80
84
  "0x95dFDC8161832e4fF7816aC4B6367CE201538253", # ibKRW
85
+ "0x1a7e4e63778B4f12a199C062f3eFdD288afCBce8", # EURA
81
86
  },
82
87
  }.get(chain.id, set())
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.1
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,39 +1,34 @@
1
- eth_portfolio__mypyc.cpython-310-darwin.so,sha256=E_anZe0Vmnv5CdqCM3TYGflucSBtA2wjE8Fcx3JkrT8,693032
2
- eth_portfolio_temp-0.2.11.dist-info/RECORD,,
3
- eth_portfolio_temp-0.2.11.dist-info/WHEEL,sha256=11kMdE9gzbsaQG30fRcsAYxBLEVRsqJo098Y5iL60Xo,136
4
- eth_portfolio_temp-0.2.11.dist-info/entry_points.txt,sha256=yqoC6X3LU1NA_-oJ6mloEYEPNmS-0hPS9OtEwgIeDGU,66
5
- eth_portfolio_temp-0.2.11.dist-info/top_level.txt,sha256=4MlbY-Yj8oGBGL8piXiO4SOpk2gZFF9ZXVTObTZOzqM,57
6
- eth_portfolio_temp-0.2.11.dist-info/METADATA,sha256=5yX676JOgUY-l57B5Yj_4z6CjuxzoSFrbsR_IJ177wY,775
1
+ eth_portfolio__mypyc.cpython-310-darwin.so,sha256=PChEqRMl1MO4ikUnxMlDshCb5KZPSeFzU9DfsPHfQrw,694856
7
2
  eth_portfolio/address.py,sha256=LvBh4Vp2DBC3gQ0WD-TZ6jfe9s6FZbET1krYG9_KMAA,14139
8
3
  eth_portfolio/_cache.py,sha256=IOeMXvMgOlEEk01yHP0RARRZXyonuKXUNZbNLFM_KBU,4805
9
- eth_portfolio/_stableish.cpython-310-darwin.so,sha256=LHz-7Jl9JWLKut7o6RF18wx301AMnf4eU0pFfBv3pl0,50656
4
+ eth_portfolio/_stableish.cpython-310-darwin.so,sha256=4UOgMvRG2YEiVCYqibHqMQuzrVzCTA2o6OA0Lq2hKQQ,50656
10
5
  eth_portfolio/_argspec.py,sha256=VzUZkbDkmOSgNUZBGbGblqtxBfDcmBAB89dY2OX0j-U,1595
11
6
  eth_portfolio/_submodules.py,sha256=J8ht9bAAvblUXqwOGN7UIOXUPxrTiq7m1RWiB0-ObaE,2190
12
- eth_portfolio/constants.py,sha256=LS9H2P_Qfcreb6z6NknErxvq6OAtIHbHykXy0spol9E,3659
7
+ eth_portfolio/constants.py,sha256=tR2QKapbutcGYjXdxwB23FICQlwyDPvgua-dhltYyDc,3976
13
8
  eth_portfolio/__init__.py,sha256=0sO4cSJaLYwJfnfVOJRFw7p5_Lzhsr95YuJ1aNQM83A,500
14
- eth_portfolio/_argspec.cpython-310-darwin.so,sha256=3sbwJ064mcjgrK5v5c-kzydWePM0kyhHUHi0VrXe6iA,50640
9
+ eth_portfolio/_argspec.cpython-310-darwin.so,sha256=kKZwatKS6lUupN6q-UaU_L3MNZfxoDMPuhFL-JEnoDM,50640
15
10
  eth_portfolio/_decimal.py,sha256=tYS0miNoQYZguy0yd1bb3bf49l9F3YICyN8ov6r7VBs,4846
16
- eth_portfolio/_config.cpython-310-darwin.so,sha256=F4OtYmadRd3eozC833oY5T3woihF32v30Vd9Yo_JIW4,50640
17
- eth_portfolio/buckets.py,sha256=30Tv5Tq-IL6NsACKbxp7hge84Q-upWsiWGdDTKkXeqE,6702
18
- eth_portfolio/_shitcoins.cpython-310-darwin.so,sha256=Qx--L02CqjnNkT8vZrVaK3fP6R1MsYP8RR1BwyIMPEo,50656
11
+ eth_portfolio/_config.cpython-310-darwin.so,sha256=0q7ZITV-HIXENJRtG9tIt9a32UmvKNPvHVVfeDvVkV4,50640
12
+ eth_portfolio/buckets.py,sha256=-eG-F_Ke0meR_pdA8uYQQuO0lkVgbizTUG3Xhe8o5dE,7599
13
+ eth_portfolio/_shitcoins.cpython-310-darwin.so,sha256=_d1Pr6YuAzwT9nW7U4Ng2HfQ_z3HDWC_bbMqE-xvkm4,50656
19
14
  eth_portfolio/_decorators.py,sha256=_ZSurUFEIwZRiMFMhLcIXkD-Ey1CqfBqGaE24hLzOuA,2815
20
15
  eth_portfolio/_stableish.py,sha256=VTv69Q91AHxbNbbY0LB4PFwKEseHdkE4_6fLPKH1uW0,2021
21
16
  eth_portfolio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- eth_portfolio/_shitcoins.py,sha256=Sd9HKq7yC5GR0lcjO-gwiIEOrXqBMQwMgKyjNL6CHpU,16967
23
- eth_portfolio/constants.cpython-310-darwin.so,sha256=nfHrRvqj2U4gZfSwqJyLsEmG8bLZrlPo9nANAFh2OV0,50656
17
+ eth_portfolio/_shitcoins.py,sha256=KkadSZieAMu35OoWyDAk5y_E1npcPCy94rb34xVXJB8,17399
18
+ eth_portfolio/constants.cpython-310-darwin.so,sha256=_S90qBAf5RFRsLS2vg6BLbmG8tyF8t2aarV6oGGn5wg,50656
24
19
  eth_portfolio/_config.py,sha256=mw-OA3M8rUA2hqy5wNt30AZRHkWFgR8K2sJg0o5Baxg,98
25
20
  eth_portfolio/_exceptions.py,sha256=bw3IdXhqrWxeFqYLm7pJZqRHKZas_cCg8A5Ih1WQEqQ,2433
26
21
  eth_portfolio/portfolio.py,sha256=MP_0Y6fXw8TNoyoFCPiu-MUA44jnMm0L_33gec6MjKU,24248
27
22
  eth_portfolio/_utils.py,sha256=8403ioVA6VX4XaF56CDI9IA4ilTZUf_TrdlQ78chXbQ,7661
28
- eth_portfolio/_loaders/_nonce.cpython-310-darwin.so,sha256=5s2CZxgQT6qthyK3vEGxfzVXsXOzJlD0ZhUf90E_XNs,50656
23
+ eth_portfolio/_loaders/_nonce.cpython-310-darwin.so,sha256=GMPLAdMekHZFSZUdrpK0-42M5354A3g0tXCRONzkFVs,50656
29
24
  eth_portfolio/_loaders/transaction.py,sha256=XLIziLy3YnBPP0E639tQcZfT2Xy4I5VCz6jnfn_C4mE,9153
30
25
  eth_portfolio/_loaders/__init__.py,sha256=lb45_0ak32Z7N3-Nx1CAoRKiZ1_w-_YGbmSCNuunro8,1702
31
26
  eth_portfolio/_loaders/_nonce.py,sha256=cx0EjTAhVU2EudMKSO-7-t1jl3y4dYn6as4XiY6KyS8,6285
32
27
  eth_portfolio/_loaders/utils.py,sha256=aoGgWl9ra9F-qb0wA-sX3qelUNGI-fGvM90297L7xWM,2265
33
- eth_portfolio/_loaders/balances.cpython-310-darwin.so,sha256=nvtMwlpI4XHMtGNiThC5lT_IfDa9prUniO5KYJ8roPg,50656
28
+ eth_portfolio/_loaders/balances.cpython-310-darwin.so,sha256=-s5BDhW7Hc_27f8Avxo-Oj5_c0C28652UnX6_OQQ2B0,50656
34
29
  eth_portfolio/_loaders/balances.py,sha256=BTWfkJIoSraUMe94Wuj8NPyg5EO0OByIjbXu7j6PZEo,3132
35
30
  eth_portfolio/_loaders/token_transfer.py,sha256=JupdQRdTPPsnqFhyRv7vt7IhoC2oEtypjxhEfpzTy9E,8531
36
- eth_portfolio/_loaders/utils.cpython-310-darwin.so,sha256=2ayUQww1avMkVrPR1cFSBvpcz3gg8Ol1k36IcLOFvBg,50648
31
+ eth_portfolio/_loaders/utils.cpython-310-darwin.so,sha256=7RlIGOwYWWcNe6sjoME4B13dpnIA2fNaaIpELfVYzdU,50648
37
32
  eth_portfolio/_ydb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
33
  eth_portfolio/_ydb/token_transfers.py,sha256=aKaYSDnJehEcDb_c6YTmcKZxSfZ1jwHMXMOAmE8XH30,5152
39
34
  eth_portfolio/_db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -63,21 +58,26 @@ eth_portfolio/protocols/lending/unit.py,sha256=7oRvIkoKUm8IOnDv59pILSSJWFNNjwr4C
63
58
  eth_portfolio_scripts/_logging.py,sha256=B_rQMYt_1PhpwCOLBRpkKK6M1ljcF0wAIgqfPIsFUGU,354
64
59
  eth_portfolio_scripts/_args.py,sha256=k6J6XkRe1VuN1DiyGuXLCR7NBSvzH5jnVChfzodKuB8,656
65
60
  eth_portfolio_scripts/__init__.py,sha256=TC5c4WZdzSHhTIBYuwzrAyzFuGzBmHiDX_g6ghO09jQ,261
66
- eth_portfolio_scripts/balances.cpython-310-darwin.so,sha256=iS1ADXQCkspScU12QuV-qExwBk6dtv4apK15HF1U16Y,50656
67
- eth_portfolio_scripts/_portfolio.py,sha256=umA-70yv2PGdHgoQVycknkSKk6QurB86FOXlIqBVY38,7139
61
+ eth_portfolio_scripts/balances.cpython-310-darwin.so,sha256=Oy3RLZsRR9V_rXKE4bFZJ6RxdC5ffmHhvMSempGSfrs,50656
62
+ eth_portfolio_scripts/_portfolio.py,sha256=HE2wASsPKc4fORD6QSiUapNdzxurWVo_06ImJFTluKQ,7794
68
63
  eth_portfolio_scripts/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
69
64
  eth_portfolio_scripts/balances.py,sha256=QvpOdXnH1V-tOuEmAOPxH3MrincDExlIP1eEJ2IG2Lk,1588
70
65
  eth_portfolio_scripts/main.py,sha256=crhObJ5P0B45zTBE2QOIOPYCxtJ8zhsciarcSZN1HHE,3685
71
66
  eth_portfolio_scripts/_utils.py,sha256=-JiZLpSa8P2_ZFXw1AfpVmTO6X65yPeVVdnrDpNFzNQ,3057
72
- eth_portfolio_scripts/docker/docker_compose.cpython-310-darwin.so,sha256=JGkZ6Ym6OpeXl8rN5JIEddpfzJQLhMTCwPB2vPdAH3E,50712
73
- eth_portfolio_scripts/docker/docker-compose.yaml,sha256=EWaPAppR1TzyMOucsMoGGh2uu9fXyzYTeO0IIU12fvc,1809
74
- eth_portfolio_scripts/docker/docker_compose.py,sha256=K7_Y_8NeN5s0pb9WUamgfi9OppjpaU0Mlz2nDzewcRA,2226
75
- eth_portfolio_scripts/docker/check.cpython-310-darwin.so,sha256=Z44NEmhLaklVJ0NL7koDzfBZr7KiRtln7u0GaoOYHRc,50664
76
- eth_portfolio_scripts/docker/check.py,sha256=E6_Ar4dr6HfVAgpwoDPcObIolikHKQr8VFkH01sOuIM,1745
67
+ eth_portfolio_scripts/docker/docker_compose.cpython-310-darwin.so,sha256=xUNfuo9PD61rRm3FaS7d-hkZ9JGiubfbVAIiPqNiLj4,50712
68
+ eth_portfolio_scripts/docker/docker-compose.yaml,sha256=ZZo_aOYw-Wm2XDpqJpXjUKbtyqbOE5BWa1gR3h-8fUw,1809
69
+ eth_portfolio_scripts/docker/docker_compose.py,sha256=xlrC2cOJ7IJB-z4ntY0H6WcmwGBK3RS6OeBiBF9QmZM,2805
70
+ eth_portfolio_scripts/docker/check.cpython-310-darwin.so,sha256=SCm3evTBP9q8H9fGp9VAJ1Dx1eLqrCExp0Yj-CmLsOQ,50664
71
+ eth_portfolio_scripts/docker/check.py,sha256=80fRi6WvxSQM1NxIhtM6vg6fLOjGuqq5F2mGCf4VSvc,1930
77
72
  eth_portfolio_scripts/docker/__init__.py,sha256=ZXSIYcjp94c0O9o39BDGWju3YrCMLl4gtov7YChc9Ig,393
78
- eth_portfolio_scripts/docker/__init__.cpython-310-darwin.so,sha256=7C56y2X-EjADo3LKrD0bcXHFGk8SvKHdu4agnQH2Kps,50656
73
+ eth_portfolio_scripts/docker/__init__.cpython-310-darwin.so,sha256=iw7ue5t4ZSwvI6pzvFPuEUpLlbVWLWe4BaFLMh8cSSo,50656
79
74
  eth_portfolio_scripts/docker/.grafana/datasources/datasources.yml,sha256=pBE_0Nh_J7d9Fiy3Xu6vuac_HWCBcFsJJSV-ryjQR1Y,188
80
75
  eth_portfolio_scripts/docker/.grafana/dashboards/dashboards.yaml,sha256=MynNDOk69IihoYdd2bL7j8CnRb2Co4gdqW7T4m6AaEU,202
81
76
  eth_portfolio_scripts/docker/.grafana/dashboards/Portfolio/Balances.json,sha256=dBmjogLJRuixCHWSs4ROE0_FXb-PUbqWBHEdLoP-1MU,68788
82
77
  eth_portfolio_scripts/victoria/__init__.py,sha256=hHVexpiVFJdBrdztihYBKC5hCdYDopo6aSaErI0mmOo,1965
83
78
  eth_portfolio_scripts/victoria/types.py,sha256=FJossvAvwNGkufmEk3JD_I10EEaCsOb-m6aeX_vGsUg,707
79
+ eth_portfolio_temp-0.3.1.dist-info/RECORD,,
80
+ eth_portfolio_temp-0.3.1.dist-info/WHEEL,sha256=11kMdE9gzbsaQG30fRcsAYxBLEVRsqJo098Y5iL60Xo,136
81
+ eth_portfolio_temp-0.3.1.dist-info/entry_points.txt,sha256=yqoC6X3LU1NA_-oJ6mloEYEPNmS-0hPS9OtEwgIeDGU,66
82
+ eth_portfolio_temp-0.3.1.dist-info/top_level.txt,sha256=4MlbY-Yj8oGBGL8piXiO4SOpk2gZFF9ZXVTObTZOzqM,57
83
+ eth_portfolio_temp-0.3.1.dist-info/METADATA,sha256=nlPooM8Gu0oWzHNMWfJn4GONPOFqCUbsDLBsqN7_CL0,813