def test_notify(self): hex_contract_address = '6690b6638251be951dded8c537678200a470c679' notify_args = InvokeFunction('testHello') bool_msg = True int_msg = 1 bytes_msg = b'Hello' str_msg = 'Hello' bytes_address_msg = acct1.get_address().to_bytes() notify_args.set_params_value(bool_msg, int_msg, bytes_msg, str_msg, bytes_address_msg) tx_hash = self.send_tx(hex_contract_address, None, acct1, notify_args) if len(tx_hash) == 0: return time.sleep(randint(10, 15)) event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) states = Event.get_states_by_contract_address(event, hex_contract_address) states[0] = Data.to_utf8_str(states[0]) self.assertEqual('testHello', states[0]) states[1] = Data.to_bool(states[1]) self.assertEqual(bool_msg, states[1]) states[2] = Data.to_int(states[2]) self.assertEqual(int_msg, states[2]) states[3] = Data.to_bytes(states[3]) self.assertEqual(bytes_msg, states[3]) states[4] = Data.to_utf8_str(states[4]) self.assertEqual(str_msg, states[4]) states[5] = Data.to_b58_address(states[5]) self.assertEqual(acct1.get_address_base58(), states[5])
def test_notify_pre_exec(self): bool_msg = True int_msg = 1024 list_msg = [1, 1024, 2048] str_msg = 'Hello' bytes_address_msg = acct1.get_address().to_bytes() hex_contract_address = '4855735ffadad50e7000d73e1c4e96f38d225f70' func = InvokeFunction('notify_args') func.set_params_value(bool_msg, int_msg, list_msg, str_msg, bytes_address_msg) sdk.rpc.set_address('http://polaris5.ont.io:20336') response = sdk.rpc.send_neo_vm_tx_pre_exec(hex_contract_address, func) self.assertEqual(1, response['State']) self.assertEqual(20000, response['Gas']) notify = response['Notify'][0] self.assertEqual(hex_contract_address, notify['ContractAddress']) states = notify['States'] states[0] = Data.to_utf8_str(states[0]) self.assertEqual('notify args', states[0]) states[1] = Data.to_bool(states[1]) self.assertEqual(True, states[1]) states[2] = Data.to_int(states[2]) self.assertEqual(int_msg, states[2]) states[3] = Data.to_int_list(states[3]) self.assertEqual(list_msg, states[3]) states[4] = Data.to_utf8_str(states[4]) self.assertEqual(str_msg, states[4]) states[5] = Data.to_b58_address(states[5]) self.assertEqual(acct1.get_address_base58(), states[5])
def test_dict_in_ctx(self): hex_contract_address = '6690b6638251be951dded8c537678200a470c679' bool_value = True int_value = 100 str_value = 'value3' dict_value = {'key': 'value'} list_value = [1, 10, 1024, [1, 10, 1024, [1, 10, 1024]]] dict_msg = { 'key': dict_value, 'key1': int_value, 'key2': str_value, 'key3': bool_value, 'key4': list_value } func = InvokeFunction('testMapInMap') func.set_params_value(dict_msg) tx_hash = sdk.rpc.send_neo_vm_transaction(hex_contract_address, None, acct1, self.gas_price, self.gas_limit, func, False) time.sleep(randint(10, 15)) event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) states = Event.get_states_by_contract_address(event, hex_contract_address) states[0] = Data.to_utf8_str(states[0]) self.assertEqual('mapInfo', states[0]) states[1] = Data.to_dict(states[1]) self.assertTrue(isinstance(states[1], dict))
def test_get_dict(self, key): func = InvokeFunction('testGetMap') func.set_params_value(key) tx = self.__sdk.neo_vm.make_invoke_transaction( self.__hex_contract_address, func) value = self.__sdk.rpc.send_raw_transaction_pre_exec(tx) return value
def test_struct_list_and_str_pre_exec(self, struct_list, str_msg): func = InvokeFunction('testStructListAndStr') func.set_params_value(struct_list, str_msg) tx = self.__sdk.neo_vm.make_invoke_transaction( self.__hex_contract_address, func) value = self.__sdk.rpc.send_raw_transaction_pre_exec(tx) return value.get('Result', list())
def new_allowance_tx(self, owner: Union[str, bytes, Address], spender: Union[str, bytes, Address]) -> InvokeTransaction: func = InvokeFunction('allowance') func.set_params_value(Address.b58decode(owner), Address.b58decode(spender)) tx = InvokeTransaction() tx.add_invoke_code(self._contract_address, func) return tx
def test_transfer_multi_args_0(self): transfer_1 = [ acct1.get_address().to_bytes(), acct2.get_address().to_bytes(), 10 ] transfer_2 = [ acct2.get_address().to_bytes(), acct3.get_address().to_bytes(), 100 ] transfer_list = [transfer_1, transfer_2] hex_contract_address = 'ca91a73433c016fbcbcf98051d385785a6a5d9be' func = InvokeFunction('transfer_multi') func.set_params_value(transfer_list) tx_hash = sdk.rpc.send_neo_vm_transaction(hex_contract_address, acct1, acct2, self.gas_price, self.gas_limit, func, False) self.assertEqual(64, len(tx_hash)) time.sleep(randint(10, 15)) event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) states = Event.get_states_by_contract_address(event, hex_contract_address) states[0] = Data.to_utf8_str(states[0]) states[1][0][0] = Data.to_b58_address(states[1][0][0]) self.assertEqual(acct1.get_address_base58(), states[1][0][0]) states[1][0][1] = Data.to_b58_address(states[1][0][1]) self.assertEqual(acct2.get_address_base58(), states[1][0][1]) states[1][0][2] = Data.to_int(states[1][0][2]) self.assertEqual(10, states[1][0][2]) states[1][1][0] = Data.to_b58_address(states[1][1][0]) self.assertEqual(acct2.get_address_base58(), states[1][1][0]) states[1][1][1] = Data.to_b58_address(states[1][1][1]) self.assertEqual(acct3.get_address_base58(), states[1][1][1]) states[1][1][2] = Data.to_int(states[1][1][2]) self.assertEqual(100, states[1][1][2])
def new_revoke_tx(self, claim_id: str, issuer: Union[str, bytes, Address], payer: Union[str, bytes, Address], gas_price: int, gas_limit: int): func = InvokeFunction('Revoke') func.set_params_value(claim_id, Address.b58decode(issuer)) tx = InvokeTransaction(Address.b58decode(payer), gas_price, gas_limit) tx.add_invoke_code(self.__hex_contract_address, func) return tx
def test_list(self, list_msg: list, payer_acct, gas_limit, gas_price): func = InvokeFunction('testList') func.set_params_value(list_msg) tx = self.__sdk.neo_vm.make_invoke_transaction( self.__hex_contract_address, func, payer_acct.get_address(), gas_price, gas_limit) tx.sign_transaction(payer_acct) tx_hash = self.__sdk.rpc.send_raw_transaction(tx) return tx_hash
def test_dict_in_ctx(self, map_msg, payer_acct, gas_limit, gas_price): func = InvokeFunction('testMapInMap') func.set_params_value(map_msg) tx = self.__sdk.neo_vm.make_invoke_transaction( self.__hex_contract_address, func, payer_acct.get_address(), gas_price, gas_limit) tx.sign_transaction(payer_acct) tx_hash = self.__sdk.rpc.send_raw_transaction(tx) return tx_hash
def test_get_dict_in_ctx(self): hex_contract_address = '6690b6638251be951dded8c537678200a470c679' key = 'key' func = InvokeFunction('testGetMapInMap') func.set_params_value(key) result = sdk.rpc.send_neo_vm_tx_pre_exec(hex_contract_address, func) value = result['Result'] value = Data.to_utf8_str(value) self.assertEqual('value', value)
def hello(self, msg: str) -> str: if not isinstance(msg, str): raise RuntimeError('the type of msg should be str') func = InvokeFunction('hello') func.set_params_value(msg) tx = self.__sdk.neo_vm.make_invoke_transaction( self.__hex_contract_address, func) value = self.__sdk.rpc.send_raw_transaction_pre_exec(tx) return Data.to_utf8_str(value.get('Result', ''))
def new_balance_of_tx(self, owner: Union[str, bytes, Address]) -> InvokeTransaction: """ This interface is used to generate transaction which can get the account balance of another account with owner address. """ func = InvokeFunction('balanceOf') func.set_params_value(Address.b58decode(owner)) tx = InvokeTransaction() tx.add_invoke_code(self._contract_address, func) return tx
def new_transfer_tx(self, from_address: Union[str, Address], to_address: Union[str, Address], amount: int, payer: Union[str, Address], gas_price: int, gas_limit: int) -> InvokeTransaction: """ This interface is used to generate a transaction which can transfer amount of tokens to to_address. """ func = InvokeFunction('transfer') func.set_params_value(Address.b58decode(from_address), Address.b58decode(to_address), amount) params = InvokeTransaction.generate_invoke_code(self._contract_address, func) tx = InvokeTransaction(payer, gas_price, gas_limit, params) return tx
def test_struct_list_and_str(self, struct_list, str_msg, payer_acct: Account, gas_limit, gas_price): func = InvokeFunction('testStructListAndStr') func.set_params_value(struct_list, str_msg) tx = self.__sdk.neo_vm.make_invoke_transaction( self.__hex_contract_address, func, payer_acct.get_address(), gas_price, gas_limit) tx.sign_transaction(payer_acct) tx_hash = self.__sdk.rpc.send_raw_transaction(tx) return tx_hash
def test_invoke_transaction(self): """ from ontology.interop.System.Runtime import Notify def main(operation, args): if operation == 'hello': return hello(args[0]) return False def hello(msg): Notify(["hello", msg]) return msg """ avm_code = '51c56b6c58c56b6a00527ac46a51527ac46a52527ac46a51c30568656c6c6f7d9c7c756427' \ '00006a53527ac46a52c300c3516a53c3936a53527ac46a53c36a00c365f2006c7566620300' \ '006c75660111c56b6a00527ac46a51527ac46a51c300947600a0640c00c16a52527ac4620e' \ '007562030000c56a52527ac46a52c3c0517d9c7c75641c00006a53527ac46a52c300c36a54' \ '527ac4516a55527ac4625c006a52c3c0527d9c7c756421006a52c300c36a53527ac46a52c3' \ '51c36a54527ac4516a55527ac4616232006a52c3c0537d9c7c756424006a52c300c36a5352' \ '7ac46a52c351c36a54527ac46a52c352c36a55527ac462050000f100c176c96a56527ac46a' \ '53c36a57527ac46a57c36a54c37d9f7c756419006a56c36a57c3c86a57c36a55c3936a5752' \ '7ac462e0ff6a56c36c756656c56b6a00527ac46a51527ac46a52527ac46203000568656c6c' \ '6f6a52c352c176c9681553797374656d2e52756e74696d652e4e6f746966796a52c36c7566' contract_address = sdk.neo_vm.address_from_avm_code(avm_code).hex() self.assertEqual('f7b9970fd6def5229c1f30ad15372bd1c20bb260', contract_address) hello = InvokeFunction('hello') hello.set_params_value('ontology') tx = sdk.neo_vm.make_invoke_transaction(contract_address, hello, acct1.get_address_base58(), 500, 20000) response = sdk.rpc.send_raw_transaction_pre_exec(tx) self.assertEqual(1, response['State']) response['Result'] = Data.to_utf8_str(response['Result']) self.assertEqual('ontology', response['Result']) tx.sign_transaction(acct1) tx_hash = sdk.rpc.send_raw_transaction(tx) sleep(10) for _ in range(5): try: event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) if isinstance(event, dict) and event.get('Notify', '') != '': notify = Event.get_notify_by_contract_address( event, contract_address) self.assertEqual(contract_address, notify['ContractAddress']) self.assertEqual('hello', Data.to_utf8_str(notify['States'][0])) self.assertEqual('ontology', Data.to_utf8_str(notify['States'][1])) break except SDKException: continue sleep(2)
def new_transfer_from_tx(self, spender: Union[str, bytes, Address], owner: Union[str, bytes, Address], to_address: Union[str, bytes, Address], value: int, payer: Union[str, bytes, Address], gas_price: int, gas_limit: int) -> InvokeTransaction: func = InvokeFunction('transferFrom') if not isinstance(value, int): raise SDKException(ErrorCode.param_err('the data type of value should be int.')) func.set_params_value(Address.b58decode(spender), Address.b58decode(owner), Address.b58decode(to_address), value) tx = InvokeTransaction(payer, gas_price, gas_limit) tx.add_invoke_code(self._contract_address, func) return tx
def new_commit_tx(self, claim_id: str, issuer_address: Union[str, bytes, Address], owner_ont_id: str, payer_address: Union[str, bytes, Address], gas_price: int, gas_limit: int) -> InvokeTransaction: func = InvokeFunction('Commit') func.set_params_value(claim_id, Address.b58decode(issuer_address), owner_ont_id) tx = InvokeTransaction(Address.b58decode(payer_address), gas_price, gas_limit) tx.add_invoke_code(self.__hex_contract_address, func) return tx
def test_hello(self, bool_msg, int_msg, bytes_msg, str_msg, bytes_address_msg: bytes, payer_acct: Account, gas_limit: int, gas_price: int) -> str: func = InvokeFunction('testHello') func.set_params_value(bool_msg, int_msg, bytes_msg, str_msg, bytes_address_msg) tx = self.__sdk.neo_vm.make_invoke_transaction( self.__hex_contract_address, func, payer_acct.get_address(), gas_price, gas_limit) tx.sign_transaction(payer_acct) tx_hash = self.__sdk.rpc.send_raw_transaction(tx) return tx_hash
def put_one_item_to_contract(ont_id_acct: Account, ipfs_address: str, ext: str, payer_acct: Account) -> str: put_one_item_func = InvokeFunction('put_one_item') ipfs_address_bytes = ipfs_address.encode('ascii') aes_iv, encode_g_tilde, encrypted_ipfs_address = ECIES.encrypt_with_ont_id_in_cbc(ipfs_address_bytes, ont_id_acct) ont_id_acct_bytes = ont_id_acct.get_address().to_bytes() put_one_item_func.set_params_value(ont_id_acct_bytes, encrypted_ipfs_address, ext, aes_iv, encode_g_tilde) gas_limit = app.config['GAS_LIMIT'] gas_price = app.config['GAS_PRICE'] contract_address_bytearray = app.config['CONTRACT_ADDRESS_BYTEARRAY'] tx_hash = app.config['ONTOLOGY'].rpc.send_neo_vm_transaction(contract_address_bytearray, ont_id_acct, payer_acct, gas_price, gas_limit, put_one_item_func) return tx_hash
def test_oep4_balance_of(self): hex_contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9' func = InvokeFunction('balanceOf') self.assertEqual(bytearray(b'\x00\xc1\tbalanceOf'), func.create_invoke_code()) bytes_address = acct1.get_address().to_bytes() func.set_params_value(bytes_address) target = bytearray( b'\x14F\xb1\xa1\x8a\xf6\xb7\xc9\xf8\xa4`/\x9fs\xee\xb3\x03\x0f\x0c)\xb7Q\xc1\tbalanceOf' ) self.assertEqual(target, func.create_invoke_code()) result = sdk.rpc.send_neo_vm_tx_pre_exec(hex_contract_address, func) balance = result['Result'] balance = Data.to_int(balance) self.assertGreater(balance, 100)
def new_approve_tx(self, owner: Union[str, bytes, Address], spender: Union[str, bytes, Address], amount: int, payer: Union[str, bytes, Address], gas_price: int, gas_limit: int) -> InvokeTransaction: """ This interface is used to generate a transaction which allows spender to withdraw from owner account multiple times, up to the _value amount. If this function is called again it overwrites the current allowance with amount value. """ if not isinstance(amount, int): raise SDKException(ErrorCode.param_err('the data type of amount should be int.')) if amount < 0: raise SDKException(ErrorCode.param_err('the amount should be equal or great than 0.')) func = InvokeFunction('approve') func.set_params_value(Address.b58decode(owner), Address.b58decode(spender), amount) params = InvokeTransaction.generate_invoke_code(self._contract_address, func) tx = InvokeTransaction(payer, gas_price, gas_limit, params) return tx
def test_list(self): hex_contract_address = '6690b6638251be951dded8c537678200a470c679' list_msg = [1, 10, 1024, [1, 10, 1024, [1, 10, 1024]]] func = InvokeFunction('testList') func.set_params_value(list_msg) tx_hash = self.send_tx(hex_contract_address, None, acct1, func) if len(tx_hash) == 0: return time.sleep(randint(10, 15)) event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) states = Event.get_states_by_contract_address(event, hex_contract_address) states[0] = Data.to_utf8_str(states[0]) self.assertEqual('testMsgList', states[0]) states[1] = Data.to_int_list(states[1]) self.assertEqual(list_msg, states[1])
def test_dict(self): hex_contract_address = '6690b6638251be951dded8c537678200a470c679' dict_msg = {'key': 'value'} func = InvokeFunction('testMap') func.set_params_value(dict_msg) result = sdk.rpc.send_neo_vm_tx_pre_exec(hex_contract_address, func) dict_value = result['Result'] dict_value = Data.to_utf8_str(dict_value) self.assertEqual('value', dict_value) list_value = [1, 10, 1024, [1, 10, 1024, [1, 10, 1024]]] dict_msg = {'key': list_value} func = InvokeFunction('testMap') func.set_params_value(dict_msg) result = sdk.rpc.send_neo_vm_tx_pre_exec(hex_contract_address, func) dict_value = result['Result'] dict_value = Data.to_int_list(dict_value) self.assertEqual(list_value, dict_value)
def get_item_list_from_contract(identity_acct: Account) -> list: get_item_list_func = InvokeFunction('get_item_list') get_item_list_func.set_params_value(identity_acct.get_address()) contract_address_bytearray = app.config['CONTRACT_ADDRESS_BYTEARRAY'] response = app.config['ONTOLOGY'].rpc.send_neo_vm_tx_pre_exec(contract_address_bytearray, get_item_list_func) item_list = list() if isinstance(response, dict): item_list = response.get('Result') if item_list is None: item_list = list() if item_list is None or None in item_list: return list() album_list = list() for item in item_list: encrypted_ipfs_address_bytes = binascii.a2b_hex(item[0]) ext = binascii.a2b_hex(item[1]).decode('ascii') aes_iv = binascii.a2b_hex(item[2]) encode_g_tilde = binascii.a2b_hex(item[3]) ipfs_address = ECIES.decrypt_with_ont_id_in_cbc(aes_iv, encode_g_tilde, encrypted_ipfs_address_bytes, identity_acct) album_list.append([ipfs_address.decode('ascii'), ext]) return album_list
def test_oep4_transfer(self): hex_contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9' func = InvokeFunction('transfer') bytes_from_address = acct1.get_address().to_bytes() bytes_to_address = acct2.get_address().to_bytes() value = 1 func.set_params_value(bytes_from_address, bytes_to_address, value) tx_hash = self.send_tx(hex_contract_address, acct1, acct2, func) if len(tx_hash) == 0: return time.sleep(randint(10, 15)) event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) states = Event.get_states_by_contract_address(event, hex_contract_address) states[0] = Data.to_utf8_str(states[0]) self.assertEqual('transfer', states[0]) states[1] = Data.to_b58_address(states[1]) self.assertEqual(acct1.get_address().b58encode(), states[1]) states[2] = Data.to_b58_address(states[2]) self.assertEqual(acct2.get_address().b58encode(), states[2]) states[3] = Data.to_int(states[3]) self.assertEqual(value, states[3])
def test_oep4_transfer_multi(self): hex_contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9' bytes_from_address1 = acct1.get_address().to_bytes() bytes_to_address1 = acct2.get_address().to_bytes() value1 = 2 transfer1 = [bytes_from_address1, bytes_to_address1, value1] bytes_from_address2 = acct2.get_address().to_bytes() bytes_to_address2 = acct3.get_address().to_bytes() value2 = 1 transfer2 = [bytes_from_address2, bytes_to_address2, value2] func = InvokeFunction('transferMulti') func.set_params_value(transfer1, transfer2) tx_hash = sdk.default_network.send_neo_vm_transaction( hex_contract_address, acct1, acct2, self.gas_price, self.gas_limit, func, False) time.sleep(randint(10, 15)) event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) states_list = Event.get_states_by_contract_address( event, hex_contract_address) states_list[0][0] = Data.to_utf8_str(states_list[0][0]) self.assertEqual('transfer', states_list[0][0]) states_list[0][1] = Data.to_b58_address(states_list[0][1]) self.assertEqual(acct1.get_address().b58encode(), states_list[0][1]) states_list[0][2] = Data.to_b58_address(states_list[0][2]) self.assertEqual(acct2.get_address().b58encode(), states_list[0][2]) states_list[0][3] = Data.to_int(states_list[0][3]) self.assertEqual(value1, states_list[0][3]) states_list[1][0] = Data.to_utf8_str(states_list[1][0]) self.assertEqual('transfer', states_list[1][0]) states_list[1][1] = Data.to_b58_address(states_list[1][1]) self.assertEqual(acct2.get_address().b58encode(), states_list[1][1]) states_list[1][2] = Data.to_b58_address(states_list[1][2]) self.assertEqual(acct3.get_address().b58encode(), states_list[1][2]) states_list[1][3] = Data.to_int(states_list[1][3]) self.assertEqual(value2, states_list[1][3])
def new_get_status_tx(self, claim_id: str) -> InvokeTransaction: func = InvokeFunction('GetStatus') func.set_params_value(claim_id) tx = InvokeTransaction() tx.add_invoke_code(self.__hex_contract_address, func) return tx
def test_clear_item_list(self): clear_item_list_func = InvokeFunction('clear_item_list') clear_item_list_func.set_params_value(ont_id_acct.get_address()) tx_hash = ontology.rpc.send_neo_vm_transaction(contract_address_bytearray, ont_id_acct, acct, gas_price, gas_limit, clear_item_list_func) self.assertEqual(64, len(tx_hash))