1818ETHERSCAN_TOKEN = env .str ("ETHERSCAN_TOKEN" , None )
1919ETHERSCAN_DOMAIN = env .str ("ETHERSCAN_DOMAIN" , "api.etherscan.io" )
2020ETHERSCAN_URL = env .str ("ETHERSCAN_URL" , "https://{domain}/v2/api?apikey={token}&chainid={chainid}&" )
21+ ETHERSCAN_CHAIN_ID = env .int ("ETHERSCAN_CHAIN_ID" , None )
22+
2123AMOUNT_DECIMALS = env .int ("AMOUNT_DECIMALS" , 18 )
2224AMOUNT_CLASSNAME = env .str ("AMOUNT_CLASSNAME" , None )
2325
3133_providers = {}
3234
3335
36+ class EtherscanError (Exception ):
37+ ...
38+
39+
3440def get_provider (provider_key = None ):
3541 global DEFAULT_PROVIDER
3642 provider_key = provider_key or DEFAULT_PROVIDER
@@ -266,9 +272,8 @@ def get_events(self, eth_wrapper, event_name, filter_kwargs={}):
266272 def get_etherscan_url (self ):
267273 if ETHERSCAN_TOKEN is None :
268274 return None
269- return ETHERSCAN_URL .format (
270- token = ETHERSCAN_TOKEN , domain = ETHERSCAN_DOMAIN , chainid = self .w3 .eth .chain_id
271- )
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 )
272277
273278 def get_first_block (self , eth_wrapper ):
274279 etherscan_url = self .get_etherscan_url ()
@@ -283,9 +288,12 @@ def get_first_block(self, eth_wrapper):
283288 resp = requests .get (url )
284289 resp .raise_for_status ()
285290 resp = resp .json ()
286- if not resp ["result" ]:
287- return - 1
288- 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 } " )
289297
290298 def get_contract_address (self , eth_wrapper ):
291299 return eth_wrapper .contract .address
0 commit comments