eth-portfolio-temp 0.2.16__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.
Binary file
@@ -186,6 +186,13 @@ shitcoins: Final = {
186
186
  "0xc6a76f7ad66d0e6Ccd1AaAd6e7568c9bd55Dce62",
187
187
  "0xB4d4334eB5a251cbE5cC7Afb0Ba26119aCE62281",
188
188
  "0xE5c5AE39B98eFd9D3c9E0F2a5457D98fFA4b0b46",
189
+ "0x912033c6644008DD8438A5C07738a513f38Ded5D",
190
+ "0xffE49E3BB3725d499223611e571215029877A6Cf",
191
+ "0x7d593cC8E0b8ceBF645342AaFf5631e689FB5249",
192
+ "0x3E67A4D218061263202c1480ddB479080C59dd0E",
193
+ "0xac4607A2D8a2bfA721955a23D3F290B0E176612E",
194
+ "0x27ed436e67515C1dD33633537EEBd59207c51806",
195
+ "0x92b48cf18a947c66557CE4aC829D6DB012D11Aa5",
189
196
  # Generally looks like shit (symbol ERC20)
190
197
  "0x2adA6e459089292264133d8D7c85f6907423E444",
191
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(" ", "_")
@@ -71,7 +71,9 @@ def _print_notice(
71
71
  doing: Literal["building", "starting", "stopping"],
72
72
  services: Tuple[str, ...],
73
73
  ) -> None:
74
- if len(services) == 1:
74
+ if len(services) == 0:
75
+ print(f"{doing} the backend containers")
76
+ elif len(services) == 1:
75
77
  container = services[0]
76
78
  print(f"{doing} the {container} container")
77
79
  elif len(services) == 2:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eth_portfolio_temp
3
- Version: 0.2.16
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
@@ -1,39 +1,34 @@
1
- eth_portfolio__mypyc.cpython-310-darwin.so,sha256=sHzVbvmjD1W5GialEDK34jAmo1FQVlAFoJ55NULUriM,694568
2
- eth_portfolio_temp-0.2.16.dist-info/RECORD,,
3
- eth_portfolio_temp-0.2.16.dist-info/WHEEL,sha256=11kMdE9gzbsaQG30fRcsAYxBLEVRsqJo098Y5iL60Xo,136
4
- eth_portfolio_temp-0.2.16.dist-info/entry_points.txt,sha256=yqoC6X3LU1NA_-oJ6mloEYEPNmS-0hPS9OtEwgIeDGU,66
5
- eth_portfolio_temp-0.2.16.dist-info/top_level.txt,sha256=4MlbY-Yj8oGBGL8piXiO4SOpk2gZFF9ZXVTObTZOzqM,57
6
- eth_portfolio_temp-0.2.16.dist-info/METADATA,sha256=X95Jf9P3LsjGll4sD_H9ibkF4HtBzr7OzBD0_-zoF1Q,814
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=xArw1kQHaYwl7c7LaFYZvR1k1Ob1T720RmgqcHBMfvY,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=D76B2sV6youNM7wPUZKuTisbfgkHQRCQtZIKVzicCwg,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=-9kB79WuafiIOyyb8HJ2UC8fNZWT8sIoYD4m7fJ9FjU,50640
17
- eth_portfolio/buckets.py,sha256=30Tv5Tq-IL6NsACKbxp7hge84Q-upWsiWGdDTKkXeqE,6702
18
- eth_portfolio/_shitcoins.cpython-310-darwin.so,sha256=n3kuiPgQMNigY3-SNlSjaI7diC3-JS28preWfLuAp24,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=5OsOC6dYXG6MA2V1hajdiHRfXAX4eG94Wzmh9Dh_5IM,17021
23
- eth_portfolio/constants.cpython-310-darwin.so,sha256=zeYMepS-mhZ5Y0pOoGsL6w-1-fAz79ZFixAUbf3tsUU,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=a0H7n8YDoo52eOddx_qH7SXcyrjvNYAuazz_ZBIe0mY,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=DOCIRzl7JjLQaKKJPiGjoTKe_ezjt_ewqRHTsKHp6_A,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=5R3y35chu5XF2UJ84ZeT7zeN5SZhdEdzrpMoIqUp4n0,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=buMa_aNmSa_Vmszhc9kb2pkXuvZgoh0gLm6NoMa2_nE,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=pH8zCeIqhRvyeQjP5ef9_lCKDIcRgyxvY_3iYYf0jXk,50712
67
+ eth_portfolio_scripts/docker/docker_compose.cpython-310-darwin.so,sha256=xUNfuo9PD61rRm3FaS7d-hkZ9JGiubfbVAIiPqNiLj4,50712
73
68
  eth_portfolio_scripts/docker/docker-compose.yaml,sha256=ZZo_aOYw-Wm2XDpqJpXjUKbtyqbOE5BWa1gR3h-8fUw,1809
74
- eth_portfolio_scripts/docker/docker_compose.py,sha256=kVsx2FlRBAsYm8xyax3jvrk-IHKgiZvDqPdpQR8yHKI,2727
75
- eth_portfolio_scripts/docker/check.cpython-310-darwin.so,sha256=gxscyc-lV-yq00qnKknVpPJCVBsZvEqeHo2jWNO4_jw,50664
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
76
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=ueaBPNx0tefebQJ4qGZNS4unM80tWuBFk4NKCbbB5kU,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