def mk_full_signature(code, *args, **kwargs): abi = parser.mk_full_signature(parser.parse(code)) # Add gas estimates for each function to ABI gas_estimates = gas_estimate(code) for idx, func in enumerate(abi): func_name = func['name'].split('(')[0] # Skip __init__, has no estimate if func_name in gas_estimates and func_name != '__init__': abi[idx]['gas'] = gas_estimates[func_name] return abi
def extract_sigs(sig_code): if sig_code['type'] == 'vyper': return parser.mk_full_signature(parser.parse_to_ast(sig_code['code']), sig_formatter=lambda x, y: x) elif sig_code['type'] == 'json': return mk_full_signature_from_json(sig_code['code']) else: raise Exception( ("Unknown interface signature type '{}' supplied. " "'vyper' & 'json' are supported").format(sig_code['type']))
def mk_full_signature(code, *args, **kwargs): abi = parser.mk_full_signature(parser.parse_to_ast(code), *args, **kwargs) # Add gas estimates for each function to ABI gas_estimates = gas_estimate(code, *args, **kwargs) for idx, func in enumerate(abi): func_name = func.get('name', '').split('(')[0] # Skip __init__, has no estimate if func_name in gas_estimates: abi[idx]['gas'] = gas_estimates[func_name] return abi
def mk_full_signature(code, *args, **kwargs): abi = parser.mk_full_signature(parser.parse_to_ast(code), *args, **kwargs) # Add gas estimates for each function to ABI gas_estimates = gas_estimate(code, *args, **kwargs) for func in abi: try: func_signature = func['name'] except KeyError: # constructor and fallback functions don't have a name continue func_name, _, _ = func_signature.partition('(') # This check ensures we skip __init__ since it has no estimate if func_name in gas_estimates: # TODO: mutation func['gas'] = gas_estimates[func_name] return abi
def extract_external_interface(code, contract_name): sigs = parser.mk_full_signature(parser.parse_to_ast(code), sig_formatter=lambda x, y: (x, y)) functions = [sig for sig, _ in sigs if isinstance(sig, FunctionSignature)] cname = os.path.basename(contract_name).split('.')[0].capitalize() out = "" offset = 4 * " " for idx, func in enumerate(functions): if idx == 0: out += "\n# External Contracts\ncontract %s:\n" % cname if not func.private and func.name != '__init__': out += offset + "def {name}({args}){ret}: {func_type}\n".format( name=func.name, args=", ".join([arg.name + ": " + str(arg.typ) for arg in func.args]), ret=render_return(func), func_type="constant" if func.const else "modifying", ) out += "\n" return out
def extract_interface_str(code, contract_name, interface_codes=None): sigs = parser.mk_full_signature( parser.parse_to_ast(code), sig_formatter=lambda x, y: (x, y), interface_codes=interface_codes, ) events = [sig for sig, _ in sigs if isinstance(sig, EventSignature)] functions = [sig for sig, _ in sigs if isinstance(sig, FunctionSignature)] out = "" # Print events. for idx, event in enumerate(events): if idx == 0: out += "# Events\n\n" out += "{event_name}: event({{{args}}})\n".format( event_name=event.name, args=", ".join( [arg.name + ": " + str(arg.typ) for arg in event.args])) # Print functions. def render_decorator(sig): o = "\n" if sig.const: o += "@constant\n" if not sig.private: o += "@public\n" return o for idx, func in enumerate(functions): if idx == 0: out += "\n# Functions\n" if not func.private and func.name != '__init__': out += "{decorator}def {name}({args}){ret}:\n pass\n".format( decorator=render_decorator(func), name=func.name, args=", ".join( [arg.name + ": " + str(arg.typ) for arg in func.args]), ret=render_return(func)) out += "\n" return out
def extract_sigs(code): sigs = parser.mk_full_signature(parser.parse_to_ast(code), sig_formatter=lambda x, y: x) return sigs