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('0' * 40), OrderNumber(1)), ask_pair, Timeout(3600), Timestamp.now(), True) ask._traded_quantity = ask_total_traded bid = Order(OrderId(TraderId('1' * 40), OrderNumber(1)), bid_pair, Timeout(3600), Timestamp.now(), False) bid._traded_quantity = bid_total_traded tx = Transaction( TransactionId(TraderId('0' * 40), TransactionNumber(1)), AssetPair(AssetAmount(traded_amount, 'BTC'), AssetAmount(traded_amount, 'MB')), OrderId(TraderId('0' * 40), OrderNumber(1)), OrderId(TraderId('1' * 40), OrderNumber(1)), Timestamp(0.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 = 'tx_done' tx_done_block.transaction = { 'ask': ask.to_status_dictionary(), 'bid': bid.to_status_dictionary(), 'tx': tx.to_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
def setUp(self, annotate=True): yield super(MatchingEngineTestSuite, self).setUp(annotate=annotate) # Object creation self.ask = Ask( OrderId(TraderId('2'), OrderNumber(1)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp.now()) self.bid = Bid( OrderId(TraderId('4'), OrderNumber(2)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp.now()) self.ask_order = Order( OrderId(TraderId('5'), OrderNumber(3)), AssetPair(AssetAmount(3000, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp.now(), True) self.bid_order = Order( OrderId(TraderId('6'), 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 from_unpack_list(cls, trader_id, message_number, timestamp, order_number, recipient_trader_id, recipient_order_number, proposal_id, price, price_type, quantity, quantity_type, ip, port): return TradePayload(MessageId(TraderId(trader_id), MessageNumber(message_number)), Timestamp(timestamp), OrderNumber(order_number), OrderId(TraderId(recipient_trader_id), OrderNumber(recipient_order_number)), proposal_id, Price(price, price_type), Quantity(quantity, quantity_type), SocketAddress(ip, port))
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(self.nodes[0].overlay.transaction_manager.find_all()) self.assertTrue(self.nodes[1].overlay.transaction_manager.find_all())
def test_from_network(self): # Test for from network now = Timestamp.now() data = Bid.from_network( type( 'Data', (object, ), { "trader_id": TraderId('0'), "order_number": OrderNumber(2), "message_number": MessageNumber('message_number'), "price": Price(63400, 'BTC'), "quantity": Quantity(40, 'MC'), "timeout": Timeout(30), "timestamp": now, "public_key": 'a', "signature": 'b' })) self.assertEquals( MessageId(TraderId('0'), MessageNumber('message_number')), data.message_id) self.assertEquals(Price(63400, 'BTC'), data.price) self.assertEquals(Quantity(40, 'MC'), data.quantity) self.assertEquals(float(Timeout(30)), float(data.timeout)) self.assertEquals(now, data.timestamp) self.assertEquals('a', data._public_key) self.assertEquals('b', data._signature)
def test_from_network(self): # Test for from network data = Payment.from_network( type( 'Data', (object, ), { "message_id": MessageId(TraderId("0"), MessageNumber(1)), "transaction_id": TransactionId(TraderId('2'), TransactionNumber(2)), "transferee_quantity": Quantity(3, 'MC'), "transferee_price": Price(2, 'BTC'), "address_from": WalletAddress('a'), "address_to": WalletAddress('b'), "payment_id": PaymentId('aaa'), "timestamp": Timestamp(4.0), "success": True })) self.assertEquals(MessageId(TraderId("0"), MessageNumber(1)), data.message_id) self.assertEquals(TransactionId(TraderId('2'), TransactionNumber(2)), data.transaction_id) self.assertEquals(Quantity(3, 'MC'), data.transferee_quantity) self.assertEquals(Price(2, 'BTC'), data.transferee_price) self.assertEquals(Timestamp(4.0), data.timestamp) self.assertTrue(data.success)
def setUp(self): # Object creation self.transaction_id = TransactionId(TraderId("0"), TransactionNumber(1)) self.transaction = Transaction(self.transaction_id, Price(100, 'BTC'), Quantity(30, 'MC'), OrderId(TraderId('0'), OrderNumber(2)), OrderId(TraderId('1'), OrderNumber(1)), Timestamp(0.0)) self.proposed_trade = Trade.propose( MessageId(TraderId('0'), MessageNumber('1')), OrderId(TraderId('0'), OrderNumber(2)), OrderId(TraderId('1'), OrderNumber(3)), Price(100, 'BTC'), Quantity(30, 'MC'), Timestamp(0.0)) self.tick = Tick(OrderId(TraderId('0'), OrderNumber(1)), Price(100, 'BTC'), Quantity(5, 'MC'), Timeout(0.0), Timestamp(float("inf")), True) self.tick2 = Tick(OrderId(TraderId('0'), OrderNumber(2)), Price(100, 'BTC'), Quantity(100, 'MC'), Timeout(0.0), Timestamp(float("inf")), True) self.order_timestamp = Timestamp.now() self.order = Order(OrderId(TraderId("0"), OrderNumber(3)), Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(5000), self.order_timestamp, False) self.order2 = Order(OrderId(TraderId("0"), OrderNumber(4)), Price(100, 'BTC'), Quantity(30, 'MC'), Timeout(5), Timestamp(time.time() - 1000), True)
def test_to_network(self): # Test for to network self.assertEquals((TraderId('1'), (TraderId('0'), MessageNumber('message_number'), OrderNumber(1), TraderId('1'), OrderNumber(2), self.proposed_trade.proposal_id, Price(63400, 'BTC'), Quantity(30, 'MC'), Timestamp(1462224447.117))), self.proposed_trade.to_network())
def test_from_network(self): # Test for from network data = ProposedTrade.from_network( type( 'Data', (object, ), { "trader_id": TraderId('0'), "message_number": MessageNumber('message_number'), "order_number": OrderNumber(1), "recipient_trader_id": TraderId('1'), "recipient_order_number": OrderNumber(2), "proposal_id": 1234, "timestamp": Timestamp(1462224447.117), "price": Price(63400, 'BTC'), "quantity": Quantity(30, 'MC') })) self.assertEquals( MessageId(TraderId('0'), MessageNumber('message_number')), data.message_id) self.assertEquals(OrderId(TraderId('0'), OrderNumber(1)), data.order_id) self.assertEquals(OrderId(TraderId('1'), OrderNumber(2)), data.recipient_order_id) self.assertEquals(1234, data.proposal_id) self.assertEquals(Price(63400, 'BTC'), data.price) self.assertEquals(Quantity(30, 'MC'), data.quantity) self.assertEquals(Timestamp(1462224447.117), data.timestamp)
def test_to_network(self): # Test for to network self.assertEquals( (MessageId(TraderId('0'), MessageNumber(1)), self.tick.timestamp, OrderNumber(1), Price(63400, 'BTC'), Quantity( 30, 'MC'), self.tick.timeout), self.tick.to_network(MessageId(TraderId('0'), MessageNumber(1))))
def setUp(self): # Object creation self.trade = Trade( MessageId(TraderId('0'), MessageNumber('message_number')), OrderId(TraderId('0'), OrderNumber(3)), OrderId(TraderId('0'), OrderNumber(4)), 1234, Timestamp(1462224447.117))
def test_encode_match(self): """ Test encoding and decoding of a match message """ message = MockObject() meta_msg = self.market_community.get_meta_message(u"match") match_payload = MatchPayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'), OrderNumber(4), Price(1, 'BTC'), Quantity(2, 'MC'), Timeout(3600), Timestamp.now(), '192.168.1.1', 1234, OrderNumber(3), Quantity(2, 'MC'), TraderId('abc'), TraderId('def'), 'match_id') message.payload = match_payload packet, = self.conversion._encode_match(message) self.assertTrue(packet) _, decoded = self.conversion._decode_match( self.get_placeholder_msg(u"match"), 0, packet) self.assertTrue(decoded) self.assertEqual(decoded.match_id, 'match_id')
def test_from_network(self): # Test for from network data = ProposedTrade.from_network( type( 'Data', (object, ), { "trader_id": TraderId(b'0'), "order_number": OrderNumber(1), "recipient_order_id": OrderId(TraderId('1'), OrderNumber(2)), "proposal_id": 1234, "timestamp": Timestamp(1462224447.117), "assets": AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')) })) self.assertEquals(TraderId(b'0'), data.trader_id) self.assertEquals(OrderId(TraderId(b'0'), OrderNumber(1)), data.order_id) self.assertEquals(OrderId(TraderId(b'1'), 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(1462224447.117), data.timestamp)
def setUp(self): # Object creation self.proposed_trade = Trade.propose( TraderId(b'0'), OrderId(TraderId(b'0'), OrderNumber(1)), OrderId(TraderId(b'1'), OrderNumber(2)), AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')), Timestamp(1462224447.117))
def setUp(self): # Object creation self.transaction_id = TransactionId(TraderId("0"), TransactionNumber(1)) self.transaction = Transaction( self.transaction_id, AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MC')), OrderId(TraderId('0'), OrderNumber(2)), OrderId(TraderId('1'), OrderNumber(1)), Timestamp(0.0)) self.proposed_trade = Trade.propose( TraderId('0'), OrderId(TraderId('0'), OrderNumber(2)), OrderId(TraderId('1'), OrderNumber(3)), AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MC')), Timestamp(0.0)) self.tick = Tick( OrderId(TraderId('0'), OrderNumber(1)), AssetPair(AssetAmount(5, 'BTC'), AssetAmount(5, 'MC')), Timeout(0), Timestamp(float("inf")), True) self.tick2 = Tick( OrderId(TraderId('0'), OrderNumber(2)), AssetPair(AssetAmount(500, 'BTC'), AssetAmount(5, 'MC')), Timeout(0), Timestamp(float("inf")), True) self.order_timestamp = Timestamp.now() self.order = Order( OrderId(TraderId("0"), OrderNumber(3)), AssetPair(AssetAmount(50, 'BTC'), AssetAmount(5, 'MC')), Timeout(5000), self.order_timestamp, False) self.order.set_verified() self.order2 = Order( OrderId(TraderId("0"), OrderNumber(4)), AssetPair(AssetAmount(50, 'BTC'), AssetAmount(5, 'MC')), Timeout(5), Timestamp(time.time() - 1000), True) self.order2.set_verified()
def setUp(self): # Object creation self.proposed_trade = Trade.propose(MessageId(TraderId('0'), MessageNumber('message_number')), OrderId(TraderId('0'), OrderNumber(1)), OrderId(TraderId('1'), OrderNumber(2)), Price(63400, 'BTC'), Quantity(30, 'MC'), Timestamp(1462224447.117))
def setUp(self): # Object creation self.payment = Payment( MessageId(TraderId("0"), MessageNumber(1)), TransactionId(TraderId('2'), TransactionNumber(2)), Quantity(3, 'MC'), Price(2, 'BTC'), WalletAddress('a'), WalletAddress('b'), PaymentId('aaa'), Timestamp(4.0), True)
def test_proposed_trade_cache_timeout(self): """ Test the timeout method of a proposed trade request in the cache """ ask = Ask( OrderId(TraderId(self.market_community.mid), OrderNumber(24)), Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600), Timestamp.now()) order = Order(OrderId(TraderId("0"), OrderNumber(23)), Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0), Timestamp.now(), False) self.market_community.order_book.insert_ask(ask) self.assertEqual(len(self.market_community.order_book.asks), 1) self.market_community.order_manager.order_repository.add(order) order.reserve_quantity_for_tick(self.proposed_trade.recipient_order_id, Quantity(30, 'DUM2')) self.market_community.order_manager.order_repository.update(order) mocked_match_message = MockObject() mocked_match_message.payload = MockObject() mocked_match_message.payload.matchmaker_trader_id = 'a' self.market_community.incoming_match_messages[ 'a'] = mocked_match_message def mocked_send_decline(*_): mocked_send_decline.called = True mocked_send_decline.called = False self.market_community.send_decline_match_message = mocked_send_decline cache = ProposedTradeRequestCache(self.market_community, self.proposed_trade, 'a') cache.on_timeout() self.assertTrue(mocked_send_decline.called)
def from_database(cls, data, payments): """ Create a Transaction object based on information in the database. """ trader_id, transaction_number, order_trader_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, match_id = data transaction_id = TransactionId(TraderId(str(trader_id)), TransactionNumber(transaction_number)) transaction = cls(transaction_id, AssetPair(AssetAmount(asset1_amount, str(asset1_type)), AssetAmount(asset2_amount, str(asset2_type))), OrderId(TraderId(str(order_trader_id)), OrderNumber(order_number)), OrderId(TraderId(str(partner_trader_id)), OrderNumber(partner_order_number)), Timestamp(float(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.match_id = str(match_id) transaction._payments = payments return transaction
def test_on_introduction_request(self): """ Test that when we receive an intro request with a orders bloom filter, we send an order sync back """ def on_send_offer_sync(_, tick): self.assertIsInstance(tick, Tick) on_send_offer_sync.called = True on_send_offer_sync.called = False candidate = WalkCandidate(("127.0.0.1", 1234), False, ("127.0.0.1", 1234), ("127.0.0.1", 1234), u"public") candidate.associate(self.market_community.my_member) payload = self.market_community.create_introduction_request( candidate, True).payload self.market_community.order_book.insert_ask(self.ask) self.market_community.order_book.insert_bid(self.bid) self.market_community.update_ip(TraderId('0'), ("127.0.0.1", 1234)) self.market_community.update_ip(TraderId('1'), ("127.0.0.1", 1234)) self.market_community.send_offer_sync = on_send_offer_sync message = MockObject() message.payload = payload message.candidate = candidate self.market_community.on_introduction_request([message]) self.assertTrue(on_send_offer_sync.called)
def test_from_network(self): # Test for from network data = Payment.from_network( type( 'Data', (object, ), { "trader_id": TraderId(b"0"), "transaction_id": TransactionId(TraderId(b'2'), TransactionNumber(2)), "transferred_assets": AssetAmount(3, 'BTC'), "address_from": WalletAddress('a'), "address_to": WalletAddress('b'), "payment_id": PaymentId('aaa'), "timestamp": Timestamp(4.0), "success": True })) self.assertEquals(TraderId(b"0"), data.trader_id) self.assertEquals(TransactionId(TraderId(b'2'), TransactionNumber(2)), data.transaction_id) self.assertEquals(AssetAmount(3, 'BTC'), data.transferred_assets) self.assertEquals(Timestamp(4.0), data.timestamp) self.assertTrue(data.success)
def test_properties(self): """ Test the start transaction payload """ self.assertEquals(MessageNumber('1'), self.start_transaction_payload.message_number) self.assertEquals(TransactionNumber(2), self.start_transaction_payload.transaction_number) self.assertEquals(Timestamp(0.0), self.start_transaction_payload.timestamp) self.assertEquals(TraderId('2'), self.start_transaction_payload.transaction_trader_id) self.assertEquals(TraderId('2'), self.start_transaction_payload.order_trader_id) self.assertEquals(OrderNumber(3), self.start_transaction_payload.order_number) self.assertEquals(TraderId('0'), self.start_transaction_payload.recipient_trader_id) self.assertEquals( OrderNumber(4), self.start_transaction_payload.recipient_order_number) self.assertEquals(1236, self.start_transaction_payload.proposal_id) self.assertEquals(Price(2, 'BTC'), self.start_transaction_payload.price) self.assertEquals(Quantity(3, 'MC'), self.start_transaction_payload.quantity)
def setUp(self): # Object creation self.proposed_trade_payload = TradePayload.Implementation( MetaObject(), TraderId('0'), MessageNumber('message_number'), OrderNumber(1), TraderId('1'), OrderNumber(2), 1235, Price(63400, 'BTC'), Quantity(30, 'MC'), Timestamp(1462224447.117), '192.168.1.1', 1234)
def setUp(self): # Object creation self.payment_payload = PaymentPayload.Implementation( MetaObject(), TraderId('0'), MessageNumber('1'), TraderId('2'), TransactionNumber(2), Quantity(20, 'MC'), Price(10, 'BTC'), WalletAddress('a'), WalletAddress('b'), PaymentId('3'), Timestamp(0.0), True)
def setUp(self): # Object creation self.start_transaction_payload = StartTransactionPayload.Implementation( MetaObject(), TraderId('0'), MessageNumber('1'), TraderId('2'), TransactionNumber(2), TraderId('2'), OrderNumber(3), TraderId('0'), OrderNumber(4), 1236, Price(2, 'BTC'), Quantity(3, 'MC'), Timestamp(0.0))
def from_database(cls, data, payments): """ Create a Transaction object based on information in the database. """ trader_id, transaction_number, order_trader_id, order_number, partner_trader_id, partner_order_number, price,\ price_type, transferred_price, quantity, quantity_type, transferred_quantity, transaction_timestamp,\ sent_wallet_info, received_wallet_info, incoming_address, outgoing_address, partner_incoming_address,\ partner_outgoing_address, match_id = data transaction_id = TransactionId(TraderId(str(trader_id)), TransactionNumber(transaction_number)) transaction = cls( transaction_id, Price(price, str(price_type)), Quantity(quantity, str(quantity_type)), OrderId(TraderId(str(order_trader_id)), OrderNumber(order_number)), OrderId(TraderId(str(partner_trader_id)), OrderNumber(partner_order_number)), Timestamp(float(transaction_timestamp))) transaction._transferred_price = Price(transferred_price, str(price_type)) transaction._transferred_quantity = Quantity(transferred_quantity, str(quantity_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.match_id = str(match_id) transaction._payments = payments return transaction
def setUp(self): # Object creation self.payment = Payment(TraderId("0"), TransactionId(TraderId('2'), TransactionNumber(2)), AssetAmount(3, 'BTC'), WalletAddress('a'), WalletAddress('b'), PaymentId('aaa'), Timestamp(4.0), True)
def from_unpack_list(cls, trader_id, timestamp, order_number, asset1_amount, asset1_type, asset2_amount, asset2_type, timeout, traded, recipient_order_number, match_quantity, match_trader_id, matchmaker_trader_id, match_id): return MatchPayload(TraderId(trader_id), Timestamp(timestamp), OrderNumber(order_number), AssetPair(AssetAmount(asset1_amount, asset1_type), AssetAmount(asset2_amount, asset2_type)), Timeout(timeout), traded, OrderNumber(recipient_order_number), match_quantity, TraderId(match_trader_id), TraderId(matchmaker_trader_id), match_id)
def setUp(self): # Object creation self.match_payload = MatchPayload.Implementation( MetaObject(), TraderId('0'), MessageNumber('message_number'), OrderNumber(1), Price(63400, 'BTC'), Quantity(30, 'MC'), Timeout(1470004447.117), Timestamp(1462224447.117), "1.1.1.1", 1, OrderNumber(2), Quantity(20, 'MC'), TraderId('1'), TraderId('2'), 'a')
def from_unpack_list(cls, trader_id, timestamp, transaction_trader_id, transaction_number, incoming_address, outgoing_address): return WalletInfoPayload( TraderId(trader_id), Timestamp(timestamp), TransactionId(TraderId(transaction_trader_id), TransactionNumber(transaction_number)), WalletAddress(incoming_address), WalletAddress(outgoing_address))