def test_tracking(self):
        address1 = create_unique_address(get_exchange_account_id())
        address2 = create_unique_address("lykke-test")
        addr2s = split_unique_address(address2)

        self.storage.track_address(address1)

        self.assertRaises(AddressAlreadyTrackedException,
                          self.storage.track_address, address1)

        self.storage.track_address(address2)

        filled_operation = self.get_completed_op()
        filled_operation["to"] = addr2s["account_id"]
        filled_operation["customer_id"] = addr2s["customer_id"]
        filled_operation["amount_asset_id"] = "1.3.4123"
        filled_operation["amount_value"] = 1234
        self.storage.insert_operation(filled_operation)

        balances = self.storage.get_balances(2)

        assert address1 not in balances.keys()
        assert address2 in balances.keys()
        assert balances[address2]["1.3.4123"] == 1234

        self.storage.untrack_address(address1)

        self.assertRaises(AddressNotTrackedException,
                          self.storage.untrack_address, address1)
Example #2
0
    def test_split_address(self):
        unique_wallet = create_unique_address(
            utils.get_exchange_account_id(),
            lambda: "9ed8c906-d6ab-4fb8-a314-0516a175717a")

        address = split_unique_address(unique_wallet)

        assert address["account_id"] == utils.get_exchange_account_id()
Example #3
0
    def test_wallet(self):
        response = self.client.post(url_for('Blockchain.SignService.wallets'))

        response = response.json

        if Config.get("bitshares", "keep_keys_private", True):
            self.assertEqual(response["privateKey"], "keep_keys_private")
        else:
            self.assertEqual(
                response["privateKey"],
                Config.get("bitshares", "exchange_account_active_key"))

        addrs = split_unique_address(response["publicAddress"])

        self.assertEqual(addrs["account_id"],
                         Config.get("bitshares", "exchange_account_id"))

        self.assertEqual(len(addrs["customer_id"]), 36)
    def test_get_balance(self):
        address = create_unique_address(get_exchange_account_id())
        addrs = split_unique_address(address)
        asset = "1.3.131"

        self.storage.track_address(address)

        filled_operation = self.get_completed_op()
        filled_operation["to"] = addrs["account_id"]
        filled_operation["amount_asset_id"] = asset
        filled_operation["customer_id"] = addrs["customer_id"]

        filled_operation["incident_id"] = "some_operation_id_1"
        filled_operation["chain_identifier"] = "some_chain_identifier_1"
        filled_operation["amount_value"] = 10
        self.storage.insert_operation(filled_operation)

        filled_operation["incident_id"] = "some_operation_id_2"
        filled_operation["chain_identifier"] = "some_chain_identifier_2"
        filled_operation["amount_value"] = 20
        self.storage.insert_operation(filled_operation)

        filled_operation["incident_id"] = "some_operation_id_3"
        filled_operation["chain_identifier"] = "some_chain_identifier_3"
        filled_operation["amount_value"] = -5
        self.storage.insert_operation(filled_operation)

        filled_operation["from"] = addrs["account_id"]
        filled_operation["to"] = get_exchange_account_id()

        filled_operation["incident_id"] = "some_operation_id_4"
        filled_operation["chain_identifier"] = "some_chain_identifier_4"
        filled_operation["amount_value"] = 7
        self.storage.insert_operation(filled_operation)

        balances = self.storage.get_balances(2)

        assert balances[address][asset] == 18

        self.assertRaises(InputInvalidException, self.storage.get_balances, 2,
                          "ยง=)$")

        self.assertRaises(InputInvalidException, self.storage.get_balances, 2,
                          "069548")
Example #5
0
    def test_track_balance(self, bitshares_instance=None):
        store = factory.get_operation_storage(purge=True)

        addressDW = self.client.post(
            url_for('Blockchain.SignService.wallets')).json["publicAddress"]

        addressEW = create_unique_address(self.get_customer_id(), "")

        addressHW = self.client.post(
            url_for('Blockchain.SignService.wallets')).json["publicAddress"]

        #         customer_id = split_unique_address(addressDW)["customer_id"]

        response = self.client.get(
            url_for('Blockchain.Api.address_validity', address=addressDW))
        assert response.status_code == 200

        response = self.client.post(
            url_for('Blockchain.Api.observe_address', address=addressDW))
        assert response.status_code == 200

        response = self.client.post(
            url_for('Blockchain.Api.observe_address', address=addressHW))
        assert response.status_code == 200

        def build_sign_and_broadcast(op, memo_key, active_key):
            op["fromAddressContext"] = memo_key
            transaction = self.client.post(
                url_for('Blockchain.Api.build_transaction'),
                data=json.dumps(op))

            assert transaction.status_code == 200

            sign_transaction = {
                "transactionContext": transaction.json["transactionContext"],
                "privateKeys": [active_key]
            }
            signed_transaction = self.client.post(
                url_for('Blockchain.SignService.sign'),
                data=json.dumps(sign_transaction))
            broadcast_transaction = {
                "operationId": op["operationId"],
                "signedTransaction":
                signed_transaction.json["signedTransaction"]
            }
            broadcast = self.client.post(
                url_for('Blockchain.Api.broadcast_transaction'),
                data=json.dumps(broadcast_transaction))
            assert broadcast.status_code == 200

            print(broadcast_transaction)

            return broadcast.json["block"]

        def flag_completed(block_num):
            network = Config.get("network_type")
            connection = Config.get("bitshares", "connection", network)
            #             connection["keys"] = key
            instance = BitShares(**connection)

            irr = instance.rpc.get_dynamic_global_properties().get(
                "last_irreversible_block_num")
            head = instance.rpc.get_dynamic_global_properties().get(
                "head_block_number")

            print("Blockchain Monitor: Looking for block " + str(block_num),
                  ", current head=" + str(head) + ", irreversible=" + str(irr))

            monitor = BlockchainMonitor(storage=store,
                                        bitshares_instance=instance)
            monitor.start_block = block_num - 1
            monitor.stop_block = block_num + 1
            monitor.listen()

        block_num = build_sign_and_broadcast(
            {
                "operationId": "cbeea30e-2218-4405-9089-86d003e4df60",
                "fromAddress": addressEW,
                "toAddress": addressDW,
                "assetId": "1.3.0",
                "amount": 110000,
                "includeFee": False
            }, self.get_customer_memo_key(), self.get_customer_active_key())
        flag_completed(block_num)

        response = self.client.get(
            url_for('Blockchain.Api.get_balances') + "?take=2")
        assert response.status_code == 200
        self.assertEqual(response.json["items"], [{
            'address': addressDW,
            'assetId': '1.3.0',
            'balance': 110000,
            'block': block_num * 10
        }])

        block_num = build_sign_and_broadcast(
            {
                "operationId": "cbeea30e-2218-4405-9089-86d003e4df61",
                "fromAddress": addressDW,
                "toAddress": addressHW,
                "assetId": "1.3.0",
                "amount": 100000,
                "includeFee": True
            }, utils.get_exchange_memo_key(), utils.get_exchange_active_key())

        response = self.client.get(
            url_for('Blockchain.Api.get_balances') + "?take=2")
        assert response.status_code == 200
        self.assertEqual(response.json["items"][0]["balance"], 10000)
        assert block_num > 0

        balance_block_num = block_num

        response = self.client.get(
            url_for('Blockchain.Api.get_broadcasted_transaction',
                    operationId="cbeea30e-2218-4405-9089-86d003e4df61"))
        self.assertEqual(response.json["block"], block_num * 10)

        WW = create_unique_address(self.get_customer_id(), "some_user_memo")

        block_num = build_sign_and_broadcast(
            {
                "operationId": "cbeea30e-2218-4405-9089-86d003e4df62",
                "fromAddress": addressHW,
                "toAddress": WW,
                "assetId": "1.3.0",
                "amount": 100000,
                "includeFee": True
            }, utils.get_exchange_memo_key(), utils.get_exchange_active_key())
        flag_completed(block_num)

        response = self.client.get(
            url_for('Blockchain.Api.get_balances') + "?take=2")
        assert response.status_code == 200
        self.assertEqual(response.json["items"],
                         [{
                             'address': addressDW,
                             'assetId': '1.3.0',
                             'balance': 10000,
                             'block': balance_block_num * 10
                         }])

        self.maxDiff = None

        toDW = self.client.get(
            url_for('Blockchain.Api.get_address_history_to', address=addressDW)
            + "?take=3")
        assert toDW.status_code == 200
        self.assertEqual(toDW.json, [{
            'amount': '110000',
            'assetId': '1.3.0',
            'fromAddress': addressEW,
            'hash': toDW.json[0]['hash'],
            'timestamp': toDW.json[0]['timestamp'],
            'toAddress': addressDW
        }])

        fromDW = self.client.get(
            url_for('Blockchain.Api.get_address_history_from',
                    address=addressDW) + "?take=3")
        assert fromDW.status_code == 200
        self.assertEqual(fromDW.json, [{
            'amount': '100000',
            'assetId': '1.3.0',
            'fromAddress': addressDW,
            'hash': fromDW.json[0]['hash'],
            'timestamp': fromDW.json[0]['timestamp'],
            'toAddress': 'lykke-test'
        }])

        toHW = self.client.get(
            url_for('Blockchain.Api.get_address_history_to', address=addressHW)
            + "?take=3")
        assert toHW.status_code == 200
        assert toHW.json == []

        fromHW = self.client.get(
            url_for('Blockchain.Api.get_address_history_from',
                    address=split_unique_address(addressHW)["account_id"]) +
            "?take=3")
        assert fromHW.status_code == 200
        self.assertEqual(fromHW.json,
                         [{
                             'amount': '99900',
                             'assetId': '1.3.0',
                             'fromAddress': get_exchange_account_name(),
                             'hash': fromHW.json[0]['hash'],
                             'timestamp': fromHW.json[0]['timestamp'],
                             'toAddress': WW
                         }])

        response = self.client.get(
            url_for('Blockchain.Api.get_broadcasted_transaction',
                    operationId="cbeea30e-2218-4405-9089-86d003e4df60"))
        assert response.status_code == 200
        self.assertEqual(response.json['operationId'],
                         'cbeea30e-2218-4405-9089-86d003e4df60')

        response = self.client.get(
            url_for('Blockchain.Api.get_broadcasted_transaction',
                    operationId="cbeea30e-2218-4405-9089-86d003e4df61"))
        assert response.status_code == 200
        self.assertEqual(response.json['operationId'],
                         'cbeea30e-2218-4405-9089-86d003e4df61')

        response = self.client.get(
            url_for('Blockchain.Api.get_broadcasted_transaction',
                    operationId="cbeea30e-2218-4405-9089-86d003e4df62"))
        assert response.status_code == 200
        self.assertEqual(response.json['operationId'],
                         'cbeea30e-2218-4405-9089-86d003e4df62')

        response = self.client.delete(
            url_for('Blockchain.Api.unobserve_address', address=addressDW))
        assert response.status_code == 200

        response = self.client.delete(
            url_for('Blockchain.Api.unobserve_address', address=addressHW))
        assert response.status_code == 200

        response = self.client.get(
            url_for('Blockchain.Api.get_balances') + "?take=2")
        assert response.status_code == 200
        self.assertEqual(response.json["items"], [])