122 lines
4.0 KiB
Python
122 lines
4.0 KiB
Python
# standard imports
|
|
import os
|
|
import logging
|
|
import sys
|
|
import json
|
|
import requests
|
|
import importlib
|
|
|
|
# local imports
|
|
from cic.writers import OutputWriter
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
CONTRACTS = [
|
|
{
|
|
"url": "https://gitlab.com/cicnet/eth-erc20/-/raw/master/python/giftable_erc20_token/data/GiftableToken",
|
|
"name": "Giftable Token",
|
|
},
|
|
{
|
|
"url": "https://gitlab.com/cicnet/erc20-demurrage-token/-/raw/master/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap",
|
|
"name": "Demurrage Token Single No Cap",
|
|
},
|
|
]
|
|
|
|
# Download File from Url
|
|
def download_file(url: str, directory: str, filename=None) -> (str, bytes):
|
|
os.makedirs(directory, exist_ok=True)
|
|
filename = filename if filename else url.split("/")[-1]
|
|
path = os.path.join(directory, filename)
|
|
if not os.path.exists(path):
|
|
log.debug(f"Downloading {filename}")
|
|
r = requests.get(url, allow_redirects=True)
|
|
open(path, "wb").write(r.content)
|
|
return path
|
|
return path
|
|
|
|
def get_contract_args(data: list):
|
|
for item in data:
|
|
if item["type"] == "constructor":
|
|
return item["inputs"]
|
|
raise Exception("No constructor found in contract")
|
|
|
|
def select_contract():
|
|
print("Contracts:")
|
|
print("\t C - Custom (path/url to contract)")
|
|
for idx, contract in enumerate(CONTRACTS):
|
|
print(f"\t {idx} - {contract['name']}")
|
|
|
|
val = input("Select contract (C,0,1..): ")
|
|
if val.isdigit() and int(val) < len(CONTRACTS):
|
|
contract = CONTRACTS[int(val)]
|
|
directory = f"./contracts/{contract['name']}"
|
|
bin_path = os.path.abspath(download_file(contract["url"] + ".bin", directory))
|
|
json_path = download_file(contract["url"] + ".json", directory)
|
|
|
|
elif val == "C":
|
|
possible_bin_location = input("Enter a path or url to a contract.bin: ")
|
|
if possible_bin_location.startswith('http'):
|
|
# possible_bin_location is url
|
|
bin_path = download_file(possible_bin_location, directory)
|
|
else:
|
|
# possible_bin_location is path
|
|
if os.path.exists(possible_bin_location):
|
|
bin_path = os.path.abspath(possible_bin_location)
|
|
else:
|
|
raise Exception(f"File {possible_bin_location} does not exist")
|
|
|
|
possible_json_path = val.replace(".bin", ".json")
|
|
if os.path.exists(possible_json_path):
|
|
json_path = possible_json_path
|
|
else:
|
|
print("Invalid selection")
|
|
sys.exit(1)
|
|
contract_extra_args = []
|
|
contract_extra_args_types = []
|
|
|
|
if os.path.exists(json_path):
|
|
with open(json_path, encoding="utf-8") as f:
|
|
json_data = json.load(f)
|
|
for contract_arg in get_contract_args(json_data):
|
|
arg_name = contract_arg.get("name")
|
|
arg_type = contract_arg.get("type")
|
|
if arg_name not in ["_decimals", "_name", "_symbol"]:
|
|
val = input(f"Enter value for {arg_name} ({arg_type}): ")
|
|
contract_extra_args.append(val)
|
|
if arg_type == "uint128":
|
|
contract_extra_args_types.append("uint256")
|
|
else:
|
|
contract_extra_args_types.append(arg_type)
|
|
|
|
return {
|
|
"bin_path": bin_path,
|
|
"json_path": json_path,
|
|
"extra_args": contract_extra_args,
|
|
"extra_args_types": contract_extra_args_types,
|
|
}
|
|
|
|
|
|
Writers = {
|
|
"meta": OutputWriter,
|
|
"attachment": OutputWriter,
|
|
"proof": OutputWriter,
|
|
"ext": OutputWriter,
|
|
}
|
|
|
|
def init_writers_from_config(config) -> Writers:
|
|
writers: Writers = {
|
|
"meta": None,
|
|
"attachment": None,
|
|
"proof": None,
|
|
"ext": None,
|
|
}
|
|
for key in writers:
|
|
writer_config_name = f"CIC_CORE_{key.upper()}_WRITER"
|
|
(module_name, attribute_name) = config.get(writer_config_name).rsplit(".", maxsplit=1)
|
|
mod = importlib.import_module(module_name)
|
|
writer = getattr(mod, attribute_name)
|
|
writers[key] = writer
|
|
|
|
return writers
|