def test_build_transaction(self):
        from_id = utils.get_exchange_account_id()
        from_memo_key = utils.get_exchange_memo_key()
        tx = implementations.build_transaction(
            "cbeea30e-2218-4405-9089-86d003e4df88",
            from_id + DELIMITER + "from_customer_id", from_memo_key,
            self.get_customer_id() + DELIMITER + "to_customer_id", "1.3.0",
            10000, False)

        tx = json.loads(tx["transactionContext"])

        self.assertEqual(len(tx["operations"]), 1)
        self.assertEqual(
            tx["operations"][0][0],
            0  # transfer
        )
        op = tx["operations"][0][1]
        self.assertEqual(
            op["from"],
            from_id,  # lykkee account id
            "1.2.397770",  # blockchainbv account
        )

        self.assertEqual(op["amount"]["asset_id"], "1.3.0")

        self.assertEqual(op["amount"]["amount"], 10000)

        self.assertGreater(op["fee"]["amount"], 0)
    def test_broadcast_transaction(self):
        from_id = utils.get_exchange_account_id()
        from_memo_key = utils.get_exchange_memo_key()
        tx = manage_service.implementations.build_transaction(
            "cbeea30e-2218-4405-9089-86d003e4df84",
            from_id + DELIMITER + "from_customer_id", from_memo_key,
            self.get_customer_id() + DELIMITER + "to_customer_id", "1.3.0",
            100000, False)

        stx = sign_service.implementations.sign(
            tx["transactionContext"], [utils.get_exchange_active_key()])

        implementations.broadcast_transaction(stx["signedTransaction"])
    def test_build_transaction2(self):
        from_id = utils.get_exchange_account_id()
        from_memo_key = utils.get_exchange_memo_key()
        tx = implementations.build_transaction(
            "cbeea30e-2218-4405-9089-86d003e4df86",
            from_id + DELIMITER + "from_customer_id",
            from_memo_key,
            self.get_customer_id() + DELIMITER + "to_customer_id",
            "1.3.0",
            10000,
            True  # This changes behavior!!!!!!!!!!!!!!!
        )
        tx = json.loads(tx["transactionContext"])
        op = tx["operations"][0][1]
        self.assertLess(op["amount"]["amount"], 10000)

        self.assertGreater(op["fee"]["amount"], 0)
    def test_build_transaction_wrong_memo(self):
        from_id = "1.2.20139"
        from_memo_key = utils.get_exchange_memo_key()

        self.assertRaises(
            MemoMatchingFailedException, implementations.build_transaction,
            "cbeea30e-2218-4405-9089-86d003e4df40",
            from_id + DELIMITER + "from_customer_id", None,
            utils.get_exchange_account_id() + DELIMITER + "to_customer_id",
            "1.3.0", 10000, False)

        self.assertRaises(
            MemoMatchingFailedException, implementations.build_transaction,
            "cbeea30e-2218-4405-9089-86d003e4df30",
            from_id + DELIMITER + "from_customer_id", from_memo_key,
            utils.get_exchange_account_id() + DELIMITER + "to_customer_id",
            "1.3.0", 10000, False)
Exemplo n.º 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"], [])