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))
def test_from_network(self): # Test for from network data = Payment.from_network( type( 'Data', (object, ), { "trader_id": TraderId(b'0' * 20), "transaction_id": TransactionId(TraderId(b'2' * 20), TransactionNumber(2)), "transferred_assets": AssetAmount(3, 'BTC'), "address_from": WalletAddress('a'), "address_to": WalletAddress('b'), "payment_id": PaymentId('aaa'), "timestamp": Timestamp(4000), "success": True })) self.assertEquals(TraderId(b'0' * 20), data.trader_id) self.assertEquals( TransactionId(TraderId(b'2' * 20), TransactionNumber(2)), data.transaction_id) self.assertEquals(AssetAmount(3, 'BTC'), data.transferred_assets) self.assertEquals(Timestamp(4000), data.timestamp) self.assertTrue(data.success)
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 from_unpack_list(cls, trader_id, timestamp, order_number, other_trader_id, other_order_number, decline_reason): return DeclineMatchPayload( TraderId(trader_id), Timestamp(timestamp), OrderNumber(order_number), OrderId(TraderId(other_trader_id), OrderNumber(other_order_number)), decline_reason)
def from_unpack_list(cls, trader_id, timestamp, order_number, asset1_amount, asset1_type, asset2_amount, asset2_type, timeout, traded, recipient_order_number, match_trader_id, matchmaker_trader_id): return MatchPayload(TraderId(trader_id), Timestamp(timestamp), OrderNumber(order_number), AssetPair(AssetAmount(asset1_amount, asset1_type.decode('utf-8')), AssetAmount(asset2_amount, asset2_type.decode('utf-8'))), Timeout(timeout), traded, OrderNumber(recipient_order_number), TraderId(match_trader_id), TraderId(matchmaker_trader_id))
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()))
def from_unpack_list(cls, trader_id, timestamp, transaction_trader_id, transaction_number, transferred_amount, transferred_type, address_from, address_to, payment_id, success): return PaymentPayload(TraderId(trader_id), Timestamp(timestamp), TransactionId(TraderId(transaction_trader_id), TransactionNumber(transaction_number)), AssetAmount(transferred_amount, transferred_type.decode('utf-8')), WalletAddress(address_from.decode('utf-8')), WalletAddress(address_to.decode('utf-8')), PaymentId(payment_id.decode('utf-8')), success)
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(TraderId(b'0' * 20), TransactionNumber(1)), 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_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): 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
class TraderIdTestSuite(unittest.TestCase): """Trader ID test cases.""" def setUp(self): # Object creation self.trader_id = TraderId(b'0' * 20) self.trader_id2 = TraderId(b'0' * 20) self.trader_id3 = TraderId(b'1' * 20) def test_init(self): # Test for init validation with self.assertRaises((TypeError, ValueError)): TraderId(1.0) def test_conversion(self): # Test for conversions self.assertEqual(b'0' * 20, bytes(self.trader_id)) def test_equality(self): # Test for equality self.assertTrue(self.trader_id == self.trader_id2) self.assertTrue(self.trader_id != self.trader_id3) self.assertFalse(self.trader_id == 6) def test_hash(self): # Test for hashes self.assertEqual(self.trader_id.__hash__(), self.trader_id2.__hash__()) self.assertNotEqual(self.trader_id.__hash__(), self.trader_id3.__hash__())
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
def setUp(self): # Object creation self.payment = Payment( TraderId(b'0' * 20), TransactionId(TraderId(b'2' * 20), TransactionNumber(2)), AssetAmount(3, 'BTC'), WalletAddress('a'), WalletAddress('b'), PaymentId('aaa'), Timestamp(4000), True)
def setUp(self): # Object creation self.transaction_id = TransactionId(TraderId(b'0' * 20), TransactionNumber(1)) self.transaction_id2 = TransactionId(TraderId(b'0' * 20), TransactionNumber(1)) self.transaction_id3 = TransactionId(TraderId(b'0' * 20), TransactionNumber(2))
def test_next_identity(self): # Test for next identity self.assertEquals( TransactionId(TraderId(b'0' * 20), TransactionNumber(1)), self.memory_transaction_repository.next_identity()) self.assertEquals( TransactionId(TraderId(b'0' * 20), TransactionNumber(2)), self.memory_transaction_repository.next_identity())
def order2(): order_id2 = OrderId(TraderId(b'4' * 20), OrderNumber(5)) order2 = Order(order_id2, AssetPair(AssetAmount(5, 'BTC'), AssetAmount(6, 'EUR')), Timeout(3600), Timestamp.now(), False) order2.reserve_quantity_for_tick( OrderId(TraderId(b'3' * 20), OrderNumber(4)), 3) return order2
def test_to_network(self): # Test for to network self.assertEquals( (TraderId(b'0' * 20), Timestamp(1462224447117), OrderNumber(1), OrderId(TraderId(b'1' * 20), OrderNumber(2)), self.proposed_trade.proposal_id, AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB'))), self.proposed_trade.to_network())
def test_to_network(self): # Test for to network data = self.declined_trade.to_network() self.assertEqual(data[0], TraderId(b'0' * 20)) self.assertEqual(data[1], Timestamp(1462224447117)) self.assertEqual(data[2], OrderNumber(2)) self.assertEqual(data[3], OrderId(TraderId(b'0' * 20), OrderNumber(1))) self.assertEqual(data[4], self.proposed_trade.proposal_id)
def from_unpack_list(cls, trader_id, timestamp, tx_trader_id, transaction_number, order_trader_id, order_number, recipient_trader_id, recipient_order_number, proposal_id, asset1_amount, asset1_type, asset2_amount, asset2_type): return StartTransactionPayload(TraderId(trader_id), Timestamp(timestamp), TransactionId(TraderId(tx_trader_id), TransactionNumber(transaction_number)), OrderId(TraderId(order_trader_id), OrderNumber(order_number)), OrderId(TraderId(recipient_trader_id), OrderNumber(recipient_order_number)), proposal_id, AssetPair(AssetAmount(asset1_amount, asset1_type.decode('utf-8')), AssetAmount(asset2_amount, asset2_type.decode('utf-8'))))
def from_unpack_list(cls, trader_id, timestamp, order_number, recipient_trader_id, recipient_order_number, proposal_id, decline_reason): return DeclineTradePayload( TraderId(trader_id), Timestamp(timestamp), OrderNumber(order_number), OrderId(TraderId(recipient_trader_id), OrderNumber(recipient_order_number)), proposal_id, decline_reason)
def setUp(self): # Object creation self.start_transaction = StartTransaction( TraderId(b'0' * 20), TransactionId(TraderId(b'0' * 20), TransactionNumber(1)), OrderId(TraderId(b'0' * 20), OrderNumber(1)), OrderId(TraderId(b'1' * 20), OrderNumber(1)), 1234, AssetPair(AssetAmount(30, 'BTC'), AssetAmount(40, 'MC')), Timestamp(0))
def test_remove_tick(self): # Test remove tick self.side.insert_tick(self.tick) self.side.insert_tick(self.tick2) self.side.remove_tick(OrderId(TraderId(b'0' * 20), OrderNumber(1))) self.assertEqual(1, len(self.side)) self.side.remove_tick(OrderId(TraderId(b'1' * 20), OrderNumber(2))) self.assertEqual(0, len(self.side))
def test_block_for_matching(tick_entry): """ Test blocking of a match """ tick_entry.block_for_matching(OrderId(TraderId(b'a' * 20), OrderNumber(3))) assert len(tick_entry._blocked_for_matching) == 1 # Try to add it again - should be ignored tick_entry.block_for_matching(OrderId(TraderId(b'a' * 20), OrderNumber(3))) assert len(tick_entry._blocked_for_matching) == 1
def test_block_for_matching(self): """ Test blocking of a match """ self.tick_entry.block_for_matching(OrderId(TraderId(b'a' * 20), OrderNumber(3))) self.assertEqual(len(self.tick_entry._blocked_for_matching), 1) # Try to add it again - should be ignored self.tick_entry.block_for_matching(OrderId(TraderId(b'a' * 20), OrderNumber(3))) self.assertEqual(len(self.tick_entry._blocked_for_matching), 1)
def transaction(payment): transaction_id = TransactionId(b'a' * 32) transaction = Transaction( transaction_id, AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MB')), OrderId(TraderId(b'0' * 20), OrderNumber(1)), OrderId(TraderId(b'1' * 20), OrderNumber(2)), Timestamp(20000)) transaction.add_payment(payment) return transaction
def setUp(self): # Object creation self.memory_transaction_repository = MemoryTransactionRepository(b'0' * 20) self.transaction_id = TransactionId(b'a' * 32) self.transaction = Transaction( self.transaction_id, AssetPair(AssetAmount(10, 'BTC'), AssetAmount(10, 'MB')), OrderId(TraderId(b'0' * 20), OrderNumber(1)), OrderId(TraderId(b'2' * 20), OrderNumber(2)), Timestamp(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.declined_trade = Trade.decline( TraderId(b'0' * 20), Timestamp(1462224447117), self.proposed_trade, DeclinedTradeReason.ORDER_COMPLETED)
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()
def test_insert_tick(self): # Test insert tick self.assertEqual(0, len(self.side)) self.assertFalse(self.side.tick_exists(OrderId(TraderId(b'0' * 20), OrderNumber(1)))) self.side.insert_tick(self.tick) self.side.insert_tick(self.tick2) self.assertEqual(2, len(self.side)) self.assertTrue(self.side.tick_exists(OrderId(TraderId(b'0' * 20), OrderNumber(1))))
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}
async def setUp(self): super(AbstractTestOrderBook, self).setUp() # Object creation self.ask = Ask( OrderId(TraderId(b'0' * 20), OrderNumber(1)), AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now()) self.invalid_ask = Ask( OrderId(TraderId(b'0' * 20), OrderNumber(1)), AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MB')), Timeout(0), Timestamp(0)) self.ask2 = Ask( OrderId(TraderId(b'1' * 20), OrderNumber(1)), AssetPair(AssetAmount(400, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now()) self.bid = Bid( OrderId(TraderId(b'2' * 20), OrderNumber(1)), AssetPair(AssetAmount(200, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now()) self.invalid_bid = Bid( OrderId(TraderId(b'0' * 20), OrderNumber(1)), AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MB')), Timeout(0), Timestamp(0)) self.bid2 = Bid( OrderId(TraderId(b'3' * 20), OrderNumber(1)), AssetPair(AssetAmount(300, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now()) self.trade = Trade.propose( TraderId(b'0' * 20), OrderId(TraderId(b'0' * 20), OrderNumber(1)), OrderId(TraderId(b'0' * 20), OrderNumber(1)), AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MB')), Timestamp(1462224447117)) self.order_book = OrderBook()