22import json
33import os
44from time import sleep
5+ import logging
56
67import requests as rq
78
89
910def make_dir (path ):
10- folders = []
11- while not os .path .isdir (path ):
12- path , suffix = os .path .split (path )
13- folders .append (suffix )
14- for folder in folders [::- 1 ]:
15- path = os .path .join (path , folder )
16- os .mkdir (path )
11+ os .makedirs (path , exist_ok = True )
1712
1813
1914def is_json (myjson ):
@@ -36,14 +31,13 @@ def crawl_contract(rootdir, c_address):
3631 root = rootdir
3732 contract_address = c_address
3833 # contract_name = row[2]
39- curl_link = (
40- "https://api.etherscan.io/api?module=contract&action=getsourcecode&address="
41- + c_address
42- + "&apikey=HPB1MEZ5YEJ7GZJF7ASQDJ4MPU7YEUTIUT"
43- )
44- print (curl_link )
45-
46- output = rq .get (curl_link , headers = send_headers )
34+ api_key = os .getenv ("ETHERSCAN_API_KEY" )
35+ params = {"module" : "contract" , "action" : "getsourcecode" , "address" : c_address }
36+ if api_key :
37+ params ["apikey" ] = api_key
38+ else :
39+ logging .warning ("ETHERSCAN_API_KEY not set; proceeding without API key" )
40+ output = rq .get ("https://api.etherscan.io/api" , headers = send_headers , params = params )
4741
4842 # sleep to avoid ban
4943 sleep (2 )
@@ -54,34 +48,27 @@ def crawl_contract(rootdir, c_address):
5448 if is_json (source_code ):
5549 res = json .loads (source_code )
5650 for key in res :
57- print (key )
58- sol_file = open (
59- root + contract_address + "/" + key , "w" , encoding = "UTF-8"
60- )
61- sol_file .write (res [key ]["content" ])
62- sol_file .close ()
51+ logging .debug (key )
52+ with open (root + contract_address + "/" + key , "w" , encoding = "UTF-8" ) as sol_file :
53+ sol_file .write (res [key ]["content" ])
6354 elif source_code [0 ] == source_code [1 ] == "{" :
6455 new_code = source_code [1 :- 1 ]
6556 res = json .loads (new_code )
6657 sources = res ["sources" ]
6758 for name in sources :
68- print (name )
59+ logging . debug (name )
6960 _dir , _file = os .path .split (root + contract_address + "/" + name )
70- print (_dir )
61+ logging . debug (_dir )
7162 make_dir (_dir )
72- sol_file = open (
73- root + contract_address + "/" + name , "w" , encoding = "UTF-8"
74- )
75- sol_file .write (sources [name ]["content" ])
76- sol_file .close ()
63+ with open (root + contract_address + "/" + name , "w" , encoding = "UTF-8" ) as sol_file :
64+ sol_file .write (sources [name ]["content" ])
7765 else :
78- sol_file = open (
66+ with open (
7967 root + contract_address + "/" + contract_address + ".sol" ,
8068 "w" ,
8169 encoding = "UTF-8" ,
82- )
83- sol_file .write (source_code )
84- sol_file .close ()
70+ ) as sol_file :
71+ sol_file .write (source_code )
8572
8673
8774if __name__ == "__main__" :
0 commit comments