Exemplo n.º 1
0
 def test_handle_network_config(self):
     config_dir_path = os.path.join(os.getcwd(), 'test_file', 'test_config')
     rpc_address = handle_network_config(config_dir_path)
     self.assertEqual('http://127.0.0.1:7545', rpc_address)
     rpc_address = handle_network_config(config_dir_path, 'test')
     self.assertEqual('http://polaris3.ont.io:20336', rpc_address)
     self.assertRaises(PunicaException, handle_network_config,
                       config_dir_path, 'testNet')
     config_dir_path = os.getcwd()
     self.assertRaises(PunicaException, handle_network_config,
                       config_dir_path)
Exemplo n.º 2
0
 def withdraw_ong(project_dir_path: str, claimer: str, to: str, amount, gas_limit, gas_price, network):
     if project_dir_path == '':
         project_dir_path = os.getcwd()
     if not os.path.isdir(project_dir_path):
         raise PunicaException(PunicaError.dir_path_error)
     rpc_address = handle_network_config(project_dir_path, network)
     sdk = OntologySdk()
     sdk.rpc.set_address(rpc_address)
     sdk.wallet_manager = Account.get_wallet_manager(project_dir_path)
     if len(sdk.wallet_manager.wallet_in_mem.accounts) == 0:
         print('there is not account in the wallet.json')
         return
     has_sender = False
     for acc in sdk.wallet_manager.wallet_in_mem.accounts:
         if claimer == acc.address:
             has_sender = True
             break
     if not has_sender:
         print('there is not sender in the wallet.json')
         return
     claimer_pwd = getpass.getpass('Please input claimer password: '******'tx_hash: ', tx_hash)
Exemplo n.º 3
0
 def transfer(project_dir_path, asset: str, sender, to, amount, gas_price, gas_limit, network):
     if asset == '' or asset.lower() != 'ont' and asset.lower() != 'ong':
         print('asset should be ont or ong')
         return
     if project_dir_path == '':
         project_dir_path = os.getcwd()
     if not os.path.isdir(project_dir_path):
         raise PunicaException(PunicaError.dir_path_error)
     rpc_address = handle_network_config(project_dir_path, network)
     sdk = OntologySdk()
     sdk.set_rpc(rpc_address)
     wallet_manager = Account.get_wallet_manager(project_dir_path)
     if len(wallet_manager.wallet_in_mem.accounts) == 0:
         print('there is not account in the wallet.json')
         return
     has_sender = False
     for acc in wallet_manager.wallet_in_mem.accounts:
         if sender == acc.address:
             has_sender = True
             break
     if not has_sender:
         print('there is not sender in the wallet.json')
         return
     sender_account = Invoke.unlock_account(sender, wallet_manager)
     if sender_account is None:
         return
     tx_hash = sdk.native_vm().asset().send_transfer(asset, sender_account, to, amount, sender_account,
                                                     gas_limit, gas_price)
     print('tx_hash: ', tx_hash)
Exemplo n.º 4
0
 def deploy_smart_contract(project_dir: str = '',
                           network: str = '',
                           avm_file_name: str = '',
                           wallet_file_name: str = ''):
     if project_dir == '':
         project_dir = os.getcwd()
     avm_dir_path = os.path.join(project_dir, 'contracts', 'build')
     rpc_address = handle_network_config(project_dir, network)
     hex_avm_code, avm_file_name = read_avm(avm_dir_path, avm_file_name)
     if hex_avm_code == '':
         raise PunicaException(PunicaError.avm_file_empty)
     hex_contract_address = Deploy.generate_contract_address(
         avm_dir_path, avm_file_name)
     ontology = OntologySdk()
     ontology.rpc.set_address(rpc_address)
     contract = ontology.rpc.get_smart_contract(hex_contract_address)
     print('Running deployment: {}'.format(avm_file_name))
     if contract == 'unknow contracts':
         print('\tDeploying...')
         print('\t... 0x{}'.format(hex_avm_code[:64]))
         tx = Deploy.generate_signed_deploy_transaction(
             hex_avm_code, project_dir, wallet_file_name)
         ontology.rpc.set_address(rpc_address)
         tx_hash = ontology.rpc.send_raw_transaction(tx)
         return tx_hash
     else:
         print('\tDeploy failed...')
         print('\tContract has been deployed...')
         print('\tContract address is 0x{}...'.format(hex_contract_address))
Exemplo n.º 5
0
 def query_unbound_ong(project_dir_path, address, network):
     if project_dir_path == '':
         project_dir_path = os.getcwd()
     if not os.path.isdir(project_dir_path):
         raise PunicaException(PunicaError.dir_path_error)
     rpc_address = handle_network_config(project_dir_path, network)
     sdk = OntologySdk()
     sdk.rpc.set_address(rpc_address)
     balance = sdk.native_vm().asset().query_unbound_ong(address)
     print(address + '  UnboundOng: ', balance)
Exemplo n.º 6
0
 def balance_of(project_dir_path: str, asset: str, address: str, network: str):
     if asset == '' or asset.lower() != 'ont' and asset.lower() != 'ong':
         print(asset, ' asset should be ont or ong')
         return
     if project_dir_path == '':
         project_dir_path = os.getcwd()
     if not os.path.isdir(project_dir_path):
         raise PunicaException(PunicaError.dir_path_error)
     rpc_address = handle_network_config(project_dir_path, network)
     sdk = OntologySdk()
     sdk.rpc.set_address(rpc_address)
     balance = sdk.native_vm().asset().query_balance(asset, address)
     print(address + '  Balance: ', balance)
Exemplo n.º 7
0
 def check_deploy_state(tx_hash, project_path: str = '', network: str = ''):
     if project_path == '':
         project_path = os.getcwd()
     if not os.path.isdir(project_path):
         raise PunicaException(PunicaError.dir_path_error)
     rpc_address = handle_network_config(project_path, network, False)
     ontology = OntologySdk()
     ontology.rpc.set_address(rpc_address)
     time.sleep(6)
     tx = ontology.rpc.get_raw_transaction(tx_hash)
     if tx == 'unknown transaction':
         return False
     else:
         return True
Exemplo n.º 8
0
 def deploy_smart_contract(project_dir: str = '',
                           network: str = '',
                           avm_file_name: str = '',
                           wallet_file_name: str = '',
                           config: str = ''):
     if project_dir == '':
         project_dir = os.getcwd()
     if avm_file_name != '':
         avm_path = os.path.join(project_dir, avm_file_name)
         if os.path.exists(avm_path):
             avm_dir_path = os.path.dirname(avm_path)
             avm_file_name = os.path.basename(avm_path)
         else:
             avm_dir_path = os.path.join(project_dir, 'contracts', 'build')
     else:
         avm_dir_path = os.path.join(project_dir, 'contracts', 'build')
     if not os.path.exists(avm_dir_path):
         print('there is not the avm file, please compile first')
         return
     rpc_address = handle_network_config(project_dir, network)
     try:
         hex_avm_code, avm_file_name = read_avm(avm_dir_path, avm_file_name)
     except PunicaException as e:
         print(e.args)
         return
     if hex_avm_code == '':
         raise PunicaException(PunicaError.avm_file_empty)
     hex_contract_address = Deploy.generate_contract_address(
         avm_dir_path, avm_file_name)
     ontology = OntologySdk()
     ontology.rpc.set_address(rpc_address)
     contract = ontology.rpc.get_smart_contract(hex_contract_address)
     if contract == 'unknow contract' or contract == 'unknow contracts':
         try:
             tx = Deploy.generate_signed_deploy_transaction(
                 hex_avm_code, project_dir, wallet_file_name, config)
         except PunicaException as e:
             print('\tDeploy failed...')
             print('\t', e.args)
             return
         print('Running deployment: {}'.format(avm_file_name))
         print('\tDeploying...')
         ontology.rpc.set_address(rpc_address)
         tx_hash = ontology.rpc.send_raw_transaction(tx)
         return tx_hash
     else:
         print('\tDeploy failed...')
         print('\tContract has been deployed...')
         print('\tContract address is {}'.format(hex_contract_address))
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
    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)