def test_non_simple_overlap(self):
     buyRate = 250000000
     buy = TradeOffer.BuyOffer(1 * e(7), buyRate)
     sellRate = 0x45 * 3906250
     ltcOffered = 2 * e(7) * sellRate // Amounts.percentDivisor
     deposit = 2 * e(7) // 16
     sell = TradeOffer.SellOffer(deposit, ltcOffered, sellRate)
     appliedRate = (buyRate + sellRate) // 2
     ltcInExchange = 1 * e(7) * appliedRate // Amounts.percentDivisor
     assert ltcInExchange < ltcOffered // 2
     self.assertEqual(ltcInExchange, 2597656)
     n = ltcInExchange
     d = ltcOffered
     exchangeFractionAsFloat = float(n) / d
     assert exchangeFractionAsFloat < 0.482 and exchangeFractionAsFloat > 0.481
     depositInExchange = deposit * n // d
     exchange = TradeOffer.MatchOffers(buy=buy, sell=sell)
     self.assertTrue(buy.hasBeenConsumed())
     self.assertDictEqual(
         sell.__dict__, {
             'rate': sellRate,
             '_swapBillDeposit': deposit - depositInExchange,
             '_ltcOffered': ltcOffered - ltcInExchange
         })
     self.assertDictEqual(
         exchange.__dict__, {
             'swapBillAmount': 1 * e(7),
             'ltc': ltcInExchange,
             'swapBillDeposit': depositInExchange
         })
 def test_meet_or_overlap(self):
     buy = TradeOffer.BuyOffer(1 * e(7), 500000000)
     sell = self.MinimumSellOffer(250000000)
     self.assertFalse(TradeOffer.OffersMeetOrOverlap(buy=buy, sell=sell))
     sell = self.MinimumSellOffer(500000000)
     self.assertTrue(TradeOffer.OffersMeetOrOverlap(buy=buy, sell=sell))
     sell = self.MinimumSellOffer(562500000)
     self.assertTrue(TradeOffer.OffersMeetOrOverlap(buy=buy, sell=sell))
 def test_offer_creation(self):
     self.assertRaises(OfferIsBelowMinimumExchange, TradeOffer.BuyOffer,
                       5000, 375000000)
     self.assertRaises(OfferIsBelowMinimumExchange, TradeOffer.BuyOffer,
                       2 * e(6), 437500000)
     self.assertRaises(OfferIsBelowMinimumExchange, TradeOffer.BuyOffer,
                       2 * e(6),
                       500000000)  # swapbill offered below minimum balance
     self.assertRaises(OfferIsBelowMinimumExchange, TradeOffer.BuyOffer,
                       1 * e(7) - 1, 500000000)
     buy = TradeOffer.BuyOffer(1 * e(7), 500000000)
     self.assertDictEqual(buy.__dict__, {
         'rate': 500000000,
         '_swapBillOffered': 1 * e(7)
     })
     self.assertRaises(OfferIsBelowMinimumExchange, TradeOffer.SellOffer,
                       100, Constraints.minimumExchangeLTC - 1, 437500000)
     self.assertRaises(
         OfferIsBelowMinimumExchange, TradeOffer.SellOffer, 2 * e(6) // 16,
         1 * e(6), 500000000)  # swapbill equivalent below minimum balance
     rate = 437500000
     ltcOffered = TradeOffer.MinimumSellOfferWithRate(rate)
     deposit = TradeOffer.DepositRequiredForLTCSell(rate=rate,
                                                    ltcOffered=ltcOffered)
     sell = TradeOffer.SellOffer(deposit, ltcOffered, rate)
     self.assertDictEqual(sell.__dict__, {
         '_swapBillDeposit': deposit,
         'rate': rate,
         '_ltcOffered': ltcOffered
     })
     self.assertRaises(OfferIsBelowMinimumExchange, TradeOffer.SellOffer,
                       deposit, ltcOffered - 1, rate)
 def test_attempt_break_deposit_invariant(self):
     # set up sell which is split exactly in half by partially matching buy
     # the idea being that one half of the split has to lose the rounding up unit
     buy = TradeOffer.BuyOffer(1 * e(7) + 2, 500000000)
     deposit = TradeOffer.DepositRequiredForLTCSell(rate=500000000,
                                                    ltcOffered=1 * e(7) + 2)
     sell = TradeOffer.SellOffer(deposit, 1 * e(7) + 2, 500000000)
     # attempted to break the invariant for deposit always being the exact required deposit, by division rounded up
     # but it turns out the invariant holds here, because *the exchange* loses the rounding up unit, not the outstanding sell
     exchange = TradeOffer.MatchOffers(buy=buy, sell=sell)
     # buy should be consumed, and sell remainder left outstanding
     self.assertTrue(buy.hasBeenConsumed)
     self.assertDictEqual(sell.__dict__, {
         '_swapBillDeposit': 625001,
         'rate': 500000000,
         '_ltcOffered': 5000001
     })
     self.assertDictEqual(exchange.__dict__, {
         'swapBillAmount': 10000002,
         'ltc': 5000001,
         'swapBillDeposit': 625000
     })
 def test_offer_requirements(self):
     # (based on current protocol constraints)
     self.assertEqual(TradeOffer.MinimumBuyOfferWithRate(500000000),
                      Constraints.minimumSwapBillBalance)
     self.assertEqual(TradeOffer.MinimumSellOfferWithRate(500000000),
                      Constraints.minimumSwapBillBalance // 2)
     self.assertEqual(TradeOffer.MinimumBuyOfferWithRate(62500000),
                      Constraints.minimumExchangeLTC * 16)
     self.assertEqual(TradeOffer.MinimumSellOfferWithRate(62500000),
                      Constraints.minimumExchangeLTC)
     # deposit is rounded up
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(500000000, 1 * e(7)),
         1 * e(7) * 2 // Constraints.depositDivisor)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(250000000, 1 * e(7)),
         1 * e(7) * 4 // Constraints.depositDivisor)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(62500000, 1 * e(7)),
         1 * e(7) * 16 // Constraints.depositDivisor)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(500000000, 1 * e(7) + 1),
         1 * e(7) * 2 // Constraints.depositDivisor + 1)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(250000000, 1 * e(7) + 1),
         1 * e(7) * 4 // Constraints.depositDivisor + 1)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(500000000, 1 * e(7) - 1),
         1 * e(7) * 2 // Constraints.depositDivisor)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(250000000, 1 * e(7) - 1),
         1 * e(7) * 4 // Constraints.depositDivisor)
     # (based on current protocol constraints)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(rate=500000000, ltcOffered=0),
         0)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(rate=500000000, ltcOffered=1),
         1)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(rate=500000000, ltcOffered=7),
         1)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(rate=500000000, ltcOffered=8),
         1)
     self.assertEqual(
         TradeOffer.DepositRequiredForLTCSell(rate=500000000, ltcOffered=9),
         2)
 def test_match_remainder_too_small(self):
     buy = TradeOffer.BuyOffer(2 * e(7) - 1, 500000000)
     sell = TradeOffer.SellOffer(2 * e(7) // 16, 1 * e(7), 500000000)
     # the ltc equivalent for this buy offer now gets rounded up
     exchange = TradeOffer.MatchOffers(buy=buy, sell=sell)
     self.assertTrue(buy.hasBeenConsumed())
     self.assertTrue(sell.hasBeenConsumed())
     self.assertDictEqual(
         exchange.__dict__, {
             'swapBillAmount': 2 * e(7) - 1,
             'ltc': 1 * e(7),
             'swapBillDeposit': 2 * e(7) // 16
         })
     buy = TradeOffer.BuyOffer(2 * e(7) - 2, 500000000)
     sell = TradeOffer.SellOffer(2 * e(7) // 16, 1 * e(7), 500000000)
     self.assertRaises(OfferIsBelowMinimumExchange,
                       TradeOffer.MatchOffers,
                       buy=buy,
                       sell=sell)
     buy = TradeOffer.BuyOffer(2 * e(7), 500000000)
     sell = TradeOffer.SellOffer((2 * e(7) - 2) // 16 + 1, 1 * e(7) - 1,
                                 500000000)
     self.assertRaises(OfferIsBelowMinimumExchange,
                       TradeOffer.MatchOffers,
                       buy=buy,
                       sell=sell)
 def test_match(self):
     # test assertion about offers meeting or overlapping
     buy = TradeOffer.BuyOffer(2 * e(7), 500000000)
     sell = self.MinimumSellOffer(250000000)
     self.assertRaises(AssertionError,
                       TradeOffer.MatchOffers,
                       buy=buy,
                       sell=sell)
     # offer adjustments and match call
     buy = TradeOffer.BuyOffer(2 * e(7), 500000000)
     sell = self.SellOffer(rate=500000000, ltcOffered=1 * e(7))
     exchange = TradeOffer.MatchOffers(buy=buy, sell=sell)
     # offers should match exactly
     self.assertTrue(buy.hasBeenConsumed())
     self.assertTrue(sell.hasBeenConsumed())
     self.assertDictEqual(
         exchange.__dict__, {
             'swapBillAmount': 2 * e(7),
             'ltc': 1 * e(7),
             'swapBillDeposit': 2 * e(7) // 16
         })
     # offer adjustments and next match call
     buy = TradeOffer.BuyOffer(2 * e(7), 500000000)
     sell = TradeOffer.SellOffer(12 * e(6) // 16, 6 * e(6), 500000000)
     self.assertRaises(OfferIsBelowMinimumExchange,
                       TradeOffer.MatchOffers,
                       buy=buy,
                       sell=sell)
     # offer adjustments and next match call
     buy = TradeOffer.BuyOffer(22 * e(6), 500000000)
     sell = TradeOffer.SellOffer(12 * e(6) // 16, 6 * e(6), 500000000)
     exchange = TradeOffer.MatchOffers(buy=buy, sell=sell)
     # sell should be consumed, and buy remainder left outstanding
     self.assertDictEqual(buy.__dict__, {
         'rate': 500000000,
         '_swapBillOffered': 1 * e(7)
     })
     self.assertTrue(sell.hasBeenConsumed())
     self.assertDictEqual(
         exchange.__dict__, {
             'swapBillAmount': 12 * e(6),
             'ltc': 6 * e(6),
             'swapBillDeposit': 12 * e(6) // 16
         })
     # offer adjustments and next match call
     buy = TradeOffer.BuyOffer(2 * e(7), 500000000)
     sell = TradeOffer.SellOffer(6 * e(7) // 16, 3 * e(7), 500000000)
     exchange = TradeOffer.MatchOffers(buy=buy, sell=sell)
     # buy should be consumed, and sell remainder left outstanding
     self.assertTrue(buy.hasBeenConsumed())
     self.assertDictEqual(
         sell.__dict__, {
             'rate': 500000000,
             '_swapBillDeposit': 4 * e(7) // 16,
             '_ltcOffered': 2 * e(7)
         })
     self.assertDictEqual(
         exchange.__dict__, {
             'swapBillAmount': 2 * e(7),
             'ltc': 1 * e(7),
             'swapBillDeposit': 2 * e(7) // 16
         })
     # similar set of tests, but with different buy and sell rates
     # offer setup and match call
     buy = TradeOffer.BuyOffer(2 * e(7), 437500000)
     sell = TradeOffer.SellOffer(1111112, 1 * e(7), 562500000)
     exchange = TradeOffer.MatchOffers(buy=buy, sell=sell)
     # offers should match exactly (at applied rate)
     self.assertTrue(buy.hasBeenConsumed())
     self.assertTrue(sell.hasBeenConsumed())
     self.assertDictEqual(
         exchange.__dict__, {
             'swapBillAmount': 2 * e(7),
             'ltc': 1 * e(7),
             'swapBillDeposit': 1111112
         })
     # offer adjustments and next match call
     buy = TradeOffer.BuyOffer(2 * e(7), 437500000)
     sell = TradeOffer.SellOffer(666667, 6 * e(6), 562500000)
     self.assertRaises(OfferIsBelowMinimumExchange,
                       TradeOffer.MatchOffers,
                       buy=buy,
                       sell=sell)
     # offer adjustments and next match call
     buy = TradeOffer.BuyOffer(22 * e(6), 437500000)
     sell = TradeOffer.SellOffer(666667, 6 * e(6), 562500000)
     exchange = TradeOffer.MatchOffers(buy=buy, sell=sell)
     # sell should be consumed, and buy remainder left outstanding
     self.assertDictEqual(buy.__dict__, {
         'rate': 437500000,
         '_swapBillOffered': 1 * e(7)
     })
     self.assertTrue(sell.hasBeenConsumed())
     self.assertDictEqual(
         exchange.__dict__, {
             'swapBillAmount': 12 * e(6),
             'ltc': 6 * e(6),
             'swapBillDeposit': 666667
         })
     # offer adjustments and next match call
     buy = TradeOffer.BuyOffer(2 * e(7), 437500000)
     sell = TradeOffer.SellOffer(3333334, 3 * e(7), 562500000)
     exchange = TradeOffer.MatchOffers(buy=buy, sell=sell)
     # buy should be consumed, and sell remainder left outstanding
     self.assertTrue(buy.hasBeenConsumed())
     self.assertDictEqual(
         sell.__dict__, {
             'rate': 562500000,
             '_swapBillDeposit': 2222223,
             '_ltcOffered': 2 * e(7)
         })
     self.assertDictEqual(
         exchange.__dict__, {
             'swapBillAmount': 2 * e(7),
             'ltc': 1 * e(7),
             'swapBillDeposit': 1111111
         })