def decode_contract_call(contract_abi: list, call_data: str): call_data_bin = decode_hex(call_data) method_signature = call_data_bin[:4] for description in contract_abi: if description.get('type') != 'function': continue method_name = normalize_abi_method_name(description['name']) arg_types = [item['type'] for item in description['inputs']] method_id = get_abi_method_id(method_name, arg_types) if zpad(encode_int(method_id), 4) == method_signature: args = decode_abi(arg_types, call_data_bin[4:]) return method_name, args
def encode_calldata(func_name, arg_types, args): """ :param func_name: :param arg_types: :param args: :return: """ mid = method_id(func_name, arg_types) function_selector = zpad(encode_int(mid), 4) args = encode_abi(arg_types, args) return "0x" + function_selector.hex() + args.hex()
def encode_calldata(func_name, arg_types, args): mid = method_id(func_name, arg_types) function_selector = zpad(encode_int(mid), 4) args = encode_abi(arg_types, args) return "0x" + function_selector + args