Skip to content

Instantly share code, notes, and snippets.

@krishan711
Created March 8, 2023 17:13
Show Gist options
  • Save krishan711/65eb09c9d46bf39dbe9dbd1310b4a7d4 to your computer and use it in GitHub Desktop.
Save krishan711/65eb09c9d46bf39dbe9dbd1310b4a7d4 to your computer and use it in GitHub Desktop.
Download all the files from an etherscan verified contract
import json
import asyncio
import os
import sys
from typing import Optional
import asyncclick as click
from core import logging
from core.requester import Requester
from core.util import file_util
ETHERSCAN_API_KEY = os.environ['ETHERSCAN_API_KEY']
@click.command
@click.option('-c', '--contract-address', 'contractAddress', required=True, type=str)
@click.option('-o', '--output-directory', 'outputDirectory', required=False, type=str)
async def main(contractAddress: str, outputDirectory: Optional[str]):
requester = Requester()
response = await requester.get(url=f'https://api.etherscan.io/api?module=contract&action=getsourcecode&address={contractAddress}&apikey={ETHERSCAN_API_KEY}')
responseDict = json.loads(response.content)
contractName = responseDict['result'][0]['ContractName']
outputDirectory = outputDirectory or f'./{contractName}'
await file_util.create_directory(directory=outputDirectory)
sourceCodeString = responseDict['result'][0]['SourceCode']
sourceCodeDict = json.loads(sourceCodeString)
for fileName, contract in sourceCodeDict.items():
print(fileName, len(contract['content']))
await file_util.write_file(filePath=os.path.join(outputDirectory, fileName), content=contract['content'])
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
asyncio.run(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment