eth-prototype 1.3.3__py3-none-any.whl → 1.3.5__py3-none-any.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eth-prototype
3
- Version: 1.3.3
3
+ Version: 1.3.5
4
4
  Summary: Prototype Ethereum Smart Contracts in Python
5
5
  Home-page: https://github.com/gnarvaja/eth-prototype
6
6
  Author: Guillermo M. Narvaja
@@ -33,6 +33,7 @@ Requires-Dist: pytest; extra == "testing"
33
33
  Requires-Dist: pytest-cov; extra == "testing"
34
34
  Requires-Dist: pytest-mock; extra == "testing"
35
35
  Requires-Dist: pytest-recording; extra == "testing"
36
+ Requires-Dist: responses; extra == "testing"
36
37
  Requires-Dist: setuptools; extra == "testing"
37
38
  Requires-Dist: web3[tester]==7.*; extra == "testing"
38
39
  Dynamic: license-file
@@ -1,5 +1,5 @@
1
- eth_prototype-1.3.3.dist-info/licenses/AUTHORS.rst,sha256=Ui-05yYXtDZxna6o1yNcfdm8Jt68UIDQ01osiLxlYlU,95
2
- eth_prototype-1.3.3.dist-info/licenses/LICENSE.txt,sha256=U_Q6_nDYDwZPIuhttHi37hXZ2qU2-HlV2geo9hzHXFw,1087
1
+ eth_prototype-1.3.5.dist-info/licenses/AUTHORS.rst,sha256=Ui-05yYXtDZxna6o1yNcfdm8Jt68UIDQ01osiLxlYlU,95
2
+ eth_prototype-1.3.5.dist-info/licenses/LICENSE.txt,sha256=U_Q6_nDYDwZPIuhttHi37hXZ2qU2-HlV2geo9hzHXFw,1087
3
3
  ethproto/__init__.py,sha256=YWkAFysBp4tZjLWWB2FFmp5yG23pUYhQvgQW9b3soXs,579
4
4
  ethproto/aa_bundler.py,sha256=W47fIA_w7orUu7yczfHPaHpUJRFh5op0YZHPgW3Iwik,17420
5
5
  ethproto/build_artifacts.py,sha256=whIXEqnh5f89UYu4Cb3KDigGV7juUCbDnfZkg-SYMKA,9878
@@ -7,12 +7,12 @@ ethproto/contracts.py,sha256=rNVbCK1hURy7lWKhzSdXgVWo3wx9O_Ghk-6PfgOsRNk,18662
7
7
  ethproto/defender_relay.py,sha256=05A8TfRZwiBhCpo924Pf9CjfKSir2Wvgg1p_asFxJbw,1777
8
8
  ethproto/w3wrappers.py,sha256=aA5yQ25d01s8gtWkGSxSEZlVRdq6JM1ceS3cfvSj4uM,22614
9
9
  ethproto/wadray.py,sha256=JBsu5KcyU9k70bDK03T2IY6qPVFO30WbYPhwrAHdXao,8262
10
- ethproto/wrappers.py,sha256=Mj2sgZmcLVmqsnNab6PqIXtNMMPyRVvUj2_8ButEd4w,17304
10
+ ethproto/wrappers.py,sha256=kqv6_1lPbRBlncaeMtXjas80GSxzErflN_KwawYyL3E,17725
11
11
  ethproto/test_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  ethproto/test_utils/factories.py,sha256=G8DnUDG_yThRxMTCkymzcjm9lR_ni0_ZmTsb3sEfIdI,1805
13
13
  ethproto/test_utils/hardhat.py,sha256=HzTqIznu6zVd_-doL96ftFJ235ktDCQen1QDQbNuwfM,2361
14
14
  ethproto/test_utils/vcr_utils.py,sha256=1FH2sgJlElSjWkJLuO3C7E2J-4HKyFvjAqkCnGRZJyk,797
15
- eth_prototype-1.3.3.dist-info/METADATA,sha256=79aBgMQ-TmEM3SO0Lhl9lG9mJeD8PEsqRD4me1VSqhQ,2650
16
- eth_prototype-1.3.3.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
17
- eth_prototype-1.3.3.dist-info/top_level.txt,sha256=Dl0X7m6N1hxeo4JpGpSNqWC2gtsN0731g-DL1J0mpjc,9
18
- eth_prototype-1.3.3.dist-info/RECORD,,
15
+ eth_prototype-1.3.5.dist-info/METADATA,sha256=e7dqeWwx0k7h3zIJLkhi_uKAt2X9KJFkHiZ8rMk97Fs,2695
16
+ eth_prototype-1.3.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
+ eth_prototype-1.3.5.dist-info/top_level.txt,sha256=Dl0X7m6N1hxeo4JpGpSNqWC2gtsN0731g-DL1J0mpjc,9
18
+ eth_prototype-1.3.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
ethproto/wrappers.py CHANGED
@@ -17,7 +17,9 @@ DEFAULT_PROVIDER = env.str("DEFAULT_PROVIDER", None)
17
17
 
18
18
  ETHERSCAN_TOKEN = env.str("ETHERSCAN_TOKEN", None)
19
19
  ETHERSCAN_DOMAIN = env.str("ETHERSCAN_DOMAIN", "api.etherscan.io")
20
- ETHERSCAN_URL = env.str("ETHERSCAN_URL", "https://{domain}/api?apikey={token}&")
20
+ ETHERSCAN_URL = env.str("ETHERSCAN_URL", "https://{domain}/v2/api?apikey={token}&chainid={chainid}&")
21
+ ETHERSCAN_CHAIN_ID = env.int("ETHERSCAN_CHAIN_ID", None)
22
+
21
23
  AMOUNT_DECIMALS = env.int("AMOUNT_DECIMALS", 18)
22
24
  AMOUNT_CLASSNAME = env.str("AMOUNT_CLASSNAME", None)
23
25
 
@@ -31,6 +33,10 @@ MAXUINT256 = 2**256 - 1
31
33
  _providers = {}
32
34
 
33
35
 
36
+ class EtherscanError(Exception):
37
+ ...
38
+
39
+
34
40
  def get_provider(provider_key=None):
35
41
  global DEFAULT_PROVIDER
36
42
  provider_key = provider_key or DEFAULT_PROVIDER
@@ -266,7 +272,8 @@ class BaseProvider(ABC):
266
272
  def get_etherscan_url(self):
267
273
  if ETHERSCAN_TOKEN is None:
268
274
  return None
269
- return ETHERSCAN_URL.format(token=ETHERSCAN_TOKEN, domain=ETHERSCAN_DOMAIN)
275
+ chain_id = ETHERSCAN_CHAIN_ID or self.w3.eth.chain_id
276
+ return ETHERSCAN_URL.format(token=ETHERSCAN_TOKEN, domain=ETHERSCAN_DOMAIN, chainid=chain_id)
270
277
 
271
278
  def get_first_block(self, eth_wrapper):
272
279
  etherscan_url = self.get_etherscan_url()
@@ -275,15 +282,18 @@ class BaseProvider(ABC):
275
282
  address = self.get_contract_address(eth_wrapper)
276
283
  url = (
277
284
  etherscan_url
278
- + f"&module=account&action=txlist&address={address}&startblock=0&"
285
+ + f"module=account&action=txlist&address={address}&startblock=0&"
279
286
  + "endblock=99999999&page=1&offset=10&sort=asc"
280
287
  )
281
288
  resp = requests.get(url)
282
289
  resp.raise_for_status()
283
290
  resp = resp.json()
284
- if not resp["result"]:
285
- return -1
286
- return int(resp["result"][0]["blockNumber"])
291
+ if resp.get("status") != "1":
292
+ raise EtherscanError(f"Failed to get first block from {etherscan_url}: {resp}")
293
+ try:
294
+ return int(resp["result"][0]["blockNumber"])
295
+ except (KeyError, TypeError):
296
+ raise EtherscanError(f"Failed to parse first block for {address}: {resp}")
287
297
 
288
298
  def get_contract_address(self, eth_wrapper):
289
299
  return eth_wrapper.contract.address