def validate_proof(proof: List[dict], hex_target_hash: str, hex_merkle_root: str, is_big_endian: bool = False): if is_big_endian: hex_merkle_root = NeoData.to_reserve_hex_str(hex_merkle_root) hex_target_hash = NeoData.to_reserve_hex_str(hex_target_hash) if len(proof) == 0: return hex_target_hash == hex_merkle_root else: hex_proof_hash = hex_target_hash for node in proof: if is_big_endian: sibling = NeoData.to_reserve_hex_str(node['TargetHash']) else: sibling = node['TargetHash'] try: direction = node['Direction'].lower() except KeyError: raise SDKException(ErrorCode.other_error('Invalid proof')) if direction == 'left': value = bytes.fromhex('01' + sibling + hex_proof_hash) hex_proof_hash = Digest.sha256(value, is_hex=True) elif direction == 'right': value = bytes.fromhex('01' + hex_proof_hash + sibling) hex_proof_hash = Digest.sha256(value, is_hex=True) else: raise SDKException(ErrorCode.other_error('Invalid proof.')) return hex_proof_hash == hex_merkle_root
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 = NeoInvokeFunction('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] = NeoData.to_utf8_str(states[0]) self.assertEqual('mapInfo', states[0]) states[1] = NeoData.to_dict(states[1]) self.assertTrue(isinstance(states[1], dict))
def test_bigint_to_neo_bytes(self): value_list = [9175052165852779861, -9175052165852779861, 9199634313818843819, -9199634313818843819, 8380656, -8380656, 8446192, -8446192, 0] for value in value_list: neo_bytearray = NeoData.big_int_to_neo_bytearray(value) self.assertTrue(isinstance(neo_bytearray, bytearray)) neo_value = NeoData.neo_bytearray_to_big_int(neo_bytearray) self.assertEqual(value, neo_value)
def test_invoke_transaction(self): """ from dna.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 = NeoInvokeFunction('hello') hello.set_params_value('dna') 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'] = NeoData.to_utf8_str(response['Result']) self.assertEqual('dna', 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', NeoData.to_utf8_str(notify['States'][0])) self.assertEqual('dna', NeoData.to_utf8_str(notify['States'][1])) break except SDKException: continue sleep(2)
def query_revoke_event(self, tx_hash: str): event = self._sdk.default_network.get_contract_event_by_tx_hash( tx_hash) notify = Event.get_notify_by_contract_address( event, self.__hex_contract_address) if len(notify['States']) == 4: notify['States'][0] = NeoData.to_utf8_str(notify['States'][0]) notify['States'][1] = NeoData.to_b58_address(notify['States'][1]) notify['States'][2] = NeoData.to_utf8_str(notify['States'][2]) notify['States'][3] = NeoData.to_hex_str(notify['States'][3]) return notify
async def test_get_storage(self): hex_contract_address = '0100000000000000000000000000000000000000' key = '746f74616c537570706c79' storage = await sdk.websocket.get_storage(hex_contract_address, key) await sdk.websocket.close_connect() value = NeoData.to_int(storage) self.assertEqual(1000000000, value)
async def query_transfer_from_event(self, tx_hash: str): event = await self._sdk.default_aio_network.get_contract_event_by_tx_hash( tx_hash) notify = Event.get_notify_by_contract_address(event, self._contract_address) notify = NeoData.parse_addr_addr_int_notify(notify) return notify
async def test_subscribe(self): hex_contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9' oep4 = sdk.neo_vm.aio_oep4(hex_contract_address) response = await sdk.websocket.subscribe(hex_contract_address, True, False, False, False) self.assertEqual([hex_contract_address], response['ContractsFilter']) self.assertEqual(True, response['SubscribeEvent']) self.assertEqual(False, response['SubscribeJsonBlock']) self.assertEqual(False, response['SubscribeRawBlock']) b58_to_address = acct2.get_address_base58() value = 10 tx_hash = await oep4.transfer(acct1, b58_to_address, value, acct3, 500, 20000) self.assertEqual(64, len(tx_hash)) try: event = await asyncio.wait_for(sdk.websocket.recv_subscribe_info(), timeout=10) self.assertEqual(False, response['SubscribeBlockTxHashs']) self.assertEqual(64, len(event['TxHash'])) notify = Event.get_notify_by_contract_address(event, hex_contract_address) notify = NeoData.parse_addr_addr_int_notify(notify) self.assertEqual(hex_contract_address, notify['ContractAddress']) self.assertEqual('transfer', notify['States'][0]) self.assertEqual(acct1.get_address_base58(), notify['States'][1]) self.assertEqual(b58_to_address, notify['States'][2]) self.assertEqual(value, notify['States'][3]) except asyncio.TimeoutError: pass finally: await sdk.websocket.close_connect()
def test_list(self): hex_contract_address = '6690b6638251be951dded8c537678200a470c679' list_msg = [1, 10, 1024, [1, 10, 1024, [1, 10, 1024]]] func = NeoInvokeFunction('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] = NeoData.to_utf8_str(states[0]) self.assertEqual('testMsgList', states[0]) states[1] = NeoData.to_int_list(states[1]) self.assertEqual(list_msg, states[1])
def test_oep4_decimal(self): hex_contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9' func = NeoInvokeFunction('decimals') result = sdk.rpc.send_neo_vm_tx_pre_exec(hex_contract_address, func) decimals = result['Result'] decimals = NeoData.to_int(decimals) self.assertEqual(10, decimals)
def symbol(self) -> str: """ This interface is used to query the asset's symbol of ONT or ONG. """ tx = self.new_symbol_tx() response = self._sdk.default_network.send_raw_transaction_pre_exec(tx) return NeoData.to_utf8_str(response['Result'])
def symbol(self): """ This interface is used to get the symbol of the token synchronously. E.g. “DX”. """ tx = self.new_symbol_tx() response = self._sdk.default_network.send_raw_transaction_pre_exec(tx) return NeoData.to_utf8_str(response.get('Result', ''))
def query_approve_event(self, tx_hash: str): event = self._sdk.default_network.get_contract_event_by_tx_hash( tx_hash) notify = Event.get_notify_by_contract_address(event, self._contract_address) notify = NeoData.parse_addr_addr_int_notify(notify) return notify
def test_dict(self): hex_contract_address = '6690b6638251be951dded8c537678200a470c679' dict_msg = {'key': 'value'} func = NeoInvokeFunction('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 = NeoData.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 = NeoInvokeFunction('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 = NeoData.to_int_list(dict_value) self.assertEqual(list_value, dict_value)
async def name(self) -> str: """ This interface is used to query the asset's name of ONT or ONG. """ tx = self.new_name_tx() response = await self._sdk.default_aio_network.send_raw_transaction_pre_exec( tx) return NeoData.to_utf8_str(response['Result'])
def decimals(self): """ This interface is used to the number of decimals the token uses synchronously. E.g. 8, means to divide the token amount by 100000000 to get its user representation. """ tx = self.new_decimals_tx() response = self._sdk.default_network.send_raw_transaction_pre_exec(tx) return NeoData.to_int(response.get('Result', ''))
def _parse_multi_transfer_event(self, event: dict): notify_list = Event.get_notify_by_contract_address( event, self._contract_address) for index, notify in enumerate(notify_list): if notify.get('ContractAddress', '') == self._contract_address: notify_list[index] = NeoData.parse_addr_addr_int_notify( notify_list[index]) return notify_list
async def name(self): """ This interface is used to get the name of the token asynchronously. E.g. "DXToken". """ tx = self.new_name_tx() response = await self._sdk.default_aio_network.send_raw_transaction_pre_exec( tx) return NeoData.to_utf8_str(response.get('Result', ''))
async def test_add_and_remove_attribute(self): did = sdk.native_vm.aio_did() identity = sdk.wallet_manager.create_identity(password) ctrl_acct = sdk.wallet_manager.get_control_account_by_index( identity.did, 0, password) tx_hash = await did.registry_did(identity.did, ctrl_acct, acct3, self.gas_price, self.gas_limit) await self.check_register_did_event(identity.did, tx_hash) hex_contract_address = did.contract_address attribute = Attribute('hello', 'string', 'attribute') tx_hash = await did.add_attribute(identity.did, ctrl_acct, attribute, acct2, self.gas_price, self.gas_limit) await asyncio.sleep(randint(10, 15)) event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) notify = Event.get_notify_by_contract_address(event, hex_contract_address) self.assertEqual('Attribute', notify['States'][0]) self.assertEqual('add', notify['States'][1]) self.assertEqual(identity.did, notify['States'][2]) self.assertEqual('hello', NeoData.to_utf8_str(notify['States'][3][0])) attrib_key = 'hello' tx_hash = await did.remove_attribute(identity.did, ctrl_acct, attrib_key, acct3, self.gas_price, self.gas_limit) await asyncio.sleep(randint(10, 15)) event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) notify = Event.get_notify_by_contract_address(event, hex_contract_address) self.assertEqual('Attribute', notify['States'][0]) self.assertEqual('remove', notify['States'][1]) self.assertEqual(identity.did, notify['States'][2]) self.assertEqual('hello', NeoData.to_utf8_str(notify['States'][3])) try: await did.remove_attribute(identity.did, ctrl_acct, attrib_key, acct3, self.gas_price, self.gas_limit) except SDKException as e: self.assertIn('attribute not exist', e.args[1]) attrib_key = 'key' try: await did.remove_attribute(identity.did, ctrl_acct, attrib_key, acct3, self.gas_price, self.gas_limit) except SDKException as e: self.assertIn('attribute not exist', e.args[1])
def test_op_code_to_int(self): builder = NeoParamsBuilder() for num in range(100000): builder.push_int(num) op_code = builder.to_bytes().hex() builder.clear_up() value = NeoData.op_code_to_int(op_code) self.assertEqual(num, value)
def parse_status(result: dict): status = result['Result'] if status == '': status = False else: status = NeoData.to_dict(status) status = bool(status[3]) return status
def test_oep4_total_supply(self): hex_contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9' func = NeoInvokeFunction('totalSupply') result = sdk.default_network.send_neo_vm_tx_pre_exec( hex_contract_address, func) total_supply = result['Result'] total_supply = NeoData.to_int(total_supply) self.assertEqual(10000000000000000000, total_supply)
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 = NeoInvokeFunction('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] = NeoData.to_utf8_str(states[0]) states[1][0][0] = NeoData.to_b58_address(states[1][0][0]) self.assertEqual(acct1.get_address_base58(), states[1][0][0]) states[1][0][1] = NeoData.to_b58_address(states[1][0][1]) self.assertEqual(acct2.get_address_base58(), states[1][0][1]) states[1][0][2] = NeoData.to_int(states[1][0][2]) self.assertEqual(10, states[1][0][2]) states[1][1][0] = NeoData.to_b58_address(states[1][1][0]) self.assertEqual(acct2.get_address_base58(), states[1][1][0]) states[1][1][1] = NeoData.to_b58_address(states[1][1][1]) self.assertEqual(acct3.get_address_base58(), states[1][1][1]) states[1][1][2] = NeoData.to_int(states[1][1][2]) self.assertEqual(100, states[1][1][2])
def allowance(self, from_address: Union[str, Address], to_address: Union[str, Address]) -> int: tx = self.new_allowance_tx(from_address, to_address) response = self._sdk.default_network.send_raw_transaction_pre_exec(tx) try: allowance = NeoData.to_int(response['Result']) return allowance except SDKException: return 0
def test_oep4_symbol(self): hex_contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9' func = NeoInvokeFunction('symbol') self.assertEqual(bytearray(b'\x00\xc1\x06symbol'), func.create_invoke_code()) result = sdk.rpc.send_neo_vm_tx_pre_exec(hex_contract_address, func) symbol = result['Result'] symbol = NeoData.to_utf8_str(symbol) self.assertEqual('DX', symbol)
def test_oep4_name(self): hex_contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9' func = NeoInvokeFunction('name') self.assertEqual(bytearray(b'\x00\xc1\x04name'), func.create_invoke_code()) result = sdk.rpc.send_neo_vm_tx_pre_exec(hex_contract_address, func) name = result['Result'] name = NeoData.to_utf8_str(name) self.assertEqual('DXToken', name)
def test_get_dict_in_ctx(self): hex_contract_address = '6690b6638251be951dded8c537678200a470c679' key = 'key' func = NeoInvokeFunction('testGetMapInMap') func.set_params_value(key) result = sdk.rpc.send_neo_vm_tx_pre_exec(hex_contract_address, func) value = result['Result'] value = NeoData.to_utf8_str(value) self.assertEqual('value', value)
def test_send_raw_transaction_pre_exec(self): b58_address = acct1.get_address_base58() tx = sdk.native_vm.ong().new_transfer_tx(b58_address, acct2.get_address(), 2, b58_address, 500, 20000) tx.sign_transaction(acct1) result = sdk.rpc.send_raw_transaction_pre_exec(tx) self.assertTrue(NeoData.to_bool(result['Result'])) self.assertEqual(result['Gas'], 20000) self.assertEqual(result['State'], 1)
def total_supply(self) -> int: """ This interface is used to get the total token supply synchronously. """ tx = self.new_total_supply_tx() response = self._sdk.default_network.send_raw_transaction_pre_exec(tx) try: total_supply = NeoData.to_int(response['Result']) except SDKException: total_supply = 0 return total_supply
def test_init(self): oep4 = sdk.neo_vm.oep4() oep4.hex_contract_address = self.contract_address tx_hash = oep4.init(acct1, acct2, self.gas_price, self.gas_limit) self.assertEqual(len(tx_hash), 64) time.sleep(randint(10, 15)) event = sdk.rpc.get_contract_event_by_tx_hash(tx_hash) notify = Event.get_notify_by_contract_address( event, oep4.hex_contract_address) self.assertEqual('Already initialized!', NeoData.to_utf8_str(notify['States']))