def list_all_functions(project_dir: str, config_name: str): if config_name == '': config_name = DEFAULT_CONFIG try: wallet_file, invoke_config, password_config = handle_invoke_config(project_dir, config_name) except Exception as e: print(e.args) return try: abi_file_name = invoke_config['abi'] except KeyError: raise PunicaException(PunicaError.config_file_error) abi_dir_path = os.path.join(project_dir, 'contracts', 'build') try: dict_abi = read_abi(abi_dir_path, abi_file_name) except PunicaException as e: print(e.args) return try: func_in_abi_list = dict_abi['functions'] except KeyError: raise PunicaException(PunicaError.other_error('abi file is wrong')) func_name_in_abi_list = list() for func_in_abi_dict in func_in_abi_list: try: func_name = func_in_abi_dict['name'] except KeyError: raise PunicaException(PunicaError.other_error('abi file is wrong')) func_name_in_abi_list.append(func_name) print("All Functions:") invoke_function_list = invoke_config['functions'] for function_information in invoke_function_list: if function_information['operation'] in func_name_in_abi_list: print('\t', function_information['operation'])
def get_invoke_dict(abi_file_name: str, project_path: str = ''): if project_path == '': project_path = os.getcwd() if not os.path.isdir(project_path): raise PunicaException(PunicaError.dir_path_error) abi_dir_path = os.path.join(project_path, 'build') dict_abi = read_abi(abi_dir_path, abi_file_name) if len(dict_abi) == 0: raise PunicaException(PunicaError.abi_file_empty) return dict_abi
def invoke_all_function_in_list(wallet_file_name: str = '', project_dir_path: str = '', network: str = '', exec_func_str: str = '', config_name: str = '', pre_exec: str = ''): if project_dir_path == '': project_dir_path = os.getcwd() if not os.path.isdir(project_dir_path): raise PunicaException(PunicaError.dir_path_error) try: wallet_file, invoke_config, password_config = handle_invoke_config(project_dir_path, config_name) sleep_time = invoke_config.get('sleepTime', 6) except PunicaException as e: print(e.args) return ontology = OntologySdk() rpc_address = handle_network_config(project_dir_path, network) ontology.rpc.set_address(rpc_address) if wallet_file_name != '': ontology.wallet_manager = read_wallet(project_dir_path, wallet_file_name) else: ontology.wallet_manager = read_wallet(project_dir_path, wallet_file) try: abi_file_name = invoke_config['abi'] except KeyError: raise PunicaException(PunicaError.config_file_error) try: default_b58_payer_address = invoke_config['defaultPayer'] except KeyError: raise PunicaException(PunicaError.other_error("defaultPayer is null")) print('Running invocation: {}'.format(abi_file_name)) abi_dir_path = os.path.join(project_dir_path, 'contracts', 'build') dict_abi = read_abi(abi_dir_path, abi_file_name) try: hex_contract_address = dict_abi['hash'] except KeyError: raise PunicaException(PunicaError.abi_file_error) if not isinstance(hex_contract_address, str) or len(hex_contract_address) != 40: raise PunicaException(PunicaError.abi_file_error) contract = ontology.rpc.get_smart_contract(hex_contract_address) if contract == 'unknow contracts': print('Contract 0x{} hasn\'t been deployed in current network: {}'.format(hex_contract_address, network)) raise PunicaException(PunicaError.abi_file_error) contract_address = bytearray(binascii.a2b_hex(hex_contract_address)) contract_address.reverse() abi_info = Invoke.generate_abi_info(dict_abi) gas_price = invoke_config.get('gasPrice', 500) gas_limit = invoke_config.get('gasLimit', 21000000) invoke_function_list = invoke_config.get('functions', list()) invoke_function_name_list = list() for invoke_function in invoke_function_list: invoke_function_name_list.append(invoke_function['operation']) all_exec_func_list = list() if exec_func_str != '': all_exec_func_list = exec_func_str.split(',') if default_b58_payer_address != '': print('Unlock default payer account...') default_payer_acct = Invoke.get_account(ontology, password_config, default_b58_payer_address) if len(all_exec_func_list) == 0: all_exec_func_list = invoke_function_name_list for function_name in all_exec_func_list: if function_name not in invoke_function_name_list: print('there is not the function:', '\"' + function_name + '\"' + ' in the default-config file') continue print('Invoking ', function_name) abi_function = abi_info.get_function(function_name) if abi_function is None: raise PunicaException(PunicaError.other_error('\"' + function_name + '\"' + 'not found in the abi file')) function_information = None for invoke_function in invoke_function_list: if invoke_function['operation'] == function_name: function_information = invoke_function break if function_information is None: print('there is not the function: ', function_name) return try: paramList = function_information['args'] try: # params = Invoke.params_normalize(paramsList) params = Invoke.params_normalize2(paramList) params_list = Invoke.params_build(function_name, params) except PunicaException as e: print(e.args) return # if len(abi_function.parameters) == 0: # pass # elif len(abi_function.parameters) == 1: # abi_function.set_params_value(tuple(params)) # elif len(abi_function.parameters) == len(params): # abi_function.set_params_value(tuple(params)) # else: # abi_function = None # print('\tInvoke failed, params mismatching with the abi file') if abi_function is not None: if (function_information['preExec'] and pre_exec == '') or (pre_exec == 'true'): tx = Invoke.generate_unsigned_invoke_transaction(contract_address, params_list, bytearray(), gas_price, gas_limit) result = ontology.rpc.send_raw_transaction_pre_exec(tx) print('Invoke successful') if isinstance(result, list): print('Invoke result: {}'.format(result)) # print('Invoke result: {}'.format(list(map(lambda r: "0x" + r, result)))) else: if result is None: print('Invoke result: {}'.format('')) else: print('Invoke result: {}'.format(result)) else: b58_payer_address = function_information.get('payer', default_b58_payer_address) if default_b58_payer_address != '' and b58_payer_address == default_b58_payer_address: payer_acct = default_payer_acct else: payer_acct = Invoke.get_account(ontology, password_config, b58_payer_address) if payer_acct is None or payer_acct == '': print('defaultPayer is None in invokeConfig') return tx = Invoke.generate_unsigned_invoke_transaction(contract_address, params_list, payer_acct.get_address().to_bytes(), gas_price, gas_limit) ontology.add_sign_transaction(tx, payer_acct) dict_signers = function_information.get('signature', dict()) signer_list = list() if len(dict_signers) != 0: print('Unlock signers account...') for b58_signer_address in dict_signers['signers']: if b58_signer_address == b58_payer_address: signer_list.append(payer_acct) continue else: signer = Invoke.get_account(ontology, password_config, b58_signer_address) signer_list.append(signer) if dict_signers['m'] == 1: for signer in signer_list: ontology.add_sign_transaction(tx, signer) elif dict_signers['m'] > 1: list_public_key = list() for pubkey in dict_signers['publicKeys']: list_public_key.append(bytearray.fromhex(pubkey)) for signer in signer_list: ontology.add_multi_sign_transaction(tx, dict_signers['m'], list_public_key, signer) ontology.rpc.set_address(rpc_address) try: tx_hash = ontology.rpc.send_raw_transaction(tx) time.sleep(sleep_time) if tx_hash == '': print('Invoke failed...') print('txHash: 0x{}'.format(tx.hash256_explorer())) else: print('Invoke successful') print('txHash: 0x{}'.format(tx_hash)) except SDKException as e: print('txHash: 0x{}'.format(tx.hash256_explorer())) print('\tInvoke failed, {}'.format(e.args[1].replace('Other Error, ', ''))) except (KeyError, RuntimeError) as e: print('\tInvoke failed,', e.args)
def get_abi_info(abi_dir_path: str): abi_dict = read_abi(abi_dir_path, os.path.basename(abi_dir_path)) return Invoke.generate_abi_info(abi_dict)
def invoke_all_function_in_list(wallet_file_name: str = '', project_dir_path: str = '', network: str = '', exec_func_str: str = ''): if project_dir_path == '': project_dir_path = os.getcwd() if not os.path.isdir(project_dir_path): raise PunicaException(PunicaError.dir_path_error) ontology = OntologySdk() wallet_dir_path = os.path.join(project_dir_path, 'wallet') ontology.wallet_manager = read_wallet(wallet_dir_path, wallet_file_name) rpc_address = handle_network_config(project_dir_path, network) ontology.rpc.set_address(rpc_address) invoke_config, password_config = handle_invoke_config(project_dir_path) try: abi_file_name = invoke_config['abi'] except KeyError: raise PunicaException(PunicaError.config_file_error) try: default_b58_payer_address = invoke_config['defaultPayer'] except KeyError: raise PunicaException(PunicaError.config_file_error) print('Running invocation: {}'.format(abi_file_name)) abi_dir_path = os.path.join(project_dir_path, 'contracts', 'build') dict_abi = read_abi(abi_dir_path, abi_file_name) try: hex_contract_address = dict_abi['hash'] except KeyError: raise PunicaException(PunicaError.abi_file_error) if not isinstance(hex_contract_address, str) or len(hex_contract_address) != 40: raise PunicaException(PunicaError.abi_file_error) contract = ontology.rpc.get_smart_contract(hex_contract_address) if contract == 'unknow contracts': print('Contract 0x{} hasn\'t been deployed in current network: {}'.format(hex_contract_address, network)) raise PunicaException(PunicaError.abi_file_error) contract_address = bytearray(binascii.a2b_hex(hex_contract_address)) contract_address.reverse() abi_info = Invoke.generate_abi_info(dict_abi) gas_price = invoke_config.get('gasPrice', 500) gas_limit = invoke_config.get('gasLimit', 21000000) invoke_function_dict = invoke_config.get('Functions', dict()) all_exec_func = list() if exec_func_str != '': all_exec_func = exec_func_str.split(',') for exec_func in all_exec_func: if exec_func not in invoke_function_dict.keys(): raise PunicaError.other_error('there is not the function :', exec_func + ' in the abi file') print('Unlock default payer account...') if password_config[default_b58_payer_address] != '': default_payer_acct = ontology.wallet_manager.get_account(default_b58_payer_address, password_config[default_b58_payer_address]) else: default_payer_acct = Invoke.unlock_account(default_b58_payer_address, wallet_manager) for function_key in invoke_function_dict: if len(all_exec_func) != 0 and function_key not in all_exec_func: continue print('Invoking {}...'.format(function_key)) abi_function = abi_info.get_function(function_key) function_information = invoke_function_dict[function_key] try: params = function_information['params'] print("params: ", params) params = Invoke.params_normalize(params) if len(abi_function.parameters) == 0: pass elif len(abi_function.parameters) == 1: abi_function.set_params_value((params,)) elif len(abi_function.parameters) == len(params): abi_function.set_params_value(tuple(params)) else: abi_function = None print('\tInvoke failed, params mismatching with the abi file') if abi_function is not None: if function_information['preExec']: tx = Invoke.generate_unsigned_invoke_transaction(contract_address, abi_function, bytearray(), gas_price, gas_limit) result = ontology.rpc.send_raw_transaction_pre_exec(tx) print('\tInvoke successful...') print('\t\t... Invoke result: {}'.format(result)) else: b58_payer_address = function_information.get('payer', default_b58_payer_address) if b58_payer_address == default_b58_payer_address: payer_acct = default_payer_acct else: if password_config[b58_payer_address] != '': payer_acct = ontology.wallet_manager.get_account(b58_payer_address, password_config[b58_payer_address]) else: payer_acct = Invoke.unlock_account(b58_payer_address, wallet_manager) tx = Invoke.generate_unsigned_invoke_transaction(contract_address, abi_function, payer_acct.get_address().to_array(), gas_price, gas_limit) ontology.add_sign_transaction(tx, payer_acct) dict_signers = function_information.get('signers', dict()) signer_list = list() if len(dict_signers) != 0: print('Unlock signers account...') for b58_signer_address in dict_signers['signer']: if b58_signer_address == b58_payer_address: pass else: if password_config[b58_signer_address] != '': signer = ontology.wallet_manager.get_account(b58_signer_address, password_config[b58_signer_address]) else: signer = Invoke.unlock_account(b58_signer_address, wallet_manager) signer_list.append(signer) if dict_signers['m'] == 1: for signer in signer_list: ontology.add_sign_transaction(tx, signer) elif dict_signers['m'] > 1: list_public_key = list() for pubkey in dict_signers['publicKeys']: list_public_key.append(bytearray.fromhex(pubkey)) for signer in signer_list: ontology.add_multi_sign_transaction(tx, dict_signers['m'], list_public_key, signer) ontology.rpc.set_address(rpc_address) try: tx_hash = ontology.rpc.send_raw_transaction(tx) if tx_hash == '': print('\tInvoke failed...') else: print('\tInvoke successful...') print('\t\t... txHash: 0x{}'.format(tx_hash)) except SDKException as e: print('\tInvoke failed, {}'.format(e.args[1].replace('Other Error, ', ''))) except (KeyError, RuntimeError) as e: print('\tInvoke failed,', e.args)
def get_abi_info(abi_dir_path: str): abi_dict = read_abi( os.path.abspath(os.path.join(abi_dir_path, os.pardir)), os.path.basename(abi_dir_path)) return Invoke.generate_abi_info(abi_dict)