def test_approve(self):
     sdk = OntologySdk()
     sdk.set_rpc(local_rpc_address)
     oep4 = sdk.neo_vm().oep4()
     oep4.set_contract_address(contract_address)
     private_key1 = "5f2fe68215476abb9852cfa7da31ef00aa1468782d5ca809da5c4e1390b8ee45"
     private_key2 = "f00dd7f5356e8aee93a049bdccc44ce91169e07ea3bec9f4e0142e456fd39bae"
     owner_acct = Account(private_key1, SignatureScheme.SHA256withECDSA)
     hex_owner_address = owner_acct.get_address_hex()
     spender = Account(private_key2, SignatureScheme.SHA256withECDSA)
     b58_spender_address = spender.get_address_base58()
     hex_spender_address = spender.get_address_hex()
     amount = 100
     gas_limit = 20000000
     gas_price = 0
     tx_hash = oep4.approve(owner_acct, b58_spender_address, amount,
                            owner_acct, gas_limit, gas_price)
     self.assertEqual(len(tx_hash), 64)
     sdk = OntologySdk()
     sdk.set_rpc(local_rpc_address)
     time.sleep(6)
     try:
         event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
         notify = event['Notify'][0]
         self.assertEqual(hex_owner_address, notify['States'][1])
         self.assertEqual(hex_spender_address, notify['States'][2])
         self.assertEqual('64', notify['States'][3])
     except SDKException as e:
         raised = False
         self.assertTrue(raised, e)
 def test_approve(self):
     sdk = OntologySdk()
     sdk.set_rpc(remote_rpc_address)
     contract_address = '6fe70af535887a820a13cfbaff6b0b505f855e5c'
     oep4 = sdk.neo_vm().oep4()
     oep4.set_contract_address(contract_address)
     private_key1 = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f'
     private_key2 = '75de8489fcb2dcaf2ef3cd607feffde18789de7da129b5e97c81e001793cb7cf'
     owner_acct = Account(private_key1, SignatureScheme.SHA256withECDSA)
     hex_owner_address = owner_acct.get_address_hex()
     spender = Account(private_key2, SignatureScheme.SHA256withECDSA)
     b58_spender_address = spender.get_address_base58()
     hex_spender_address = spender.get_address_hex()
     amount = 100
     gas_limit = 20000000
     gas_price = 500
     tx_hash = oep4.approve(owner_acct, b58_spender_address, amount,
                            owner_acct, gas_limit, gas_price)
     self.assertEqual(len(tx_hash), 64)
     sdk = OntologySdk()
     sdk.set_rpc(remote_rpc_address)
     time.sleep(6)
     try:
         event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
         notify = event['Notify'][0]
         self.assertEqual(hex_owner_address, notify['States'][0])
         self.assertEqual(hex_spender_address, notify['States'][1])
         self.assertEqual('64', notify['States'][2])
     except SDKException as e:
         raised = False
         self.assertTrue(raised, e)
    def test_transfer_multi(self):
        sdk = OntologySdk()
        sdk.set_rpc(local_rpc_address)
        oep4 = sdk.neo_vm().oep4()
        oep4.set_contract_address(contract_address)
        private_key1 = "5f2fe68215476abb9852cfa7da31ef00aa1468782d5ca809da5c4e1390b8ee45"
        private_key2 = "f00dd7f5356e8aee93a049bdccc44ce91169e07ea3bec9f4e0142e456fd39bae"
        private_key3 = "da213fb4cb1b12269c20307dadda35a7c89869c0c791b777fd8618d4159db99c"
        acct1 = Account(private_key1, SignatureScheme.SHA256withECDSA)
        acct2 = Account(private_key2, SignatureScheme.SHA256withECDSA)
        acct3 = Account(private_key3, SignatureScheme.SHA256withECDSA)

        b58_from_address1 = acct1.get_address_base58()
        hex_from_address1 = acct1.get_address_hex()
        from_address_list = [hex_from_address1, hex_from_address1]

        b58_to_address2 = acct2.get_address_base58()
        b58_to_address3 = acct3.get_address_base58()

        hex_to_address2 = acct2.get_address_hex()
        hex_to_address3 = acct3.get_address_hex()
        to_address_list = [hex_to_address2, hex_to_address3]

        value_list = [1, 2]
        # print("b58 addr 1 is ", b58_from_address1)
        # print("b58 addr 1 is ", b58_to_address2)
        # print("b58 addr 1 is ", b58_to_address3)

        transfer1 = [b58_from_address1, b58_to_address2, value_list[0]]
        transfer2 = [b58_from_address1, b58_to_address3, value_list[1]]
        signers = [acct1]
        args = []
        args.append(transfer1)
        args.append(transfer2)

        gas_limit = 20000000
        gas_price = 500

        tx_hash = oep4.transfer_multi(args, signers[0], signers, gas_limit,
                                      gas_price)
        self.assertEqual(64, len(tx_hash))
        sdk = OntologySdk()
        sdk.set_rpc(local_rpc_address)
        time.sleep(10)
        try:
            event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
            # print("event is ", event)
            notify = event['Notify'][0:-1]
            # print("notify is ", notify)
            self.assertEqual(len(args), len(notify))
            for index in range(len(notify)):
                self.assertEqual(from_address_list[index],
                                 notify[index]['States'][1])
                self.assertEqual(to_address_list[index],
                                 notify[index]['States'][2])
                self.assertEqual(value_list[index],
                                 int(notify[index]['States'][3]))
        except SDKException as e:
            raised = False
            self.assertTrue(raised, e)
Exemplo n.º 4
0
    def test_transfer_multi(self):
        sdk = OntologySdk()
        sdk.set_rpc(remote_rpc_address)
        contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9'
        oep4 = sdk.neo_vm().oep4()
        oep4.set_contract_address(contract_address)
        private_key1 = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f'
        private_key2 = '75de8489fcb2dcaf2ef3cd607feffde18789de7da129b5e97c81e001793cb7cf'
        private_key3 = '1383ed1fe570b6673351f1a30a66b21204918ef8f673e864769fa2a653401114'
        acct1 = Account(private_key1, SignatureScheme.SHA256withECDSA)
        acct2 = Account(private_key2, SignatureScheme.SHA256withECDSA)
        acct3 = Account(private_key3, SignatureScheme.SHA256withECDSA)
        args = list()

        b58_from_address1 = acct1.get_address_base58()
        b58_from_address2 = acct2.get_address_base58()
        hex_from_address1 = acct1.get_address_hex()
        hex_from_address2 = acct2.get_address_hex()
        from_address_list = [hex_from_address1, hex_from_address2]

        b58_to_address1 = acct2.get_address_base58()
        b58_to_address2 = acct3.get_address_base58()
        hex_to_address1 = acct2.get_address_hex()
        hex_to_address2 = acct3.get_address_hex()
        to_address_list = [hex_to_address1, hex_to_address2]

        value_list = [1.1, 2.2]

        transfer1 = [b58_from_address1, b58_to_address1, value_list[0]]
        transfer2 = [b58_from_address2, b58_to_address2, value_list[1]]

        signers = [acct1, acct2, acct3]
        args.append(transfer1)
        args.append(transfer2)

        gas_limit = 20000000
        gas_price = 500

        tx_hash = oep4.transfer_multi(args, signers[0], signers, gas_limit, gas_price)
        self.assertEqual(64, len(tx_hash))
        sdk = OntologySdk()
        sdk.set_rpc(remote_rpc_address)
        time.sleep(6)
        try:
            decimal = oep4.get_decimal()
            event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
            notify = event['Notify'][:-1]
            self.assertEqual(len(args), len(notify))
            for index in range(len(notify)):
                self.assertEqual('transfer', bytes.fromhex(notify[index]['States'][0]).decode())
                self.assertEqual(from_address_list[index], notify[index]['States'][1])
                self.assertEqual(to_address_list[index], notify[index]['States'][2])
                array = bytearray(binascii.a2b_hex(notify[index]['States'][3].encode('ascii')))
                array.reverse()
                notify_value = int(binascii.b2a_hex(array).decode('ascii'), 16)
                self.assertEqual((10 ** decimal) * value_list[index], notify_value)
        except SDKException as e:
            raised = False
            self.assertTrue(raised, e)
    def test_transfer_multi(self):
        sdk = OntologySdk()
        sdk.set_rpc(remote_rpc_address)
        contract_address = '6fe70af535887a820a13cfbaff6b0b505f855e5c'
        oep4 = sdk.neo_vm().oep4()
        oep4.set_contract_address(contract_address)
        private_key1 = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f'
        private_key2 = '75de8489fcb2dcaf2ef3cd607feffde18789de7da129b5e97c81e001793cb7cf'
        private_key3 = '1383ed1fe570b6673351f1a30a66b21204918ef8f673e864769fa2a653401114'
        acct1 = Account(private_key1, SignatureScheme.SHA256withECDSA)
        acct2 = Account(private_key2, SignatureScheme.SHA256withECDSA)
        acct3 = Account(private_key3, SignatureScheme.SHA256withECDSA)
        args = list()

        b58_from_address1 = acct1.get_address_base58()
        b58_from_address2 = acct2.get_address_base58()
        hex_from_address1 = acct1.get_address_hex()
        hex_from_address2 = acct2.get_address_hex()
        from_address_list = [hex_from_address1, hex_from_address2]

        b58_to_address1 = acct2.get_address_base58()
        b58_to_address2 = acct3.get_address_base58()
        hex_to_address1 = acct2.get_address_hex()
        hex_to_address2 = acct3.get_address_hex()
        to_address_list = [hex_to_address1, hex_to_address2]

        value_list = [1, 2]

        transfer1 = [b58_from_address1, b58_to_address1, value_list[0]]
        transfer2 = [b58_from_address2, b58_to_address2, value_list[1]]
        signers = [acct1, acct2, acct3]
        args.append(transfer1)
        args.append(transfer2)

        gas_limit = 20000000
        gas_price = 500

        tx_hash = oep4.transfer_multi(args, signers[0], signers, gas_limit,
                                      gas_price)
        self.assertEqual(64, len(tx_hash))
        sdk = OntologySdk()
        sdk.set_rpc(remote_rpc_address)
        time.sleep(6)
        try:
            event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
            notify = event['Notify'][:-1]
            self.assertEqual(len(args), len(notify))
            for index in range(len(notify)):
                self.assertEqual(from_address_list[index],
                                 notify[index]['States'][0])
                self.assertEqual(to_address_list[index],
                                 notify[index]['States'][1])
                self.assertEqual(value_list[index],
                                 int(notify[index]['States'][2]))
        except SDKException as e:
            raised = False
            self.assertTrue(raised, e)
Exemplo n.º 6
0
    async def test_change_recovery(self):
        identity = sdk.wallet_manager.create_identity(password)
        ctrl_acct = sdk.wallet_manager.get_control_account_by_index(identity.ont_id, 0, password)
        tx_hash = await sdk.native_vm.aio_ont_id().registry_ont_id(identity.ont_id, ctrl_acct, acct3, self.gas_price,
                                                                   self.gas_limit)
        self.assertEqual(64, len(tx_hash))
        await asyncio.sleep(randint(10, 15))
        event = sdk.restful.get_contract_event_by_tx_hash(tx_hash)
        hex_contract_address = sdk.native_vm.aio_ont_id().contract_address
        notify = Event.get_notify_by_contract_address(event, hex_contract_address)
        self.assertEqual(hex_contract_address, notify['ContractAddress'])
        self.assertEqual('Register', notify['States'][0])
        self.assertEqual(identity.ont_id, notify['States'][1])

        rand_private_key = utils.get_random_bytes(32).hex()
        recovery = Account(rand_private_key, SignatureScheme.SHA256withECDSA)
        b58_recovery_address = recovery.get_address_base58()
        tx_hash = await sdk.native_vm.aio_ont_id().add_recovery(identity.ont_id, ctrl_acct, b58_recovery_address, 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(hex_contract_address, notify['ContractAddress'])
        self.assertEqual('Recovery', notify['States'][0])
        self.assertEqual('add', notify['States'][1])
        self.assertEqual(identity.ont_id, notify['States'][2])
        self.assertEqual(recovery.get_address_hex(little_endian=False), notify['States'][3])
        ddo = await sdk.native_vm.aio_ont_id().get_ddo(identity.ont_id)
        self.assertIn(ctrl_acct.get_ont_id(), ddo['Owners'][0]['PubKeyId'])
        self.assertEqual('ECDSA', ddo['Owners'][0]['Type'])
        self.assertEqual('P256', ddo['Owners'][0]['Curve'])
        self.assertEqual(ctrl_acct.get_public_key_hex(), ddo['Owners'][0]['Value'])
        self.assertEqual(0, len(ddo['Attributes']))
        self.assertEqual(recovery.get_address_base58(), ddo['Recovery'])
        self.assertEqual(identity.ont_id, ddo['OntId'])

        rand_private_key = utils.get_random_bytes(32).hex()
        new_recovery = Account(rand_private_key, SignatureScheme.SHA256withECDSA)
        b58_new_recovery_address = new_recovery.get_address_base58()

        try:
            await sdk.native_vm.aio_ont_id().change_recovery(identity.ont_id, b58_new_recovery_address, ctrl_acct,
                                                             acct2, self.gas_price, self.gas_limit)
        except SDKException as e:
            self.assertIn('operator is not the recovery', e.args[1])
        tx_hash = await sdk.native_vm.aio_ont_id().change_recovery(identity.ont_id, b58_new_recovery_address, recovery,
                                                                   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(hex_contract_address, notify['ContractAddress'])
        self.assertEqual('Recovery', notify['States'][0])
        self.assertEqual('change', notify['States'][1])
        self.assertEqual(identity.ont_id, notify['States'][2])
        self.assertEqual(new_recovery.get_address_hex(little_endian=False), notify['States'][3])
Exemplo n.º 7
0
    def test_transfer_from(self):
        sdk = OntologySdk()
        sdk.set_rpc(remote_rpc_address)
        contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9'
        oep4 = sdk.neo_vm().oep4()
        oep4.set_contract_address(contract_address)
        private_key1 = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f'
        private_key2 = '75de8489fcb2dcaf2ef3cd607feffde18789de7da129b5e97c81e001793cb7cf'
        private_key3 = '1383ed1fe570b6673351f1a30a66b21204918ef8f673e864769fa2a653401114'
        spender_acct = Account(private_key2, SignatureScheme.SHA256withECDSA)

        from_acct = Account(private_key1, SignatureScheme.SHA256withECDSA)
        b58_from_address = from_acct.get_address_base58()
        hex_from_address = from_acct.get_address_hex()

        to_acct = Account(private_key3, SignatureScheme.SHA256withECDSA)
        b58_to_address = to_acct.get_address_base58()
        hex_to_address = to_acct.get_address_hex()

        gas_limit = 20000000
        gas_price = 500
        value = 1
        tx_hash = oep4.transfer_from(spender_acct, b58_from_address, b58_to_address, value, from_acct, gas_limit,
                                     gas_price)
        self.assertEqual(64, len(tx_hash))
        sdk = OntologySdk()
        sdk.set_rpc(remote_rpc_address)
        time.sleep(6)
        try:
            decimal = oep4.get_decimal()
            event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
            notify = event['Notify'][0]
            self.assertEqual(2, len(notify))
            self.assertEqual('transfer', bytes.fromhex(notify['States'][0]).decode())
            self.assertEqual(hex_from_address, notify['States'][1])
            self.assertEqual(hex_to_address, notify['States'][2])
            array = bytearray(binascii.a2b_hex(notify['States'][3].encode('ascii')))
            array.reverse()
            notify_value = int(binascii.b2a_hex(array).decode('ascii'), 16)
            self.assertEqual((10 ** decimal) * value, notify_value)
        except SDKException as e:
            raised = False
            self.assertTrue(raised, e)
    def test_transfer_from(self):
        sdk = OntologySdk()
        sdk.set_rpc(remote_rpc_address)
        contract_address = '6fe70af535887a820a13cfbaff6b0b505f855e5c'
        oep4 = sdk.neo_vm().oep4()
        oep4.set_contract_address(contract_address)
        private_key1 = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f'
        private_key2 = '75de8489fcb2dcaf2ef3cd607feffde18789de7da129b5e97c81e001793cb7cf'
        private_key3 = '1383ed1fe570b6673351f1a30a66b21204918ef8f673e864769fa2a653401114'
        spender_acct = Account(private_key2, SignatureScheme.SHA256withECDSA)

        from_acct = Account(private_key1, SignatureScheme.SHA256withECDSA)
        hex_from_address = from_acct.get_address_hex()

        to_acct = Account(private_key3, SignatureScheme.SHA256withECDSA)
        hex_to_address = to_acct.get_address_hex()
        b58_to_address = to_acct.get_address_base58()

        gas_limit = 20000000
        gas_price = 500
        value = 1
        tx_hash = oep4.transfer_from(spender_acct, from_acct, b58_to_address,
                                     value, from_acct, gas_limit, gas_price)
        self.assertEqual(64, len(tx_hash))
        sdk = OntologySdk()
        sdk.set_rpc(remote_rpc_address)
        time.sleep(6)
        try:
            event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
            notify = event['Notify'][0]
            self.assertEqual(2, len(notify))
            self.assertEqual(hex_from_address, notify['States'][0])
            self.assertEqual(hex_to_address, notify['States'][1])
            self.assertEqual('01', notify['States'][2])
        except SDKException as e:
            raised = False
            self.assertTrue(raised, e)
Exemplo n.º 9
0
 def test_approve(self):
     sdk = OntologySdk()
     sdk.set_rpc(remote_rpc_address)
     contract_address = '1ddbb682743e9d9e2b71ff419e97a9358c5c4ee9'
     oep4 = sdk.neo_vm().oep4()
     oep4.set_contract_address(contract_address)
     private_key1 = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f'
     private_key2 = '75de8489fcb2dcaf2ef3cd607feffde18789de7da129b5e97c81e001793cb7cf'
     owner_acct = Account(private_key1, SignatureScheme.SHA256withECDSA)
     hex_owner_address = owner_acct.get_address_hex()
     spender = Account(private_key2, SignatureScheme.SHA256withECDSA)
     b58_spender_address = spender.get_address_base58()
     hex_spender_address = spender.get_address_hex()
     amount = 100
     gas_limit = 20000000
     gas_price = 500
     tx_hash = oep4.approve(owner_acct, b58_spender_address, amount, owner_acct, gas_limit, gas_price)
     self.assertEqual(len(tx_hash), 64)
     sdk = OntologySdk()
     sdk.set_rpc(remote_rpc_address)
     time.sleep(6)
     try:
         decimal = oep4.get_decimal()
         event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
         notify = event['Notify'][0]
         states = notify['States']
         self.assertEqual('approval', bytes.fromhex(states[0]).decode())
         self.assertEqual(hex_owner_address, states[1])
         self.assertEqual(hex_spender_address, states[2])
         array = bytearray(binascii.a2b_hex(states[3].encode('ascii')))
         array.reverse()
         notify_value = int(binascii.b2a_hex(array).decode('ascii'), 16)
         self.assertEqual((10 ** decimal) * amount, notify_value)
     except SDKException as e:
         raised = False
         self.assertTrue(raised, e)
    def test_transfer_from(self):
        sdk = OntologySdk()
        sdk.set_rpc(local_rpc_address)
        oep4 = sdk.neo_vm().oep4()
        oep4.set_contract_address(contract_address)
        private_key1 = "5f2fe68215476abb9852cfa7da31ef00aa1468782d5ca809da5c4e1390b8ee45"
        private_key2 = "f00dd7f5356e8aee93a049bdccc44ce91169e07ea3bec9f4e0142e456fd39bae"
        private_key3 = "da213fb4cb1b12269c20307dadda35a7c89869c0c791b777fd8618d4159db99c"
        spender_acct = Account(private_key2, SignatureScheme.SHA256withECDSA)

        from_acct = Account(private_key1, SignatureScheme.SHA256withECDSA)
        hex_from_address = from_acct.get_address_hex()

        to_acct = Account(private_key3, SignatureScheme.SHA256withECDSA)
        hex_to_address = to_acct.get_address_hex()
        b58_to_address = to_acct.get_address_base58()

        gas_limit = 20000000
        gas_price = 0
        value = 1
        tx_hash = oep4.transfer_from(spender_acct, from_acct, b58_to_address,
                                     value, from_acct, gas_limit, gas_price)
        self.assertEqual(64, len(tx_hash))
        sdk = OntologySdk()
        sdk.set_rpc(local_rpc_address)
        time.sleep(6)
        try:
            event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
            notify = event['Notify'][0]
            self.assertEqual(2, len(notify))
            self.assertEqual(hex_from_address, notify['States'][1])
            self.assertEqual(hex_to_address, notify['States'][2])
            self.assertEqual('01', notify['States'][3])
        except SDKException as e:
            raised = False
            self.assertTrue(raised, e)
Exemplo n.º 11
0
 def test_get_address_hex(self):
     hex_private_key = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f'
     account = Account(hex_private_key, SignatureScheme.SHA256withECDSA)
     hex_address = '4756c9dd829b2142883adbe1ae4f8689a1f673e9'
     self.assertEqual(hex_address, account.get_address_hex())
Exemplo n.º 12
0
 def test_get_address_hex_reverse(self):
     hex_private_key = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f'
     account = Account(hex_private_key, SignatureScheme.SHA256withECDSA)
     hex_reverse_address = 'e973f6a189864faee1db3a8842219b82ddc95647'
     self.assertEqual(hex_reverse_address,
                      account.get_address_hex(little_endian=False))
Exemplo n.º 13
0
    def test_add_recovery(self):
        identity = sdk.wallet_manager.create_identity(password)
        ctrl_acct = sdk.wallet_manager.get_control_account_by_index(
            identity.ont_id, 0, password)
        tx_hash = sdk.native_vm.ont_id().registry_ont_id(
            identity.ont_id, ctrl_acct, acct3, self.gas_price, self.gas_limit)
        self.assertEqual(64, len(tx_hash))
        time.sleep(randint(10, 15))
        event = sdk.default_network.get_contract_event_by_tx_hash(tx_hash)
        hex_contract_address = sdk.native_vm.ont_id().contract_address
        notify = Event.get_notify_by_contract_address(event,
                                                      hex_contract_address)
        self.assertEqual(hex_contract_address, notify['ContractAddress'])
        self.assertEqual('Register', notify['States'][0])
        self.assertEqual(identity.ont_id, notify['States'][1])

        rand_private_key = utils.get_random_bytes(32).hex()
        recovery = Account(rand_private_key, SignatureScheme.SHA256withECDSA)
        b58_recovery_address = recovery.get_address_base58()
        tx_hash = sdk.native_vm.ont_id().add_recovery(identity.ont_id,
                                                      ctrl_acct,
                                                      b58_recovery_address,
                                                      acct2, self.gas_price,
                                                      self.gas_limit)
        time.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(hex_contract_address, notify['ContractAddress'])
        self.assertEqual('Recovery', notify['States'][0])
        self.assertEqual('add', notify['States'][1])
        self.assertEqual(identity.ont_id, notify['States'][2])
        self.assertEqual(recovery.get_address_hex(little_endian=False),
                         notify['States'][3])
        ddo = sdk.native_vm.ont_id().get_ddo(identity.ont_id)
        self.assertIn(ctrl_acct.get_ont_id(), ddo['Owners'][0]['PubKeyId'])
        self.assertEqual('ECDSA', ddo['Owners'][0]['Type'])
        self.assertEqual('P256', ddo['Owners'][0]['Curve'])
        self.assertEqual(ctrl_acct.get_public_key_hex(),
                         ddo['Owners'][0]['Value'])
        self.assertEqual(0, len(ddo['Attributes']))
        self.assertEqual(recovery.get_address_base58(), ddo['Recovery'])
        self.assertEqual(identity.ont_id, ddo['OntId'])

        rand_private_key = utils.get_random_bytes(32).hex()
        new_recovery = Account(rand_private_key,
                               SignatureScheme.SHA256withECDSA)
        b58_new_recovery_address = new_recovery.get_address_base58()
        try:
            sdk.native_vm.ont_id().add_recovery(identity.ont_id, ctrl_acct,
                                                b58_new_recovery_address,
                                                acct2, self.gas_price,
                                                self.gas_limit)
        except SDKException as e:
            self.assertIn('already set recovery', e.args[1])

        private_key = utils.get_random_bytes(32)
        public_key = Signature.ec_get_public_key_by_private_key(
            private_key, Curve.P256)
        hex_new_public_key = public_key.hex()
        tx_hash = sdk.native_vm.ont_id().add_public_key(
            identity.ont_id, recovery, hex_new_public_key, acct2,
            self.gas_price, self.gas_limit, True)
        time.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(hex_contract_address, notify['ContractAddress'])
        self.assertEqual('PublicKey', notify['States'][0])
        self.assertEqual('add', notify['States'][1])
        self.assertEqual(identity.ont_id, notify['States'][2])
        self.assertEqual(2, notify['States'][3])
        self.assertEqual(hex_new_public_key, notify['States'][4])

        ddo = sdk.native_vm.ont_id().get_ddo(identity.ont_id)
        self.assertIn(ctrl_acct.get_ont_id(), ddo['Owners'][0]['PubKeyId'])
        self.assertEqual('ECDSA', ddo['Owners'][0]['Type'])
        self.assertEqual('P256', ddo['Owners'][0]['Curve'])
        self.assertEqual(ctrl_acct.get_public_key_hex(),
                         ddo['Owners'][0]['Value'])
        self.assertIn(ctrl_acct.get_ont_id(), ddo['Owners'][1]['PubKeyId'])
        self.assertEqual('ECDSA', ddo['Owners'][1]['Type'])
        self.assertEqual('P256', ddo['Owners'][1]['Curve'])
        self.assertEqual(hex_new_public_key, ddo['Owners'][1]['Value'])
        self.assertEqual(0, len(ddo['Attributes']))
        self.assertEqual(recovery.get_address_base58(), ddo['Recovery'])
        self.assertEqual(identity.ont_id, ddo['OntId'])
        self.assertEqual(b58_recovery_address, ddo['Recovery'])

        tx_hash = sdk.native_vm.ont_id().revoke_public_key(
            identity.ont_id, recovery, hex_new_public_key, acct3,
            self.gas_price, self.gas_limit, True)
        time.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.assertIn('PublicKey', notify['States'])
        self.assertIn('remove', notify['States'])
        self.assertIn(identity.ont_id, notify['States'])
        self.assertIn(hex_new_public_key, notify['States'])
        try:
            sdk.native_vm.ont_id().revoke_public_key(identity.ont_id, recovery,
                                                     hex_new_public_key, acct3,
                                                     self.gas_price,
                                                     self.gas_limit, True)
        except SDKException as e:
            self.assertIn('public key has already been revoked', e.args[1])

        private_key = utils.get_random_bytes(32)
        public_key = Signature.ec_get_public_key_by_private_key(
            private_key, Curve.P256)
        hex_new_public_key = public_key.hex()
        try:
            sdk.native_vm.ont_id().add_public_key(identity.ont_id,
                                                  new_recovery,
                                                  hex_new_public_key, acct2,
                                                  self.gas_price,
                                                  self.gas_limit, True)
        except SDKException as e:
            self.assertIn('no authorization', e.args[1])