Exemple #1
0
    async def test_orderbook_sync(self):
        """
        Test whether orderbooks are synchronized with a new node
        """
        await self.introduce_nodes()

        ask_order = await self.nodes[0].overlay.create_ask(
            AssetPair(AssetAmount(1, 'DUM1'), AssetAmount(2, 'DUM2')), 3600)
        bid_order = await self.nodes[1].overlay.create_bid(
            AssetPair(AssetAmount(1, 'DUM1'), AssetAmount(1, 'DUM2')), 3600)

        await self.deliver_messages(timeout=.5)

        # Add a node that crawls the matchmaker
        self.add_node_to_experiment(self.create_node())
        self.nodes[3].discovery.take_step()
        await self.deliver_messages(timeout=.5)
        await sleep(0.2)  # For processing the tick blocks

        self.assertTrue(self.nodes[3].overlay.order_book.get_tick(ask_order.order_id))
        self.assertTrue(self.nodes[3].overlay.order_book.get_tick(bid_order.order_id))

        # Add another node that crawls our newest node
        self.add_node_to_experiment(self.create_node())
        self.nodes[4].overlay.send_orderbook_sync(self.nodes[3].overlay.my_peer)
        await self.deliver_messages(timeout=.5)
        await sleep(0.2)  # For processing the tick blocks

        self.assertTrue(self.nodes[4].overlay.order_book.get_tick(ask_order.order_id))
        self.assertTrue(self.nodes[4].overlay.order_book.get_tick(bid_order.order_id))
    def from_database(cls, data, payments):
        """
        Create a Transaction object based on information in the database.
        """
        (trader_id, transaction_id, order_number, partner_trader_id, partner_order_number,
         asset1_amount, asset1_type, asset1_transferred, asset2_amount, asset2_type, asset2_transferred,
         transaction_timestamp, sent_wallet_info, received_wallet_info, incoming_address, outgoing_address,
         partner_incoming_address, partner_outgoing_address) = data

        transaction_id = TransactionId(bytes(transaction_id))
        transaction = cls(transaction_id,
                          AssetPair(AssetAmount(asset1_amount, str(asset1_type)),
                                    AssetAmount(asset2_amount, str(asset2_type))),
                          OrderId(TraderId(bytes(trader_id)), OrderNumber(order_number)),
                          OrderId(TraderId(bytes(partner_trader_id)), OrderNumber(partner_order_number)),
                          Timestamp(transaction_timestamp))

        transaction._transferred_assets = AssetPair(AssetAmount(asset1_transferred, str(asset1_type)),
                                                    AssetAmount(asset2_transferred, str(asset2_type)))
        transaction.sent_wallet_info = sent_wallet_info
        transaction.received_wallet_info = received_wallet_info
        transaction.incoming_address = WalletAddress(str(incoming_address))
        transaction.outgoing_address = WalletAddress(str(outgoing_address))
        transaction.partner_incoming_address = WalletAddress(str(partner_incoming_address))
        transaction.partner_outgoing_address = WalletAddress(str(partner_outgoing_address))
        transaction._payments = payments

        return transaction
Exemple #3
0
    async def test_clearing_policy_pending_trade_accept(self):
        """
        Test whether we accept trade with a counterparty who is currently involved in another trade
        We make node 0 malicious, in other words, it does not send a payment back.
        """
        clearing_policy = SingleTradeClearingPolicy(self.nodes[2].overlay, max_concurrent_trades=1)
        self.nodes[2].overlay.clearing_policies.append(clearing_policy)

        await self.introduce_nodes()

        transfer_future = Future()

        self.nodes[0].overlay.wallets['DUM1'].transfer = lambda *_: transfer_future
        self.nodes[0].overlay.wallets['DUM2'].transfer = lambda *_: transfer_future

        order1 = await self.nodes[0].overlay.create_bid(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')), 3600)
        order2 = await self.nodes[1].overlay.create_ask(
            AssetPair(AssetAmount(15, 'DUM1'), AssetAmount(15, 'DUM2')), 3600)

        await sleep(0.5)

        # The trade should not be finished
        self.assertEqual(order1.status, "open")
        self.assertEqual(order2.status, "open")

        # Check that we can trade with the other party
        await self.nodes[2].overlay.create_bid(AssetPair(AssetAmount(5, 'DUM1'), AssetAmount(5, 'DUM2')), 3600)
        await sleep(0.5)
        self.assertTrue(list(self.nodes[2].overlay.transaction_manager.find_all()))
        transfer_future.set_result("a")
Exemple #4
0
    async def test_match_window_multiple(self):
        """
        Test whether multiple ask orders in the matching window will get matched
        """
        await self.introduce_nodes()

        self.nodes[2].overlay.settings.match_window = 0.5  # Wait 1 sec before accepting (the best) match

        order1 = await self.nodes[0].overlay.create_bid(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')), 3600)
        order2 = await self.nodes[1].overlay.create_bid(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')), 3600)

        await sleep(0.3)

        # Make sure that the two matchmaker match different orders
        order1_tick = self.nodes[3].overlay.order_book.get_tick(order1.order_id)
        order2_tick = self.nodes[4].overlay.order_book.get_tick(order2.order_id)
        order1_tick.available_for_matching = 0
        order2_tick.available_for_matching = 0

        await self.nodes[2].overlay.create_ask(AssetPair(AssetAmount(20, 'DUM1'), AssetAmount(20, 'DUM2')), 3600)

        await sleep(1.5)

        # Verify that the trade has been made
        self.assertEqual(len(list(self.nodes[0].overlay.transaction_manager.find_all())), 1)
        self.assertEqual(len(list(self.nodes[1].overlay.transaction_manager.find_all())), 1)
        self.assertEqual(len(list(self.nodes[2].overlay.transaction_manager.find_all())), 2)
Exemple #5
0
    def setUp(self):
        yield super(MatchingEngineTestSuite, self).setUp()
        # Object creation
        self.ask = Ask(
            OrderId(TraderId(b'2' * 20), OrderNumber(1)),
            AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')),
            Timeout(30), Timestamp.now())
        self.bid = Bid(
            OrderId(TraderId(b'4' * 20), OrderNumber(2)),
            AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')),
            Timeout(30), Timestamp.now())
        self.ask_order = Order(
            OrderId(TraderId(b'5' * 20), OrderNumber(3)),
            AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')),
            Timeout(30), Timestamp.now(), True)
        self.bid_order = Order(
            OrderId(TraderId(b'6' * 20), OrderNumber(4)),
            AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')),
            Timeout(30), Timestamp.now(), False)
        self.order_book = OrderBook()
        self.matching_engine = MatchingEngine(
            PriceTimeStrategy(self.order_book))

        self.ask_count = 2
        self.bid_count = 2
 def get_tx_done_block(ask_amount, bid_amount, traded_amount,
                       ask_total_traded, bid_total_traded):
     ask_pair = AssetPair(AssetAmount(ask_amount, 'BTC'),
                          AssetAmount(ask_amount, 'MB'))
     bid_pair = AssetPair(AssetAmount(bid_amount, 'BTC'),
                          AssetAmount(bid_amount, 'MB'))
     ask = Order(OrderId(TraderId(b'0' * 20), OrderNumber(1)), ask_pair,
                 Timeout(3600), Timestamp.now(), True)
     ask._traded_quantity = ask_total_traded
     bid = Order(OrderId(TraderId(b'1' * 20), OrderNumber(1)), bid_pair,
                 Timeout(3600), Timestamp.now(), False)
     bid._traded_quantity = bid_total_traded
     tx = Transaction(
         TransactionId(b'a' * 32),
         AssetPair(AssetAmount(traded_amount, 'BTC'),
                   AssetAmount(traded_amount, 'MB')),
         OrderId(TraderId(b'0' * 20), OrderNumber(1)),
         OrderId(TraderId(b'1' * 20), OrderNumber(1)), Timestamp(0))
     tx.transferred_assets.first += AssetAmount(traded_amount, 'BTC')
     tx.transferred_assets.second += AssetAmount(traded_amount, 'MB')
     tx_done_block = MarketBlock()
     tx_done_block.type = b'tx_done'
     tx_done_block.transaction = {
         'ask': ask.to_status_dictionary(),
         'bid': bid.to_status_dictionary(),
         'tx': tx.to_block_dictionary(),
         'version': MarketCommunity.PROTOCOL_VERSION
     }
     tx_done_block.transaction['ask']['address'], tx_done_block.transaction[
         'ask']['port'] = "1.1.1.1", 1234
     tx_done_block.transaction['bid']['address'], tx_done_block.transaction[
         'bid']['port'] = "1.1.1.1", 1234
     return tx_done_block
Exemple #7
0
    def test_from_network(self):
        # Test for from network
        data = ProposedTrade.from_network(
            type(
                'Data', (object, ), {
                    "trader_id":
                    TraderId(b'0' * 20),
                    "order_number":
                    OrderNumber(1),
                    "recipient_order_id":
                    OrderId(TraderId(b'1' * 20), OrderNumber(2)),
                    "proposal_id":
                    1234,
                    "timestamp":
                    Timestamp(1462224447117),
                    "assets":
                    AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB'))
                }))

        self.assertEquals(TraderId(b'0' * 20), data.trader_id)
        self.assertEquals(OrderId(TraderId(b'0' * 20), OrderNumber(1)),
                          data.order_id)
        self.assertEquals(OrderId(TraderId(b'1' * 20), OrderNumber(2)),
                          data.recipient_order_id)
        self.assertEquals(1234, data.proposal_id)
        self.assertEquals(
            AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')),
            data.assets)
        self.assertEquals(Timestamp(1462224447117), data.timestamp)
    def test_e2e_trade(self):
        """
        Test a direct trade between two nodes
        """
        yield self.introduce_nodes()

        order1 = yield self.nodes[0].overlay.create_ask(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(13, 'DUM2')), 3600)
        order2 = yield self.nodes[1].overlay.create_bid(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(13, 'DUM2')), 3600)

        yield self.sleep(0.5)

        # Verify that the trade has been made
        self.assertEqual(order1.status, "completed")
        self.assertEqual(order2.status, "completed")

        self.assertTrue(
            list(self.nodes[0].overlay.transaction_manager.find_all()))
        self.assertTrue(
            list(self.nodes[1].overlay.transaction_manager.find_all()))

        balance1 = yield self.nodes[0].overlay.wallets['DUM1'].get_balance()
        balance2 = yield self.nodes[0].overlay.wallets['DUM2'].get_balance()
        self.assertEqual(balance1['available'], 990)
        self.assertEqual(balance2['available'], 10013)

        balance1 = yield self.nodes[1].overlay.wallets['DUM1'].get_balance()
        balance2 = yield self.nodes[1].overlay.wallets['DUM2'].get_balance()
        self.assertEqual(balance1['available'], 1010)
        self.assertEqual(balance2['available'], 9987)
    def test_partial_match(self):
        """
        Test matchmaking with partial orders
        """
        yield self.introduce_nodes()

        self.nodes[0].overlay.create_ask(
            AssetPair(AssetAmount(5, 'DUM1'), AssetAmount(5, 'DUM2')), 3600)
        self.nodes[1].overlay.create_ask(
            AssetPair(AssetAmount(5, 'DUM1'), AssetAmount(5, 'DUM2')), 3600)

        yield self.sleep(0.5)

        self.nodes[2].overlay.create_bid(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')), 3600)

        yield self.sleep(0.5)

        # Verify that the trade has been made
        self.assertEqual(
            len(list(self.nodes[0].overlay.transaction_manager.find_all())), 1)
        self.assertEqual(
            len(list(self.nodes[1].overlay.transaction_manager.find_all())), 1)
        self.assertEqual(
            len(list(self.nodes[2].overlay.transaction_manager.find_all())), 2)
    async def setUp(self):
        super(TestDatabase, self).setUp()

        path = os.path.join(self.getStateDir(), 'sqlite')
        if not os.path.exists(path):
            os.makedirs(path)

        self.database = MarketDB(self.getStateDir(), 'market')

        self.order_id1 = OrderId(TraderId(b'3' * 20), OrderNumber(4))
        self.order_id2 = OrderId(TraderId(b'4' * 20), OrderNumber(5))
        self.order1 = Order(
            self.order_id1,
            AssetPair(AssetAmount(5, 'BTC'), AssetAmount(6, 'EUR')),
            Timeout(3600), Timestamp.now(), True)
        self.order2 = Order(
            self.order_id2,
            AssetPair(AssetAmount(5, 'BTC'), AssetAmount(6, 'EUR')),
            Timeout(3600), Timestamp.now(), False)
        self.order2.reserve_quantity_for_tick(
            OrderId(TraderId(b'3' * 20), OrderNumber(4)), 3)

        self.transaction_id1 = TransactionId(b'a' * 32)
        self.transaction1 = Transaction(
            self.transaction_id1,
            AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MB')),
            OrderId(TraderId(b'0' * 20), OrderNumber(1)),
            OrderId(TraderId(b'1' * 20), OrderNumber(2)), Timestamp(20000))

        self.payment1 = Payment(TraderId(b'0' * 20), self.transaction_id1,
                                AssetAmount(5, 'BTC'), WalletAddress('abc'),
                                WalletAddress('def'), PaymentId("abc"),
                                Timestamp(20000))

        self.transaction1.add_payment(self.payment1)
    def test_partial_trade(self):
        """
        Test a partial trade between two nodes with a matchmaker
        """
        yield self.introduce_nodes()

        yield self.nodes[0].overlay.create_ask(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')), 3600)
        yield self.nodes[1].overlay.create_bid(
            AssetPair(AssetAmount(2, 'DUM1'), AssetAmount(2, 'DUM2')), 3600)

        yield self.sleep(0.5)

        # Verify that the trade has been made
        self.assertTrue(
            list(self.nodes[0].overlay.transaction_manager.find_all()))
        self.assertTrue(
            list(self.nodes[1].overlay.transaction_manager.find_all()))

        yield self.nodes[1].overlay.create_bid(
            AssetPair(AssetAmount(8, 'DUM1'), AssetAmount(8, 'DUM2')), 3600)

        yield self.sleep(1)

        # Verify that the trade has been made
        self.assertEqual(
            len(list(self.nodes[0].overlay.transaction_manager.find_all())), 2)
        self.assertEqual(
            len(list(self.nodes[1].overlay.transaction_manager.find_all())), 2)
Exemple #12
0
    def test_e2e_trade(self):
        """
        Test trading dummy tokens against bandwidth tokens between two persons, with a matchmaker
        """
        yield self.introduce_nodes()

        yield self.nodes[0].overlay.create_ask(
            AssetPair(AssetAmount(50, 'DUM1'), AssetAmount(50, 'MB')), 3600)
        yield self.nodes[1].overlay.create_bid(
            AssetPair(AssetAmount(50, 'DUM1'), AssetAmount(50, 'MB')), 3600)

        yield self.sleep(0.5)  # Give it some time to complete the trade

        # Verify that the trade has been made
        self.assertTrue(
            list(self.nodes[0].overlay.transaction_manager.find_all()))
        self.assertTrue(
            list(self.nodes[1].overlay.transaction_manager.find_all()))

        balance1 = yield self.nodes[0].overlay.wallets['DUM1'].get_balance()
        balance2 = yield self.nodes[0].overlay.wallets['MB'].get_balance()
        self.assertEqual(balance1['available'], 950)
        self.assertEqual(balance2['available'], 50)

        balance1 = yield self.nodes[1].overlay.wallets['DUM1'].get_balance()
        balance2 = yield self.nodes[1].overlay.wallets['MB'].get_balance()
        self.assertEqual(balance1['available'], 1050)
        self.assertEqual(balance2['available'], -50)
Exemple #13
0
    def test_e2e_trade_dht(self):
        """
        Test a full trade with (dummy assets), where both traders are not connected to each other
        """
        yield self.introduce_nodes()

        for node in self.nodes:
            for other in self.nodes:
                if other != node:
                    node.dht.walk_to(other.endpoint.wan_address)
        yield self.deliver_messages()

        # Remove the address from the mid registry from the trading peers
        self.nodes[0].overlay.mid_register.pop(
            TraderId(self.nodes[1].overlay.mid))
        self.nodes[1].overlay.mid_register.pop(
            TraderId(self.nodes[0].overlay.mid))

        for node in self.nodes:
            node.dht.store_peer()
        yield self.deliver_messages()

        yield self.nodes[0].overlay.create_ask(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')), 3600)
        yield self.nodes[1].overlay.create_bid(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')), 3600)

        yield self.sleep(0.5)

        # Verify that the trade has been made
        self.assertTrue(
            list(self.nodes[0].overlay.transaction_manager.find_all()))
        self.assertTrue(
            list(self.nodes[1].overlay.transaction_manager.find_all()))
Exemple #14
0
    def test_failing_payment(self):
        """
        Test trading between two persons when a payment fails
        """
        yield self.introduce_nodes()

        for node_nr in [0, 1]:
            self.nodes[node_nr].overlay.wallets[
                'DUM1'].transfer = lambda *_: fail(RuntimeError("oops"))
            self.nodes[node_nr].overlay.wallets[
                'DUM2'].transfer = lambda *_: fail(RuntimeError("oops"))

        yield self.nodes[0].overlay.create_ask(
            AssetPair(AssetAmount(1, 'DUM1'), AssetAmount(1, 'DUM2')), 3600)
        yield self.nodes[1].overlay.create_bid(
            AssetPair(AssetAmount(1, 'DUM1'), AssetAmount(1, 'DUM2')), 3600)

        yield self.sleep(0.5)

        self.assertEqual(
            list(self.nodes[0].overlay.transaction_manager.find_all())
            [0].status, "error")
        self.assertEqual(
            list(self.nodes[1].overlay.transaction_manager.find_all())
            [0].status, "error")
Exemple #15
0
    async def test_partial_trade(self):
        """
        Test a partial trade between two nodes
        """
        await self.introduce_nodes()

        await self.nodes[0].overlay.create_ask(AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')), 3600)
        await self.nodes[1].overlay.create_bid(AssetPair(AssetAmount(2, 'DUM1'), AssetAmount(2, 'DUM2')), 3600)

        await sleep(0.5)

        # Verify that the trade has been made
        transactions1 = list(self.nodes[0].overlay.transaction_manager.find_all())
        transactions2 = list(self.nodes[1].overlay.transaction_manager.find_all())
        self.assertEqual(len(transactions1), 1)
        self.assertEqual(len(transactions1[0].payments), 2)
        self.assertEqual(len(transactions2), 1)
        self.assertEqual(len(transactions2[0].payments), 2)

        await self.nodes[1].overlay.create_bid(AssetPair(AssetAmount(8, 'DUM1'), AssetAmount(8, 'DUM2')), 3600)

        await sleep(1)

        # Verify that the trade has been made
        self.assertEqual(len(list(self.nodes[0].overlay.transaction_manager.find_all())), 2)
        self.assertEqual(len(list(self.nodes[1].overlay.transaction_manager.find_all())), 2)

        for node_nr in [0, 1]:
            self.assertEqual(len(self.nodes[node_nr].overlay.order_book.asks), 0)
            self.assertEqual(len(self.nodes[node_nr].overlay.order_book.bids), 0)
Exemple #16
0
    async def test_clearing_policy_pending_trade_decline(self):
        """
        Test whether we are refusing to trade with a counterparty who is currently involved in another trade
        We make node 0 malicious, in other words, it does not send a payment back.
        """
        clearing_policy = SingleTradeClearingPolicy(self.nodes[2].overlay, max_concurrent_trades=1)
        self.nodes[2].overlay.clearing_policies.append(clearing_policy)

        await self.introduce_nodes()

        # Commit counterparty fraud by not transferring assets to the counterparty
        transfer_future = Future()

        self.nodes[0].overlay.wallets['DUM1'].transfer = lambda *_: transfer_future
        self.nodes[0].overlay.wallets['DUM2'].transfer = lambda *_: transfer_future

        order1 = await self.nodes[0].overlay.create_bid(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')), 3600)
        order2 = await self.nodes[1].overlay.create_ask(
            AssetPair(AssetAmount(5, 'DUM1'), AssetAmount(5, 'DUM2')), 3600)

        await sleep(0.5)

        # The trade should not be finished
        self.assertEqual(order1.status, "open")
        self.assertEqual(order2.status, "open")

        # Another node now tries to transact with node 0, which should not be accepted
        await self.nodes[2].overlay.create_ask(AssetPair(AssetAmount(5, 'DUM1'), AssetAmount(5, 'DUM2')), 3600)
        await sleep(0.5)
        self.assertFalse(list(self.nodes[2].overlay.transaction_manager.find_all()))
Exemple #17
0
 def setUp(self):
     # Object creation
     self.assetpair1 = AssetPair(AssetAmount(2, 'BTC'),
                                 AssetAmount(2, 'MB'))
     self.assetpair2 = AssetPair(AssetAmount(4, 'BTC'),
                                 AssetAmount(2, 'MB'))
     self.assetpair3 = AssetPair(AssetAmount(2, 'BTC'),
                                 AssetAmount(2, 'MB'))
 def setUp(self):
     # Object creation
     self.memory_order_repository = MemoryOrderRepository(b'0' * 20)
     self.order_id = OrderId(TraderId(b'0' * 20), OrderNumber(1))
     self.order = Order(self.order_id, AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MC')),
                        Timeout(0), Timestamp(10), False)
     self.order2 = Order(self.order_id, AssetPair(AssetAmount(1000, 'BTC'), AssetAmount(30, 'MC')),
                         Timeout(0), Timestamp(10), False)
 def setUp(self):
     order_id = OrderId(TraderId(b'3' * 20), OrderNumber(1))
     self.ask_order = Order(
         order_id, AssetPair(AssetAmount(5, 'BTC'), AssetAmount(6, 'EUR')),
         Timeout(3600), Timestamp.now(), True)
     self.bid_order = Order(
         order_id, AssetPair(AssetAmount(5, 'BTC'), AssetAmount(6, 'EUR')),
         Timeout(3600), Timestamp.now(), False)
     self.queue = MatchPriorityQueue(self.ask_order)
Exemple #20
0
    def setUp(self):
        # Object creation

        self.tick = Tick(OrderId(TraderId(b'0' * 20), OrderNumber(1)),
                         AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')),
                         Timeout(100), Timestamp.now(), True)
        self.tick2 = Tick(OrderId(TraderId(b'1' * 20), OrderNumber(2)),
                          AssetPair(AssetAmount(120, 'BTC'), AssetAmount(30, 'MB')),
                          Timeout(100), Timestamp.now(), True)
        self.side = Side()
Exemple #21
0
    def setUp(self):
        BaseTestCase.setUp(self)

        self.ask = Ask(
            OrderId(TraderId(b'0' * 20), OrderNumber(1)),
            AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')),
            Timeout(30), Timestamp(0), True)
        self.bid = Ask(
            OrderId(TraderId(b'1' * 20), OrderNumber(1)),
            AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')),
            Timeout(30), Timestamp(0), False)
        self.transaction = Transaction(
            TransactionId(TraderId(b'0' * 20), TransactionNumber(1)),
            AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')),
            OrderId(TraderId(b'0' * 20), OrderNumber(1)),
            OrderId(TraderId(b'1' * 20), OrderNumber(1)), Timestamp(0))

        ask_tx = self.ask.to_block_dict()
        bid_tx = self.bid.to_block_dict()

        self.tick_block = MarketBlock()
        self.tick_block.type = b'ask'
        self.tick_block.transaction = {'tick': ask_tx}

        self.cancel_block = MarketBlock()
        self.cancel_block.type = b'cancel_order'
        self.cancel_block.transaction = {
            'trader_id': 'a' * 20,
            'order_number': 1
        }

        self.tx_block = MarketBlock()
        self.tx_block.type = b'tx_init'
        self.tx_block.transaction = {
            'ask': ask_tx,
            'bid': bid_tx,
            'tx': self.transaction.to_dictionary()
        }

        payment = {
            'trader_id': 'a' * 40,
            'transaction_number': 3,
            'transferred': {
                'amount': 3,
                'type': 'BTC'
            },
            'payment_id': 'a',
            'address_from': 'a',
            'address_to': 'b',
            'timestamp': 1234,
            'success': True
        }
        self.payment_block = MarketBlock()
        self.payment_block.type = b'tx_payment'
        self.payment_block.transaction = {'payment': payment}
Exemple #22
0
 def setUp(self):
     # Object creation
     self.proposed_trade = Trade.propose(
         TraderId(b'0' * 20), OrderId(TraderId(b'0' * 20), OrderNumber(1)),
         OrderId(TraderId(b'1' * 20), OrderNumber(2)),
         AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')),
         Timestamp(1462224447117))
     self.counter_trade = Trade.counter(
         TraderId(b'0' * 20),
         AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')),
         Timestamp(1462224447117), self.proposed_trade)
Exemple #23
0
    async def test_e2e_trade(self):
        """
        Test a direct trade between two nodes
        """
        await self.introduce_nodes()

        order1 = await self.nodes[0].overlay.create_ask(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(13, 'DUM2')), 3600)
        order2 = await self.nodes[1].overlay.create_bid(
            AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(13, 'DUM2')), 3600)

        await sleep(0.5)

        # Verify that the trade has been made
        self.assertEqual(order1.status, "completed")
        self.assertEqual(order2.status, "completed")

        self.assertTrue(list(self.nodes[0].overlay.transaction_manager.find_all()))
        self.assertTrue(list(self.nodes[1].overlay.transaction_manager.find_all()))

        balance1 = await self.nodes[0].overlay.wallets['DUM1'].get_balance()
        balance2 = await self.nodes[0].overlay.wallets['DUM2'].get_balance()
        self.assertEqual(balance1['available'], 990)
        self.assertEqual(balance2['available'], 10013)

        balance1 = await self.nodes[1].overlay.wallets['DUM1'].get_balance()
        balance2 = await self.nodes[1].overlay.wallets['DUM2'].get_balance()
        self.assertEqual(balance1['available'], 1010)
        self.assertEqual(balance2['available'], 9987)

        # Verify blocks
        my_blocks = self.nodes[0].overlay.trustchain.persistence.get_latest_blocks(
            self.nodes[0].overlay.trustchain.my_peer.public_key.key_to_bin(), limit=1000)
        my_blocks = sorted(my_blocks, key=lambda block: block.sequence_number)
        for block in my_blocks:
            linked = self.nodes[0].overlay.trustchain.persistence.get_linked(block)
            if block.type not in [b"ask", b"bid"]:
                self.assertTrue(linked)

            # Check responsibility counters
            if block.type == b"tx_init":
                self.assertEqual(block.transaction["responsibilities"], 0)
                self.assertEqual(linked.transaction["responsibilities"], 1)
            elif block.type == b"tx_done":
                self.assertEqual(block.transaction["responsibilities"], 0)
                self.assertEqual(linked.transaction["responsibilities"], 0)
            elif block.type == b"tx_payment" and block.link_sequence_number == 0:
                self.assertEqual(block.transaction["responsibilities"], 0)
                self.assertEqual(linked.transaction["responsibilities"], 1)
            elif block.type == b"tx_payment" and block.link_sequence_number != 0:
                self.assertEqual(block.transaction["responsibilities"], 1)
                self.assertEqual(linked.transaction["responsibilities"], 0)
Exemple #24
0
 def test_create_bid_order(self):
     # Test for create bid order
     bid_order = self.order_manager.create_bid_order(
         AssetPair(AssetAmount(100, 'BTC'), AssetAmount(10, 'MC')),
         Timeout(0))
     self.assertFalse(bid_order.is_ask())
     self.assertEqual(OrderId(TraderId(b'0' * 20), OrderNumber(1)),
                      bid_order.order_id)
     self.assertEqual(
         AssetPair(AssetAmount(100, 'BTC'), AssetAmount(10, 'MC')),
         bid_order.assets)
     self.assertEqual(100, bid_order.total_quantity)
     self.assertEqual(0, int(bid_order.timeout))
Exemple #25
0
    def setUp(self):
        yield super(TickEntryTestSuite, self).setUp()

        # Object creation
        tick = Tick(OrderId(TraderId(b'0' * 20), OrderNumber(1)), AssetPair(AssetAmount(60, 'BTC'),
                                                                            AssetAmount(30, 'MB')),
                    Timeout(0), Timestamp(0), True)
        tick2 = Tick(OrderId(TraderId(b'0' * 20), OrderNumber(2)),
                     AssetPair(AssetAmount(63400, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now(), True)

        self.price_level = PriceLevel(Price(100, 1, 'MB', 'BTC'))
        self.tick_entry = TickEntry(tick, self.price_level)
        self.tick_entry2 = TickEntry(tick2, self.price_level)
Exemple #26
0
 def test_create_ask_order(self):
     # Test for create ask order
     ask_order = self.order_manager.create_ask_order(
         AssetPair(AssetAmount(100, 'BTC'), AssetAmount(10, 'MC')),
         Timeout(0))
     self.assertTrue(ask_order.is_ask())
     self.assertEquals(OrderId(TraderId(b'0' * 20), OrderNumber(1)),
                       ask_order.order_id)
     self.assertEquals(
         AssetPair(AssetAmount(100, 'BTC'), AssetAmount(10, 'MC')),
         ask_order.assets)
     self.assertEquals(100, ask_order.total_quantity)
     self.assertEquals(0, int(ask_order.timeout))
Exemple #27
0
    def update_ticks(self, ask_order_dict, bid_order_dict, traded_quantity):
        """
        Update ticks according to a TrustChain block containing the status of the ask/bid orders.

        :type ask_order_dict: dict
        :type bid_order_dict: dict
        :type traded_quantity: int
        """
        ask_order_id = OrderId(TraderId(unhexlify(ask_order_dict["trader_id"])),
                               OrderNumber(ask_order_dict["order_number"]))
        bid_order_id = OrderId(TraderId(unhexlify(bid_order_dict["trader_id"])),
                               OrderNumber(bid_order_dict["order_number"]))

        self._logger.debug("Updating ticks in order book: %s and %s (traded quantity: %s)",
                           str(ask_order_id), str(bid_order_id), str(traded_quantity))

        # Update ask tick
        ask_exists = self.tick_exists(ask_order_id)
        if ask_exists and ask_order_dict["traded"] >= self.get_tick(ask_order_id).traded:
            tick = self.get_tick(ask_order_id)
            tick.traded = ask_order_dict["traded"]
            if tick.traded >= tick.assets.first.amount:
                self.remove_tick(tick.order_id)
                self.completed_orders.add(tick.order_id)
        elif not ask_exists and ask_order_dict["traded"] < ask_order_dict["assets"]["first"]["amount"] and \
                ask_order_id not in self.completed_orders:
            new_pair = AssetPair.from_dictionary(ask_order_dict["assets"])
            ask = Ask(ask_order_id, new_pair, Timeout(ask_order_dict["timeout"]),
                      Timestamp(ask_order_dict["timestamp"]), traded=ask_order_dict["traded"])
            self.insert_ask(ask)
        elif not ask_exists and ask_order_dict["traded"] >= ask_order_dict["assets"]["first"]["amount"]:
            self.completed_orders.add(ask_order_id)

        # Update bid tick
        bid_exists = self.tick_exists(bid_order_id)
        if bid_exists and bid_order_dict["traded"] >= self.get_tick(bid_order_id).traded:
            tick = self.get_tick(bid_order_id)
            tick.traded = bid_order_dict["traded"]
            if tick.traded >= tick.assets.first.amount:
                self.remove_tick(tick.order_id)
                self.completed_orders.add(tick.order_id)
        elif not bid_exists and bid_order_dict["traded"] < bid_order_dict["assets"]["first"]["amount"] and \
                bid_order_id not in self.completed_orders:
            new_pair = AssetPair.from_dictionary(bid_order_dict["assets"])
            bid = Bid(bid_order_id, new_pair, Timeout(bid_order_dict["timeout"]),
                      Timestamp(bid_order_dict["timestamp"]), traded=bid_order_dict["traded"])
            self.insert_bid(bid)
        elif not bid_exists and bid_order_dict["traded"] >= bid_order_dict["assets"]["first"]["amount"]:
            self.completed_orders.add(bid_order_id)
Exemple #28
0
    def from_block(cls, block_info):
        """
        Create a Transaction object based on information in a tx_init/tx_done block.
        """
        trader_id = unhexlify(block_info["tx"]["trader_id"])
        transaction_number = block_info["tx"]["transaction_number"]
        order_trader_id = unhexlify(block_info["tx"]["trader_id"])
        order_number = block_info["tx"]["order_number"]
        partner_trader_id = unhexlify(block_info["tx"]["partner_trader_id"])
        partner_order_number = block_info["tx"]["partner_order_number"]
        asset1_amount = block_info["tx"]["assets"]["first"]["amount"]
        asset1_type = block_info["tx"]["assets"]["first"]["type"]
        asset1_transferred = block_info["tx"]["transferred"]["first"]["amount"]
        asset2_amount = block_info["tx"]["assets"]["second"]["amount"]
        asset2_type = block_info["tx"]["assets"]["second"]["type"]
        asset2_transferred = block_info["tx"]["transferred"]["second"][
            "amount"]
        transaction_timestamp = block_info["tx"]["timestamp"]
        sent_wallet_info = False
        received_wallet_info = False
        incoming_address = None
        outgoing_address = None
        partner_incoming_address = None
        partner_outgoing_address = None

        transaction_id = TransactionId(TraderId(trader_id),
                                       TransactionNumber(transaction_number))
        transaction = cls(
            transaction_id,
            AssetPair(AssetAmount(asset1_amount, str(asset1_type)),
                      AssetAmount(asset2_amount, str(asset2_type))),
            OrderId(TraderId(order_trader_id), OrderNumber(order_number)),
            OrderId(TraderId(partner_trader_id),
                    OrderNumber(partner_order_number)),
            Timestamp(transaction_timestamp))

        transaction._transferred_assets = AssetPair(
            AssetAmount(asset1_transferred, str(asset1_type)),
            AssetAmount(asset2_transferred, str(asset2_type)))
        transaction.sent_wallet_info = sent_wallet_info
        transaction.received_wallet_info = received_wallet_info
        transaction.incoming_address = WalletAddress(str(incoming_address))
        transaction.outgoing_address = WalletAddress(str(outgoing_address))
        transaction.partner_incoming_address = WalletAddress(
            str(partner_incoming_address))
        transaction.partner_outgoing_address = WalletAddress(
            str(partner_outgoing_address))

        return transaction
    def setUp(self):
        # Object creation
        tick = Tick(OrderId(TraderId(b'0' * 20), OrderNumber(1)),
                    AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MC')),
                    Timeout(100), Timestamp.now(), True)
        tick2 = Tick(OrderId(TraderId(b'0' * 20), OrderNumber(2)),
                     AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MC')),
                     Timeout(100), Timestamp.now(), True)

        self.price_level = PriceLevel(Price(50, 5, 'MC', 'BTC'))
        self.tick_entry1 = TickEntry(tick, self.price_level)
        self.tick_entry2 = TickEntry(tick, self.price_level)
        self.tick_entry3 = TickEntry(tick, self.price_level)
        self.tick_entry4 = TickEntry(tick, self.price_level)
        self.tick_entry5 = TickEntry(tick2, self.price_level)
Exemple #30
0
 def test_order_invalid_timeout(self):
     """
     Test whether we cannot create an order with an invalid timeout
     """
     self.nodes[0].overlay.create_ask(
         AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(10, 'DUM2')),
         3600 * 1000)