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 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 test_orderbook_sync(self): """ Test whether orderbooks are synchronized with a new node """ yield self.introduce_nodes() ask_order = yield self.nodes[0].overlay.create_ask( AssetPair(AssetAmount(1, 'DUM1'), AssetAmount(2, 'DUM2')), 3600) bid_order = yield self.nodes[1].overlay.create_bid( AssetPair(AssetAmount(1, 'DUM1'), AssetAmount(1, 'DUM2')), 3600) yield 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() yield self.deliver_messages(timeout=.5) yield self.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) yield self.deliver_messages(timeout=.5) yield self.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 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 test_e2e_trade(self): """ Test a direct trade between two nodes """ yield self.introduce_nodes() self.nodes[0].overlay.create_ask( AssetPair(AssetAmount(10, 'DUM1'), AssetAmount(13, 'DUM2')), 3600) 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.assertTrue(self.nodes[0].overlay.transaction_manager.find_all()) self.assertTrue(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_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(self.nodes[0].overlay.transaction_manager.find_all()) self.assertTrue(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(self.nodes[0].overlay.transaction_manager.find_all()), 2) self.assertEqual( len(self.nodes[1].overlay.transaction_manager.find_all()), 2)
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 # Compute reputation self.nodes[0].overlay.compute_reputation() # 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()) 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)
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_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( self.nodes[0].overlay.transaction_manager.find_all()[0].status, "error") self.assertEqual( self.nodes[1].overlay.transaction_manager.find_all()[0].status, "error")
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): yield 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'), OrderNumber(4)) self.order_id2 = OrderId(TraderId(b'4'), 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'), OrderNumber(4)), 3) self.transaction_id1 = TransactionId(TraderId(b"0"), TransactionNumber(4)) self.transaction1 = Transaction(self.transaction_id1, AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MB')), OrderId(TraderId(b"0"), OrderNumber(1)), OrderId(TraderId(b"1"), OrderNumber(2)), Timestamp(20.0)) self.payment1 = Payment(TraderId(b"0"), self.transaction_id1, AssetAmount(5, 'BTC'), WalletAddress('abc'), WalletAddress('def'), PaymentId("abc"), Timestamp(20.0), False) self.transaction1.add_payment(self.payment1)
def test_proposed_trade_timeout(self): """ Test whether we unreserve the quantity if a proposed trade timeouts """ yield self.introduce_nodes() self.nodes[0].overlay.decode_map[chr(10)] = lambda *_: None ask_order = yield self.nodes[0].overlay.create_ask( AssetPair(AssetAmount(1, 'DUM1'), AssetAmount(1, 'DUM2')), 3600) bid_order = yield self.nodes[1].overlay.create_bid( AssetPair(AssetAmount(1, 'DUM1'), AssetAmount(1, 'DUM2')), 3600) yield self.deliver_messages(timeout=.5) outstanding = self.nodes[1].overlay.get_outstanding_proposals( bid_order.order_id, ask_order.order_id) self.assertTrue(outstanding) outstanding[0][1].on_timeout() yield self.deliver_messages(timeout=.5) ask_tick_entry = self.nodes[2].overlay.order_book.get_tick( ask_order.order_id) bid_tick_entry = self.nodes[2].overlay.order_book.get_tick( bid_order.order_id) self.assertEqual(bid_tick_entry.reserved_for_matching, 0) self.assertEqual(ask_tick_entry.reserved_for_matching, 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("0") self.order_id = OrderId(TraderId(b"0"), OrderNumber(1)) self.order = Order(self.order_id, AssetPair(AssetAmount(100, 'BTC'), AssetAmount(30, 'MC')), Timeout(0), Timestamp(10.0), False) self.order2 = Order(self.order_id, AssetPair(AssetAmount(1000, 'BTC'), AssetAmount(30, 'MC')), Timeout(0), Timestamp(10.0), False)
def test_pagerank_2(self): """ Test isolated nodes during a Temporal Pagerank computation """ self.insert_transaction(b'a', b'b', AssetPair(AssetAmount(1, 'BTC'), AssetAmount(1, 'MB'))) self.insert_transaction(b'c', b'd', AssetPair(AssetAmount(1, 'BTC'), AssetAmount(1, 'MB'))) rep_dict = self.compute_reputations() self.assertTrue(b'c' in rep_dict) self.assertTrue(b'd' in rep_dict)
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.assertEquals(OrderId(TraderId("0"), OrderNumber(1)), bid_order.order_id) self.assertEquals(AssetPair(AssetAmount(100, 'BTC'), AssetAmount(10, 'MC')), bid_order.assets) self.assertEquals(100, bid_order.total_quantity) self.assertEquals(0, int(bid_order.timeout))
def setUp(self, annotate=True): yield super(TestMarketBlock, self).setUp(annotate=annotate) self.ask = Ask( OrderId(TraderId('0' * 40), OrderNumber(1)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp(0.0), True) self.bid = Ask( OrderId(TraderId('1' * 40), OrderNumber(1)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp(0.0), False) self.transaction = Transaction( TransactionId(TraderId('0' * 40), TransactionNumber(1)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), OrderId(TraderId('0' * 40), OrderNumber(1)), OrderId(TraderId('1' * 40), OrderNumber(1)), Timestamp(0.0)) ask_tx = self.ask.to_block_dict() ask_tx["address"], ask_tx["port"] = "127.0.0.1", 1337 bid_tx = self.bid.to_block_dict() bid_tx["address"], bid_tx["port"] = "127.0.0.1", 1337 self.tick_block = MarketBlock() self.tick_block.type = 'tick' self.tick_block.transaction = {'tick': ask_tx} self.cancel_block = MarketBlock() self.cancel_block.type = 'cancel_order' self.cancel_block.transaction = { 'trader_id': 'a' * 40, 'order_number': 1 } self.tx_block = MarketBlock() self.tx_block.type = '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.3, 'success': True } self.payment_block = MarketBlock() self.payment_block.type = 'tx_payment' self.payment_block.transaction = {'payment': payment}
def setUp(self): # Object creation self.tick = Tick(OrderId(TraderId('0'), OrderNumber(1)), AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now(), True) self.tick2 = Tick(OrderId(TraderId('1'), OrderNumber(2)), AssetPair(AssetAmount(120, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now(), True) self.side = Side()
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)) self.counter_trade = Trade.counter( TraderId(b'0'), AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')), Timestamp(1462224447.117), self.proposed_trade)
def test_pagerank_3(self): """ Test a more involved example of a Temporal Pagerank computation """ self.insert_transaction(b'a', b'b', AssetPair(AssetAmount(1, 'BTC'), AssetAmount(1, 'MB'))) self.insert_transaction(b'b', b'c', AssetPair(AssetAmount(100, 'BTC'), AssetAmount(10000, 'MB'))) self.insert_transaction(b'b', b'd', AssetPair(AssetAmount(100, 'BTC'), AssetAmount(10000, 'MB'))) self.insert_transaction(b'b', b'e', AssetPair(AssetAmount(100, 'BTC'), AssetAmount(10000, 'MB'))) rep_dict = self.compute_reputations() self.assertEqual(len(rep_dict.keys()), 5) for rep in rep_dict.values(): self.assertGreater(rep, 0)
def from_block(cls, block_info): """ Create a Transaction object based on information in a tx_init/tx_done block. """ trader_id = block_info["tx"]["trader_id"] transaction_number = block_info["tx"]["transaction_number"] order_trader_id = block_info["tx"]["trader_id"] order_number = block_info["tx"]["order_number"] partner_trader_id = 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 match_id = '' transaction_id = TransactionId(TraderId(bytes(trader_id)), TransactionNumber(transaction_number)) transaction = cls( transaction_id, AssetPair(AssetAmount(asset1_amount, str(asset1_type)), AssetAmount(asset2_amount, str(asset2_type))), OrderId(TraderId(bytes(order_trader_id)), OrderNumber(order_number)), OrderId(TraderId(bytes(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) return transaction
def update_ticks(self, ask_order_dict, bid_order_dict, traded_quantity, unreserve=True): """ 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 :type unreserve: bool """ ask_order_id = OrderId(TraderId(ask_order_dict["trader_id"]), OrderNumber(ask_order_dict["order_number"])) bid_order_id = OrderId(TraderId(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 unreserve: tick.release_for_matching(traded_quantity) 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 unreserve: tick.release_for_matching(traded_quantity) 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)
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"), 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))
def setUp(self): # Object creation self.timestamp_now = Timestamp.now() self.tick = Tick(OrderId(TraderId(b'0'), OrderNumber(1)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(30), Timestamp(0.0), True) self.tick2 = Tick(OrderId(TraderId(b'0'), OrderNumber(2)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(0), Timestamp(0.0), False) self.order_ask = Order(OrderId(TraderId(b'0'), OrderNumber(2)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(0), Timestamp(0.0), True) self.order_bid = Order(OrderId(TraderId(b'0'), OrderNumber(2)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB')), Timeout(0), Timestamp(0.0), False)
def test_insert_ask_bid(self): """ Test whether an ask is successfully inserted when a tick block is received """ ask = TestMarketCommunitySingle.get_tick_block(True, AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MB'))) bid = TestMarketCommunitySingle.get_tick_block(False, AssetPair(AssetAmount(30, 'BTC'), AssetAmount(29, 'MB'))) bid.transaction["tick"]["order_number"] = 2 # To give it a different order number self.nodes[0].overlay.trustchain.persistence.get_linked = lambda _: True self.nodes[0].overlay.received_block(ask) self.nodes[0].overlay.received_block(bid) self.assertEqual(len(self.nodes[0].overlay.order_book.asks), 1) self.assertEqual(len(self.nodes[0].overlay.order_book.bids), 1)
def setUp(self): yield super(TickEntryTestSuite, self).setUp() # Object creation tick = Tick(OrderId(TraderId(b'0'), OrderNumber(1)), AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MB')), Timeout(0), Timestamp(0.0), True) tick2 = Tick( OrderId(TraderId(b'0'), OrderNumber(2)), AssetPair(AssetAmount(63400, 'BTC'), AssetAmount(30, 'MB')), Timeout(100), Timestamp.now(), True) self.price_level = PriceLevel(Price(100, 'MB', 'BTC')) self.tick_entry = TickEntry(tick, self.price_level) self.tick_entry2 = TickEntry(tick2, self.price_level)
def setUp(self): # Object creation tick = Tick(OrderId(TraderId(b'0'), OrderNumber(1)), AssetPair(AssetAmount(60, 'BTC'), AssetAmount(30, 'MC')), Timeout(100), Timestamp.now(), True) tick2 = Tick(OrderId(TraderId(b'0'), OrderNumber(2)), AssetPair(AssetAmount(30, 'BTC'), AssetAmount(30, 'MC')), Timeout(100), Timestamp.now(), True) self.price_level = PriceLevel(Price(10, '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)
def test_create_invalid_ask_bid(self): """ Test creating an invalid ask/bid with invalid asset pairs. """ invalid_pair = AssetPair(AssetAmount(1, 'DUM2'), AssetAmount(2, 'DUM2')) self.assertRaises(RuntimeError, self.nodes[0].overlay.create_ask, invalid_pair, 3600) self.assertRaises(RuntimeError, self.nodes[0].overlay.create_bid, invalid_pair, 3600)
def test_from_network(self): # Test for from network data = StartTransaction.from_network( type( 'Data', (object, ), { "trader_id": TraderId('0'), "transaction_id": TransactionId(TraderId('0'), TransactionNumber(1)), "order_id": OrderId(TraderId('0'), OrderNumber(1)), "recipient_order_id": OrderId(TraderId('1'), OrderNumber(2)), "proposal_id": 1235, "assets": AssetPair(AssetAmount(30, 'BTC'), AssetAmount(40, 'MC')), "timestamp": Timestamp(0.0) })) self.assertEquals(TraderId("0"), data.trader_id) self.assertEquals(TransactionId(TraderId("0"), TransactionNumber(1)), data.transaction_id) self.assertEquals(OrderId(TraderId('0'), OrderNumber(1)), data.order_id) self.assertEquals(OrderId(TraderId('1'), OrderNumber(2)), data.recipient_order_id) self.assertEquals(1235, data.proposal_id) self.assertEquals(Timestamp(0.0), data.timestamp)
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 __init__(self, transaction_id, assets, order_id, partner_order_id, timestamp): """ :param transaction_id: An transaction id to identify the order :param assets: The asset pair to exchange :param order_id: The id of your order for this transaction :param partner_order_id: The id of the order of the other party :param timestamp: A timestamp when the transaction was created :type transaction_id: TransactionId :type assets: AssetPair :type order_id: OrderId :type partner_order_id: OrderId :type timestamp: Timestamp """ super(Transaction, self).__init__() self._logger = logging.getLogger(self.__class__.__name__) self._transaction_id = transaction_id self._assets = assets self._transferred_assets = AssetPair(AssetAmount(0, assets.first.asset_id), AssetAmount(0, assets.second.asset_id)) self._order_id = order_id self._partner_order_id = partner_order_id self._timestamp = timestamp self.sent_wallet_info = False self.received_wallet_info = False self.incoming_address = None self.outgoing_address = None self.partner_incoming_address = None self.partner_outgoing_address = None self.match_id = '' self._payments = [] self._current_payment = 0
def from_block(cls, block): """ Restore a bid from a TrustChain block :param data: TrustChainBlock :return: Restored bid :rtype: Bid """ tx_dict = block.transaction["tick"] return cls( OrderId(TraderId(tx_dict["trader_id"]), OrderNumber(tx_dict["order_number"])), AssetPair.from_dictionary(tx_dict["assets"]), Timeout(tx_dict["timeout"]), Timestamp(tx_dict["timestamp"]), traded=tx_dict["traded"], block_hash=block.hash )