eth-portfolio-temp 0.2.1.dev0__cp310-cp310-macosx_11_0_arm64.whl → 0.2.3.dev0__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
eth_portfolio/_utils.py CHANGED
@@ -136,10 +136,11 @@ async def _get_price(token: AddressOrContract, block: Optional[int] = None) -> _
136
136
  elif isinstance(e.exception, NonStandardERC20):
137
137
  # Can't get symbol for handling like other excs
138
138
  logger.warning(f"NonStandardERC20 while fetching price for {token}")
139
- elif isinstance(e.exception, PriceError) and token not in SUPPRESS_ERROR_LOGS:
140
- logger.warning(
141
- f"PriceError while fetching price for {await _describe_err(token, block)}"
142
- )
139
+ elif isinstance(e.exception, PriceError):
140
+ if token not in SUPPRESS_ERROR_LOGS:
141
+ logger.warning(
142
+ f"PriceError while fetching price for {await _describe_err(token, block)}"
143
+ )
143
144
  else:
144
145
  logger.warning(f"{e} while fetching price for {await _describe_err(token, block)}")
145
146
  logger.warning(e, exc_info=True)
@@ -40,8 +40,10 @@ class ExportablePortfolio(Portfolio):
40
40
  def __init__(
41
41
  self,
42
42
  addresses: Addresses,
43
+ *,
43
44
  start_block: int = 0,
44
45
  label: str = _DEFAULT_LABEL,
46
+ concurrency: int = 60,
45
47
  load_prices: bool = True,
46
48
  get_bucket: Callable[[ChecksumAddress], Awaitable[str]] = get_token_bucket,
47
49
  num_workers_transactions: int = 1000,
@@ -51,6 +53,7 @@ class ExportablePortfolio(Portfolio):
51
53
  addresses, start_block, label, load_prices, num_workers_transactions, asynchronous
52
54
  )
53
55
  self.get_bucket = get_bucket
56
+ self._semaphore = a_sync.Semaphore(concurrency)
54
57
 
55
58
  @cached_property
56
59
  def _data_queries(self) -> Tuple[str, str]:
@@ -88,36 +91,36 @@ class ExportablePortfolio(Portfolio):
88
91
  except Exception as e:
89
92
  log_error("Error processing %s:", dt, exc_info=True)
90
93
 
91
- @a_sync.Semaphore(60)
92
94
  async def get_data_for_export(self, block: BlockNumber, ts: datetime) -> List[victoria.Metric]:
93
- print(f"exporting {ts} for {self.label}")
94
- start = datetime.now(tz=timezone.utc)
95
-
96
- metrics_to_export = []
97
- data: PortfolioBalances = await self.describe(block, sync=False)
98
-
99
- for wallet, wallet_data in dict.items(data):
100
- for section, section_data in wallet_data.items():
101
- if isinstance(section_data, TokenBalances):
102
- for token, bals in dict.items(section_data):
103
- metrics_to_export.extend(
104
- await self.__process_token(ts, section, wallet, token, bals)
105
- )
106
- elif isinstance(section_data, RemoteTokenBalances):
107
- if section == "external":
108
- section = "assets"
109
- for protocol, token_bals in section_data.items():
110
- for token, bals in dict.items(token_bals):
95
+ async with self._semaphore:
96
+ print(f"exporting {ts} for {self.label}")
97
+ start = datetime.now(tz=timezone.utc)
98
+
99
+ metrics_to_export = []
100
+ data: PortfolioBalances = await self.describe(block, sync=False)
101
+
102
+ for wallet, wallet_data in dict.items(data):
103
+ for section, section_data in wallet_data.items():
104
+ if isinstance(section_data, TokenBalances):
105
+ for token, bals in dict.items(section_data):
111
106
  metrics_to_export.extend(
112
- await self.__process_token(
113
- ts, section, wallet, token, bals, protocol=protocol
114
- )
107
+ await self.__process_token(ts, section, wallet, token, bals)
115
108
  )
116
- else:
117
- raise NotImplementedError()
109
+ elif isinstance(section_data, RemoteTokenBalances):
110
+ if section == "external":
111
+ section = "assets"
112
+ for protocol, token_bals in section_data.items():
113
+ for token, bals in dict.items(token_bals):
114
+ metrics_to_export.extend(
115
+ await self.__process_token(
116
+ ts, section, wallet, token, bals, protocol=protocol
117
+ )
118
+ )
119
+ else:
120
+ raise NotImplementedError()
118
121
 
119
- print(f"got data for {ts} in {datetime.now(tz=timezone.utc) - start}")
120
- return metrics_to_export
122
+ print(f"got data for {ts} in {datetime.now(tz=timezone.utc) - start}")
123
+ return metrics_to_export
121
124
 
122
125
  def __get_data_exists_coros(self, dt: datetime) -> Iterator[str]:
123
126
  for query in self._data_queries:
@@ -26,13 +26,16 @@ async def export_balances(args: Namespace) -> None:
26
26
 
27
27
  interval = parse_timedelta(args.interval)
28
28
  portfolio = ExportablePortfolio(
29
- args.wallet, label=args.label, start_block=args.first_tx_block, load_prices=False
29
+ args.wallet,
30
+ label=args.label,
31
+ start_block=args.first_tx_block,
32
+ concurrency=args.concurrency,
33
+ load_prices=False,
30
34
  )
31
35
 
32
36
  if export_start_block := args.export_start_block or args.first_tx_block:
33
- start = datetime.fromtimestamp(
34
- await dank_mids.eth.get_block_timestamp(args.export_start_block), tz=timezone.utc
35
- )
37
+ start_ts = await dank_mids.eth.get_block_timestamp(export_start_block)
38
+ start = datetime.fromtimestamp(start_ts, tz=timezone.utc)
36
39
  else:
37
40
  start = None
38
41
 
@@ -54,6 +54,12 @@ export_parser.add_argument(
54
54
  help="The time interval between datapoints. default: 6h",
55
55
  default="6h",
56
56
  )
57
+ export_parser.add_argument(
58
+ "--concurrency",
59
+ type=int,
60
+ help="The max number of historical blocks to export concurrently. default: 60",
61
+ default=60,
62
+ )
57
63
  export_parser.add_argument(
58
64
  "--first-tx-block",
59
65
  type=int,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eth_portfolio_temp
3
- Version: 0.2.1.dev0
3
+ Version: 0.2.3.dev0
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,34 +1,39 @@
1
- 295eace8438df6ec133b__mypyc.cpython-310-darwin.so,sha256=6W2DIXis2XQKSihfz_vibq_BIUKMu3-ClllyxaHzPNw,668304
1
+ 295eace8438df6ec133b__mypyc.cpython-310-darwin.so,sha256=lS3hdPVgjh2LJyOK7vd9__IkswkUiXMGrqNvaVuNyMk,669536
2
+ eth_portfolio_temp-0.2.3.dev0.dist-info/RECORD,,
3
+ eth_portfolio_temp-0.2.3.dev0.dist-info/WHEEL,sha256=11kMdE9gzbsaQG30fRcsAYxBLEVRsqJo098Y5iL60Xo,136
4
+ eth_portfolio_temp-0.2.3.dev0.dist-info/entry_points.txt,sha256=yqoC6X3LU1NA_-oJ6mloEYEPNmS-0hPS9OtEwgIeDGU,66
5
+ eth_portfolio_temp-0.2.3.dev0.dist-info/top_level.txt,sha256=CmTLi8Lvs3RulV5ZNdziaDVvF_WRsgRpM17GSMECxrg,64
6
+ eth_portfolio_temp-0.2.3.dev0.dist-info/METADATA,sha256=orjcH7HsKx696s8BFy30bkvhBHUkC9YgS4H3t20BC6U,779
2
7
  eth_portfolio/address.py,sha256=LvBh4Vp2DBC3gQ0WD-TZ6jfe9s6FZbET1krYG9_KMAA,14139
3
8
  eth_portfolio/_cache.py,sha256=PYkR-yExjuwd_t7swv4euxL2daJ-VFwh3EMb3MciRJE,4745
4
- eth_portfolio/_stableish.cpython-310-darwin.so,sha256=8AEIWnmZ5FvKrd-3o4D_I9qidzM_n7saebKA_3fC-tI,50656
9
+ eth_portfolio/_stableish.cpython-310-darwin.so,sha256=B0bMKE_y6UWqYzUHYuhnzG69wg4yIyi5hndFOUubHro,50656
5
10
  eth_portfolio/_argspec.py,sha256=VzUZkbDkmOSgNUZBGbGblqtxBfDcmBAB89dY2OX0j-U,1595
6
11
  eth_portfolio/_submodules.py,sha256=J8ht9bAAvblUXqwOGN7UIOXUPxrTiq7m1RWiB0-ObaE,2190
7
12
  eth_portfolio/constants.py,sha256=LS9H2P_Qfcreb6z6NknErxvq6OAtIHbHykXy0spol9E,3659
8
13
  eth_portfolio/__init__.py,sha256=0sO4cSJaLYwJfnfVOJRFw7p5_Lzhsr95YuJ1aNQM83A,500
9
- eth_portfolio/_argspec.cpython-310-darwin.so,sha256=5L_jjnCERLXXlHYZv6LI7nkfCraIx4n8GqCZjo6Jyck,50640
14
+ eth_portfolio/_argspec.cpython-310-darwin.so,sha256=Lt-AT6ihWTtexbY7oy6B3xpJooQ1nkV8aN3V4TuqDNE,50640
10
15
  eth_portfolio/_decimal.py,sha256=nuUl6DZHCtrbBN7snwvs4LLaoJ5k7mn3dt4qmlFCkTU,4731
11
- eth_portfolio/_config.cpython-310-darwin.so,sha256=gvz5RDSgxWRCxIv5jMNTKL5MdplOwOHf7ncuFalFEJU,50640
16
+ eth_portfolio/_config.cpython-310-darwin.so,sha256=6vEeyU2QpAx2XmtYXu9pYDfpmB2p7rSlb2_sXYYGhlE,50640
12
17
  eth_portfolio/buckets.py,sha256=QwdqWzW9iWBmRcJ2aktRtL-obvtBnND179krY5ISbhY,6695
13
- eth_portfolio/_shitcoins.cpython-310-darwin.so,sha256=Bn4GUwNiqqBtSQv680JTRx8NvbdRvwthTVDKq32Kdbg,50656
18
+ eth_portfolio/_shitcoins.cpython-310-darwin.so,sha256=YUuKqzKzLD0X_seAMVRcar2ck9Yr_K24gJyHi9ZIG3M,50656
14
19
  eth_portfolio/_decorators.py,sha256=_ZSurUFEIwZRiMFMhLcIXkD-Ey1CqfBqGaE24hLzOuA,2815
15
20
  eth_portfolio/_stableish.py,sha256=VTv69Q91AHxbNbbY0LB4PFwKEseHdkE4_6fLPKH1uW0,2021
16
21
  eth_portfolio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
22
  eth_portfolio/_shitcoins.py,sha256=FrqttZzQdheTAabdIK0oVHayqHF0UkLQLEiMz8njQe0,15563
18
- eth_portfolio/constants.cpython-310-darwin.so,sha256=sx2_P3l1Gu-o1fAWmDPchuTkSXs0lqPNrlIyxLxiMUQ,50656
23
+ eth_portfolio/constants.cpython-310-darwin.so,sha256=R-9RjzQVbC-iICRGQoN4X1lk459ydSSjo1XMmfEZ6pg,50656
19
24
  eth_portfolio/_config.py,sha256=mw-OA3M8rUA2hqy5wNt30AZRHkWFgR8K2sJg0o5Baxg,98
20
25
  eth_portfolio/_exceptions.py,sha256=bw3IdXhqrWxeFqYLm7pJZqRHKZas_cCg8A5Ih1WQEqQ,2433
21
26
  eth_portfolio/portfolio.py,sha256=KljK3FZQMtRQLs1D-HHgCN-DVoZ6ZzEdmclmF3__oz0,24243
22
- eth_portfolio/_utils.py,sha256=10In2lr0QmfiavyeA4Z8wDTuujRVmjcc0cd-o71JEBg,7742
23
- eth_portfolio/_loaders/_nonce.cpython-310-darwin.so,sha256=ySogFqbDD2XOZrOfjFfzClPySPwj4WTDscmzT10RxrM,50656
27
+ eth_portfolio/_utils.py,sha256=Ab3m6i79U-tnTrc_b_kTmOO4xKjbsX9slf6l0sXzf4c,7770
28
+ eth_portfolio/_loaders/_nonce.cpython-310-darwin.so,sha256=NeMoSkEAMa69B28s7EsO_uua77l875Fm0J1bkadWJrY,50656
24
29
  eth_portfolio/_loaders/transaction.py,sha256=FEYdoNDCgD6-mqZT9MuyYIEkdhG3iUwyNeMmqjpMGJw,9146
25
30
  eth_portfolio/_loaders/__init__.py,sha256=lb45_0ak32Z7N3-Nx1CAoRKiZ1_w-_YGbmSCNuunro8,1702
26
31
  eth_portfolio/_loaders/_nonce.py,sha256=cx0EjTAhVU2EudMKSO-7-t1jl3y4dYn6as4XiY6KyS8,6285
27
32
  eth_portfolio/_loaders/utils.py,sha256=my3Wg2Ip5gSWuzAWcoLQQEmVmAPhIHbBzQQc0iP1iCA,2258
28
- eth_portfolio/_loaders/balances.cpython-310-darwin.so,sha256=rT6eNzW3zM4tmvUmXRxVpPmqE1m95epVn99S06xk-3Q,50656
33
+ eth_portfolio/_loaders/balances.cpython-310-darwin.so,sha256=88iLjjef3fDPPv-BIWUvoEhsLUN-6ZlAi4blZIV4k5w,50656
29
34
  eth_portfolio/_loaders/balances.py,sha256=BTWfkJIoSraUMe94Wuj8NPyg5EO0OByIjbXu7j6PZEo,3132
30
35
  eth_portfolio/_loaders/token_transfer.py,sha256=MEw95D2iKBYa_9vIatCHJGe7zEJuYUEC8P1mTjjRXlo,8524
31
- eth_portfolio/_loaders/utils.cpython-310-darwin.so,sha256=RwfuPL_Wad9yjxKMF8z3t5QQH9SolglCnvfcQxeq9YU,50648
36
+ eth_portfolio/_loaders/utils.cpython-310-darwin.so,sha256=eiesB53yn8st0A8WtajuZzrmxHAk07VGXfNnymg5D0Q,50648
32
37
  eth_portfolio/_ydb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
38
  eth_portfolio/_ydb/token_transfers.py,sha256=aKaYSDnJehEcDb_c6YTmcKZxSfZ1jwHMXMOAmE8XH30,5152
34
39
  eth_portfolio/_db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -55,27 +60,22 @@ eth_portfolio/protocols/lending/__init__.py,sha256=BZtCOglz6R12wqETlECbCEITdtIT9
55
60
  eth_portfolio/protocols/lending/README.md,sha256=OhZfsW8e-aD-q02g0maG9QGgW0IietkDRZc7PBakBvc,493
56
61
  eth_portfolio/protocols/lending/compound.py,sha256=bqnIevm7NWhk6nMfkMZUKlQuVWr-tXnuntX-4De1YZM,7252
57
62
  eth_portfolio/protocols/lending/unit.py,sha256=7oRvIkoKUm8IOnDv59pILSSJWFNNjwr4CR1gg2psW9M,1965
58
- eth_portfolio_temp-0.2.1.dev0.dist-info/RECORD,,
59
- eth_portfolio_temp-0.2.1.dev0.dist-info/WHEEL,sha256=11kMdE9gzbsaQG30fRcsAYxBLEVRsqJo098Y5iL60Xo,136
60
- eth_portfolio_temp-0.2.1.dev0.dist-info/entry_points.txt,sha256=yqoC6X3LU1NA_-oJ6mloEYEPNmS-0hPS9OtEwgIeDGU,66
61
- eth_portfolio_temp-0.2.1.dev0.dist-info/top_level.txt,sha256=CmTLi8Lvs3RulV5ZNdziaDVvF_WRsgRpM17GSMECxrg,64
62
- eth_portfolio_temp-0.2.1.dev0.dist-info/METADATA,sha256=5GTbcM4x4Qh82t2ZCdoMIFyvWiUmozo54sjQJxdp4QA,779
63
63
  eth_portfolio_scripts/_logging.py,sha256=B_rQMYt_1PhpwCOLBRpkKK6M1ljcF0wAIgqfPIsFUGU,354
64
64
  eth_portfolio_scripts/_args.py,sha256=k6J6XkRe1VuN1DiyGuXLCR7NBSvzH5jnVChfzodKuB8,656
65
65
  eth_portfolio_scripts/__init__.py,sha256=TC5c4WZdzSHhTIBYuwzrAyzFuGzBmHiDX_g6ghO09jQ,261
66
- eth_portfolio_scripts/balances.cpython-310-darwin.so,sha256=B6HkajIUII1wUi_rKE8yH55skEjYPuy1Rafr4bNgyvw,50656
67
- eth_portfolio_scripts/_portfolio.py,sha256=cv4Qpb3EdwhO2sZEOnHYFWOHaoFo6wwt3nddyfDBYv0,6724
66
+ eth_portfolio_scripts/balances.cpython-310-darwin.so,sha256=D3Oh_m_Ej19rcEH259GsbkoJCunZ4Whpa147fUqP1I4,50656
67
+ eth_portfolio_scripts/_portfolio.py,sha256=36n8DE9OfHvdF0ez12yzWpxI7at6_eo3eno7V_YYu3A,6932
68
68
  eth_portfolio_scripts/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
69
- eth_portfolio_scripts/balances.py,sha256=o94uA4FVgPE-chbaoQgQazfXQ0O8k6W_yk9JY2bgRpQ,1524
70
- eth_portfolio_scripts/main.py,sha256=A7N78d2hxoU-Xu-dITCRqZ7yRL2l5r26WWzXzMdbeYo,3520
69
+ eth_portfolio_scripts/balances.py,sha256=QvpOdXnH1V-tOuEmAOPxH3MrincDExlIP1eEJ2IG2Lk,1588
70
+ eth_portfolio_scripts/main.py,sha256=vafXy4JvNWrP203AgCRcSKHMsOSCC7VVj9zBd_BFYZU,3685
71
71
  eth_portfolio_scripts/_utils.py,sha256=qyct1Mwf2-1DYj7BUWt2bocUfGKMap1l9sxUfHAjER0,2538
72
- eth_portfolio_scripts/docker/docker_compose.cpython-310-darwin.so,sha256=UZ6_f45DjzwfU4ozM7Eyxw601CAx8mwAlSIbZMDk60A,50712
72
+ eth_portfolio_scripts/docker/docker_compose.cpython-310-darwin.so,sha256=9UIARu6T4k0fvB66IKx-Y921LWZKAM4MVa6Ps5Wftws,50712
73
73
  eth_portfolio_scripts/docker/docker-compose.yaml,sha256=pQ4eesSfMtcb9muDFT5TFDqZty15BoC2Rrd8HY0LS04,1809
74
74
  eth_portfolio_scripts/docker/docker_compose.py,sha256=K7_Y_8NeN5s0pb9WUamgfi9OppjpaU0Mlz2nDzewcRA,2226
75
- eth_portfolio_scripts/docker/check.cpython-310-darwin.so,sha256=RfGVOZB2fe6AmfM09wArZcO-IuRb5JU86wyTspvOJLE,50664
75
+ eth_portfolio_scripts/docker/check.cpython-310-darwin.so,sha256=fKasSAtAH8sPH7bKNLTFhx6civu_QaQInWd5DpFg4BI,50664
76
76
  eth_portfolio_scripts/docker/check.py,sha256=E6_Ar4dr6HfVAgpwoDPcObIolikHKQr8VFkH01sOuIM,1745
77
77
  eth_portfolio_scripts/docker/__init__.py,sha256=ZXSIYcjp94c0O9o39BDGWju3YrCMLl4gtov7YChc9Ig,393
78
- eth_portfolio_scripts/docker/__init__.cpython-310-darwin.so,sha256=CGut7DsUpZoethtW0EmR-QuzSP4r9Oe8HdokarembCM,50656
78
+ eth_portfolio_scripts/docker/__init__.cpython-310-darwin.so,sha256=q3TSnxSkyGsBGkL7QQ7DARlDzXX26rtowKpjJkRjhkE,50656
79
79
  eth_portfolio_scripts/docker/.grafana/datasources/datasources.yml,sha256=pBE_0Nh_J7d9Fiy3Xu6vuac_HWCBcFsJJSV-ryjQR1Y,188
80
80
  eth_portfolio_scripts/docker/.grafana/dashboards/dashboards.yaml,sha256=MynNDOk69IihoYdd2bL7j8CnRb2Co4gdqW7T4m6AaEU,202
81
81
  eth_portfolio_scripts/docker/.grafana/dashboards/Portfolio/Balances.json,sha256=dBmjogLJRuixCHWSs4ROE0_FXb-PUbqWBHEdLoP-1MU,68788