eth-portfolio-temp 0.1.8.dev0__cp310-cp310-macosx_11_0_arm64.whl → 0.2.2.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.

Potentially problematic release.


This version of eth-portfolio-temp might be problematic. Click here for more details.

Binary file
@@ -170,6 +170,19 @@ shitcoins: Final = {
170
170
  "0xc6a76f7ad66d0e6Ccd1AaAd6e7568c9bd55Dce62",
171
171
  "0xB4d4334eB5a251cbE5cC7Afb0Ba26119aCE62281",
172
172
  "0xE5c5AE39B98eFd9D3c9E0F2a5457D98fFA4b0b46",
173
+ # Generally looks like shit (symbol ERC20)
174
+ "0xe37be01D1337E77aCB0b4293DDb4D410D80010a7",
175
+ "0x7EeAcC32C81e4D78E9705fBf0b977f5A858Bf0F3",
176
+ "0x90133FF815ade1977EA2f1454dBC1d309EAA33f6",
177
+ "0x82ff6D346E424025B1F07e4C8D6527806e50fCA5",
178
+ "0x7C2bc9F685e1f78e42d236Ff819D89DDA864359d",
179
+ "0x3ea463dD031A384DB68d6fD2f37574248E7ffCfE",
180
+ "0x241b047e810c70AB2bB5C567391E0888c4791cbe",
181
+ "0x47D1b57e5B542808eeEd0C509583Fa12d023f05e",
182
+ "0x8a33B3e6f5C0049Cff6dEca0564F5fbDa0eBe9f9",
183
+ "0x84b2e82Ef534e8bE05276DBf4F9e5474fBeD5E59",
184
+ "0x022b5fE59fc45a29d58a7e45a2567b69b649d623",
185
+ "0x178d20220c22008cc1886d2E689cAeE4A5c3239b",
173
186
  # Tagged as well known address scam on Etherscan
174
187
  "0x59bed83a385571ffac0FC15A43f0f6f72e66Dccb",
175
188
  "0x2Ec109a0ceFEC70661a242a8B54cae8f45630397",
@@ -228,6 +241,7 @@ shitcoins: Final = {
228
241
  "0x89D3Ac7C32Aa14bEE6Fa90E041241dc4eEbbDFB3",
229
242
  "0x640c6fdAfbDaC9bfCe79943890fdc98f8d39bE3e",
230
243
  "0xA04a3a553548090a7b81D2de75B8a08Ee45860e1",
244
+ "0x1b8F28C0d410456FE04b8f421d00d6654F66AbB6",
231
245
  # fake DAI
232
246
  "0xf84f908E78f9295b53883AD9ACa38F86d513f03F",
233
247
  "0x20Dd160716b0387220Eea7B9951bDb51B3728DC4",
eth_portfolio/_utils.py CHANGED
@@ -47,10 +47,15 @@ if TYPE_CHECKING:
47
47
 
48
48
  logger: Final = logging.getLogger(__name__)
49
49
 
50
- NON_STANDARD_ERC721: Final = {
50
+ NON_STANDARD_ERC721: Final[List[ChecksumAddress]] = {
51
51
  Network.Mainnet: ["0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB"], # CryptoPunks
52
52
  }.get(CHAINID, [])
53
53
 
54
+ SUPPRESS_ERROR_LOGS: Final[List[ChecksumAddress]] = {
55
+ # put tokens here when you don't expect them to price successfully and do not want to see the associated error logs
56
+ }.get(CHAINID, [])
57
+ """Put tokens here when you don't expect them to price successfully and do not want to see the associated error logs."""
58
+
54
59
 
55
60
  async def get_buffered_chain_height() -> int:
56
61
  """Returns an int equal to the current height of the chain minus `_config.REORG_BUFFER`."""
@@ -131,7 +136,7 @@ async def _get_price(token: AddressOrContract, block: Optional[int] = None) -> _
131
136
  elif isinstance(e.exception, NonStandardERC20):
132
137
  # Can't get symbol for handling like other excs
133
138
  logger.warning(f"NonStandardERC20 while fetching price for {token}")
134
- elif isinstance(e.exception, PriceError):
139
+ elif isinstance(e.exception, PriceError) and token not in SUPPRESS_ERROR_LOGS:
135
140
  logger.warning(
136
141
  f"PriceError while fetching price for {await _describe_err(token, block)}"
137
142
  )
@@ -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,7 +26,11 @@ 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:
@@ -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.1.8.dev0
3
+ Version: 0.2.2.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=A4LL4UpSqAMrbiRr5OrEk6vcabg5cv6Q0ZFTfTsS7zc,668304
1
+ 295eace8438df6ec133b__mypyc.cpython-310-darwin.so,sha256=Mg15CETpLdvioSLpI_2Y27Vr8aN88ERTnuNdcjLueww,668880
2
+ eth_portfolio_temp-0.2.2.dev0.dist-info/RECORD,,
3
+ eth_portfolio_temp-0.2.2.dev0.dist-info/WHEEL,sha256=11kMdE9gzbsaQG30fRcsAYxBLEVRsqJo098Y5iL60Xo,136
4
+ eth_portfolio_temp-0.2.2.dev0.dist-info/entry_points.txt,sha256=yqoC6X3LU1NA_-oJ6mloEYEPNmS-0hPS9OtEwgIeDGU,66
5
+ eth_portfolio_temp-0.2.2.dev0.dist-info/top_level.txt,sha256=CmTLi8Lvs3RulV5ZNdziaDVvF_WRsgRpM17GSMECxrg,64
6
+ eth_portfolio_temp-0.2.2.dev0.dist-info/METADATA,sha256=O5Y4EOxRYl5K1a1VJU_lRk_Ak1bEn-shaJLH3whBfB4,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=P-a7HDnL_v1rjniWBggjJzxkzP_V6wgosdmrbDSqew8,50656
9
+ eth_portfolio/_stableish.cpython-310-darwin.so,sha256=b7mRPA5BymTLxbRyk_ZwDnnSa_xvWFvI3HCeBbuGvSw,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=ZonilAMgZHrwYnJAXELKFv0qNFK0azYGgVIS69tF2Vs,50640
14
+ eth_portfolio/_argspec.cpython-310-darwin.so,sha256=PYh_QgqlOJCWWwuBJoci4HY3hgQTpPswLVOsu-YQk1Q,50640
10
15
  eth_portfolio/_decimal.py,sha256=nuUl6DZHCtrbBN7snwvs4LLaoJ5k7mn3dt4qmlFCkTU,4731
11
- eth_portfolio/_config.cpython-310-darwin.so,sha256=zO72nHO6bY2cEQi42ZmLq-xUrsxXfV8_vdXSFgVvYVk,50640
16
+ eth_portfolio/_config.cpython-310-darwin.so,sha256=PUIrzOkD8MckgWjlDRSpuAZyoqhlMEdXTKA_sb1ma3o,50640
12
17
  eth_portfolio/buckets.py,sha256=QwdqWzW9iWBmRcJ2aktRtL-obvtBnND179krY5ISbhY,6695
13
- eth_portfolio/_shitcoins.cpython-310-darwin.so,sha256=DGfHJYJD8C_uw8G-t_qDw_C-dpljrWePge-OBXGwLgc,50656
18
+ eth_portfolio/_shitcoins.cpython-310-darwin.so,sha256=bQcf2f8iTV-hfrAXQEgIoqRvbailSuqbFUJRFstIZ6A,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
- eth_portfolio/_shitcoins.py,sha256=d1EhL3HMOh7fJoDZQAVxGOgJeEBTTffJrQ9FqXI7p4E,14810
18
- eth_portfolio/constants.cpython-310-darwin.so,sha256=hxEqblyQdvuspU9V_h2j6UdudFLSRg_7G3_Nv_93dBU,50656
22
+ eth_portfolio/_shitcoins.py,sha256=FrqttZzQdheTAabdIK0oVHayqHF0UkLQLEiMz8njQe0,15563
23
+ eth_portfolio/constants.cpython-310-darwin.so,sha256=57G9OLdumlm1NIE3p-tS9-EyyfM-DsCjkws0R53b0Yg,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=PUGQKa84BzuwprcFC_S5gjcx1h09-pC9CyZIvaYD6fU,7367
23
- eth_portfolio/_loaders/_nonce.cpython-310-darwin.so,sha256=o9oCo0IubyVOacr9cveMDOEw5BSjM8AAJQ_13yP8aT8,50656
27
+ eth_portfolio/_utils.py,sha256=10In2lr0QmfiavyeA4Z8wDTuujRVmjcc0cd-o71JEBg,7742
28
+ eth_portfolio/_loaders/_nonce.cpython-310-darwin.so,sha256=laR5AFr6DggZcYnCkMoZGd_coDia-z1BUiGJbUD0vyA,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=hL2pXn6_7Xc_tEId-2eMLrqkpO8t4LYOKnuf7yZ7eCc,50656
33
+ eth_portfolio/_loaders/balances.cpython-310-darwin.so,sha256=AcTykvfQTqp4eYN-Eu_acBBwWInFP8wrsSKwG80eaNU,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=20Uf6CFlX40KSbGlTZ72PHhalsNlVuRmDuqxIn5qzGs,50648
36
+ eth_portfolio/_loaders/utils.cpython-310-darwin.so,sha256=AgvenZzlUhh3Fo_gWOlsqKNrIyUoJGB1uVf5gp8xCI4,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
@@ -58,26 +63,21 @@ eth_portfolio/protocols/lending/unit.py,sha256=7oRvIkoKUm8IOnDv59pILSSJWFNNjwr4C
58
63
  eth_portfolio_scripts/_logging.py,sha256=B_rQMYt_1PhpwCOLBRpkKK6M1ljcF0wAIgqfPIsFUGU,354
59
64
  eth_portfolio_scripts/_args.py,sha256=k6J6XkRe1VuN1DiyGuXLCR7NBSvzH5jnVChfzodKuB8,656
60
65
  eth_portfolio_scripts/__init__.py,sha256=TC5c4WZdzSHhTIBYuwzrAyzFuGzBmHiDX_g6ghO09jQ,261
61
- eth_portfolio_scripts/balances.cpython-310-darwin.so,sha256=FikHxg4tKfyugm34HSGFFx6Ztur_p0VoklQCJDvFeTM,50656
62
- eth_portfolio_scripts/_portfolio.py,sha256=cv4Qpb3EdwhO2sZEOnHYFWOHaoFo6wwt3nddyfDBYv0,6724
66
+ eth_portfolio_scripts/balances.cpython-310-darwin.so,sha256=HptGEwxx09pnPt6g1vneh10epa_trnhbbMxDwly8HaA,50656
67
+ eth_portfolio_scripts/_portfolio.py,sha256=36n8DE9OfHvdF0ez12yzWpxI7at6_eo3eno7V_YYu3A,6932
63
68
  eth_portfolio_scripts/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
64
- eth_portfolio_scripts/balances.py,sha256=o94uA4FVgPE-chbaoQgQazfXQ0O8k6W_yk9JY2bgRpQ,1524
65
- eth_portfolio_scripts/main.py,sha256=A7N78d2hxoU-Xu-dITCRqZ7yRL2l5r26WWzXzMdbeYo,3520
69
+ eth_portfolio_scripts/balances.py,sha256=m0w2SbFChvOAnxUIKavgdnaq-DS01KimzDqmFV5apJs,1587
70
+ eth_portfolio_scripts/main.py,sha256=vafXy4JvNWrP203AgCRcSKHMsOSCC7VVj9zBd_BFYZU,3685
66
71
  eth_portfolio_scripts/_utils.py,sha256=qyct1Mwf2-1DYj7BUWt2bocUfGKMap1l9sxUfHAjER0,2538
67
- eth_portfolio_scripts/docker/docker_compose.cpython-310-darwin.so,sha256=8NfUPekjG6xdwAK0mHSRlU60QdTj9rLfxEHpwTEMVAw,50712
72
+ eth_portfolio_scripts/docker/docker_compose.cpython-310-darwin.so,sha256=_NNG-6SaoHlqUsPv_d7fC4jUROn0IxN5c1OhBWSyAqc,50712
68
73
  eth_portfolio_scripts/docker/docker-compose.yaml,sha256=pQ4eesSfMtcb9muDFT5TFDqZty15BoC2Rrd8HY0LS04,1809
69
74
  eth_portfolio_scripts/docker/docker_compose.py,sha256=K7_Y_8NeN5s0pb9WUamgfi9OppjpaU0Mlz2nDzewcRA,2226
70
- eth_portfolio_scripts/docker/check.cpython-310-darwin.so,sha256=CB-OmhLFgQyOole3TJSG1X76OopcbXpXA7XG5e9GYtI,50664
75
+ eth_portfolio_scripts/docker/check.cpython-310-darwin.so,sha256=cJ15MiFW1OLa3yZBM_j68qWotTtZ1x_x_Vg5XSVkYCo,50664
71
76
  eth_portfolio_scripts/docker/check.py,sha256=E6_Ar4dr6HfVAgpwoDPcObIolikHKQr8VFkH01sOuIM,1745
72
77
  eth_portfolio_scripts/docker/__init__.py,sha256=ZXSIYcjp94c0O9o39BDGWju3YrCMLl4gtov7YChc9Ig,393
73
- eth_portfolio_scripts/docker/__init__.cpython-310-darwin.so,sha256=KawkIFiJ-yeSbjT28S6FW3AcSDuin_i2TDjpzblcyYM,50656
78
+ eth_portfolio_scripts/docker/__init__.cpython-310-darwin.so,sha256=WpVPudoea2bTi1l6XJcajZ78ZPFCIUKF32iawcHHhfI,50656
74
79
  eth_portfolio_scripts/docker/.grafana/datasources/datasources.yml,sha256=pBE_0Nh_J7d9Fiy3Xu6vuac_HWCBcFsJJSV-ryjQR1Y,188
75
80
  eth_portfolio_scripts/docker/.grafana/dashboards/dashboards.yaml,sha256=MynNDOk69IihoYdd2bL7j8CnRb2Co4gdqW7T4m6AaEU,202
76
81
  eth_portfolio_scripts/docker/.grafana/dashboards/Portfolio/Balances.json,sha256=dBmjogLJRuixCHWSs4ROE0_FXb-PUbqWBHEdLoP-1MU,68788
77
82
  eth_portfolio_scripts/victoria/__init__.py,sha256=hHVexpiVFJdBrdztihYBKC5hCdYDopo6aSaErI0mmOo,1965
78
83
  eth_portfolio_scripts/victoria/types.py,sha256=FJossvAvwNGkufmEk3JD_I10EEaCsOb-m6aeX_vGsUg,707
79
- eth_portfolio_temp-0.1.8.dev0.dist-info/RECORD,,
80
- eth_portfolio_temp-0.1.8.dev0.dist-info/WHEEL,sha256=11kMdE9gzbsaQG30fRcsAYxBLEVRsqJo098Y5iL60Xo,136
81
- eth_portfolio_temp-0.1.8.dev0.dist-info/entry_points.txt,sha256=yqoC6X3LU1NA_-oJ6mloEYEPNmS-0hPS9OtEwgIeDGU,66
82
- eth_portfolio_temp-0.1.8.dev0.dist-info/top_level.txt,sha256=CmTLi8Lvs3RulV5ZNdziaDVvF_WRsgRpM17GSMECxrg,64
83
- eth_portfolio_temp-0.1.8.dev0.dist-info/METADATA,sha256=ZrCEsaX4OC8SMuL8GWd6RlYcS3vJ2tNcxZ9AjZ6Z9Q8,779