From 24fcc61ad5b207e43903ef3c1a4ecf2b820de382 Mon Sep 17 00:00:00 2001 From: Neeraj Kashyap Date: Tue, 7 Dec 2021 03:56:55 -0800 Subject: [PATCH] Added a utility to get a constructor from ABI Bumped version in preparation of this change. --- moonworm/generators/basic.py | 14 ++++++++++++++ moonworm/generators/brownie.py | 13 ++++--------- moonworm/version.py | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/moonworm/generators/basic.py b/moonworm/generators/basic.py index 9fbb2c8..21c96b2 100644 --- a/moonworm/generators/basic.py +++ b/moonworm/generators/basic.py @@ -31,6 +31,20 @@ except Exception as e: logging.warn(e) +DEFAULT_CONSTRUCTOR = { + "inputs": [], + "stateMutability": "payable", + "type": "constructor", +} + + +def get_constructor(abi: List[Dict[str, Any]]) -> Dict[str, Any]: + for item in abi: + if item["type"] == "constructor": + return item + return DEFAULT_CONSTRUCTOR + + def format_code(code: str) -> str: formatted_code = black.format_str(code, mode=black.mode.Mode()) return formatted_code diff --git a/moonworm/generators/brownie.py b/moonworm/generators/brownie.py index 76ba5d6..e3f7daa 100644 --- a/moonworm/generators/brownie.py +++ b/moonworm/generators/brownie.py @@ -6,7 +6,7 @@ import libcst as cst from libcst._nodes.statement import SimpleStatementLine from ..version import MOONWORM_VERSION -from .basic import format_code, function_spec, make_annotation +from .basic import format_code, function_spec, get_constructor, make_annotation BROWNIE_INTERFACE_TEMPLATE_PATH = os.path.join( os.path.dirname(__file__), "brownie_contract.py.template" @@ -63,15 +63,9 @@ def generate_brownie_contract_class( ), ) - contract_constructors = [c for c in abi if c["type"] == "constructor"] - if len(contract_constructors) == 1: - contract_constructor = contract_constructors[0] - elif len(contract_constructors) == 0: - contract_constructor = {"inputs": []} - else: - raise ValueError("Multiple constructors found in ABI") - + contract_constructor = get_constructor(abi) contract_constructor["name"] = "constructor" + class_functions = ( [class_constructor] + [ @@ -445,6 +439,7 @@ def generate_cli_generator( cst.parse_statement("parser.set_defaults(func=lambda _: parser.print_help())"), cst.parse_statement("subcommands = parser.add_subparsers()"), ] + for item in abi: if item["type"] != "function": continue diff --git a/moonworm/version.py b/moonworm/version.py index 76899e4..46e4e07 100644 --- a/moonworm/version.py +++ b/moonworm/version.py @@ -1 +1 @@ -MOONWORM_VERSION = "0.1.1" +MOONWORM_VERSION = "0.1.2"