Esempio n. 1
0
    def test_01_part_xmr(self):
        logging.info('---------- Test PART to XMR')
        swap_clients = self.swap_clients

        js_1 = json.loads(urlopen('http://localhost:1801/json/wallets').read())
        assert(make_int(js_1[str(int(Coins.XMR))]['balance'], scale=12) > 0)
        assert(make_int(js_1[str(int(Coins.XMR))]['unconfirmed'], scale=12) > 0)

        offer_id = swap_clients[0].postOffer(Coins.PART, Coins.XMR, 100 * COIN, 0.11 * XMR_COIN, 100 * COIN, SwapTypes.XMR_SWAP)
        wait_for_offer(delay_event, swap_clients[1], offer_id)
        offers = swap_clients[1].listOffers(filters={'offer_id': offer_id})
        assert(len(offers) == 1)
        offer = offers[0]

        bid_id = swap_clients[1].postXmrBid(offer_id, offer.amount_from)

        wait_for_bid(delay_event, swap_clients[0], bid_id, BidStates.BID_RECEIVED)

        bid, xmr_swap = swap_clients[0].getXmrBid(bid_id)
        assert(xmr_swap)

        swap_clients[0].acceptXmrBid(bid_id)

        wait_for_bid(delay_event, swap_clients[0], bid_id, BidStates.SWAP_COMPLETED, wait_for=180)
        wait_for_bid(delay_event, swap_clients[1], bid_id, BidStates.SWAP_COMPLETED, sent=True)

        js_0_end = json.loads(urlopen('http://localhost:1800/json/wallets').read())
        end_xmr = float(js_0_end['6']['balance']) + float(js_0_end['6']['unconfirmed'])
        assert(end_xmr > 10.9 and end_xmr < 11.0)
Esempio n. 2
0
 def test_make_int12(self):
     def test_case(vs, vf, expect_int):
         i = make_int(vs, 12)
         assert(i == expect_int and isinstance(i, int))
         i = make_int(vf, 12)
         assert(i == expect_int and isinstance(i, int))
         vs_out = format_amount(i, 12)
         # Strip
         for i in range(7):
             if vs_out[-1] == '0':
                 vs_out = vs_out[:-1]
         if '.' in vs:
             assert(vs_out == vs)
         else:
             assert(vs_out[:-2] == vs)
     test_case('0.123456789', 0.123456789, 123456789000)
     test_case('0.123456789123', 0.123456789123, 123456789123)
     try:
         make_int('0.1234567891234', 12)
         assert(False)
     except Exception as e:
         assert(str(e) == 'Mantissa too long')
     validate_amount('0.123456789123', 12)
     try:
         validate_amount('0.1234567891234', 12)
         assert(False)
     except Exception as e:
         assert('Too many decimal places' in str(e))
     try:
         validate_amount(0.1234567891234, 12)
         assert(False)
     except Exception as e:
         assert('Too many decimal places' in str(e))
Esempio n. 3
0
 def test_case(vs, vf, expect_int):
     i = make_int(vs)
     assert(i == expect_int and isinstance(i, int))
     i = make_int(vf)
     assert(i == expect_int and isinstance(i, int))
     vs_out = format_amount(i, 8)
     # Strip
     for i in range(7):
         if vs_out[-1] == '0':
             vs_out = vs_out[:-1]
     if '.' in vs:
         assert(vs_out == vs)
     else:
         assert(vs_out[:-2] == vs)
Esempio n. 4
0
    def test_10_bad_ptx(self):
        # Invalid PTX sent, swap should stall and ITx and PTx should be reclaimed by senders
        logging.info('---------- Test bad PTx, LTC to BTC')
        swap_clients = self.swap_clients

        swap_value = make_int(random.uniform(0.001, 10.0), scale=8, r=1)
        logging.info('swap_value {}'.format(format_amount(swap_value, 8)))
        offer_id = swap_clients[0].postOffer(Coins.LTC, Coins.BTC, swap_value, 0.1 * COIN, swap_value, SwapTypes.SELLER_FIRST,
                                             SEQUENCE_LOCK_BLOCKS, 10)

        wait_for_offer(test_delay_event, swap_clients[1], offer_id)
        offer = swap_clients[1].getOffer(offer_id)
        bid_id = swap_clients[1].postBid(offer_id, offer.amount_from)
        swap_clients[1].setBidDebugInd(bid_id, DebugTypes.MAKE_INVALID_PTX)

        wait_for_bid(test_delay_event, swap_clients[0], bid_id)
        swap_clients[0].acceptBid(bid_id)

        wait_for_bid(test_delay_event, swap_clients[0], bid_id, BidStates.SWAP_COMPLETED, wait_for=120)
        wait_for_bid(test_delay_event, swap_clients[1], bid_id, BidStates.SWAP_COMPLETED, sent=True, wait_for=120)

        js_0_bid = json.loads(urlopen('http://127.0.0.1:1800/json/bids/{}'.format(bid_id.hex())).read())
        js_1_bid = json.loads(urlopen('http://127.0.0.1:1801/json/bids/{}'.format(bid_id.hex())).read())
        assert(js_0_bid['itx_state'] == 'Refunded')
        assert(js_1_bid['ptx_state'] == 'Refunded')

        js_0 = json.loads(urlopen('http://127.0.0.1:1800/json').read())
        js_1 = json.loads(urlopen('http://127.0.0.1:1801/json').read())
        assert(js_0['num_swapping'] == 0 and js_0['num_watched_outputs'] == 0)
        assert(js_1['num_swapping'] == 0 and js_1['num_watched_outputs'] == 0)
Esempio n. 5
0
    def test_make_int(self):
        def test_case(vs, vf, expect_int):
            i = make_int(vs)
            assert (i == expect_int and isinstance(i, int))
            i = make_int(vf)
            assert (i == expect_int and isinstance(i, int))
            vs_out = format_amount(i, 8)
            # Strip
            for i in range(7):
                if vs_out[-1] == '0':
                    vs_out = vs_out[:-1]
            if '.' in vs:
                assert (vs_out == vs)
            else:
                assert (vs_out[:-2] == vs)

        test_case('0', 0, 0)
        test_case('1', 1, 100000000)
        test_case('10', 10, 1000000000)
        test_case('0.00899999', 0.00899999, 899999)
        test_case('899999.0', 899999.0, 89999900000000)
        test_case('899999.00899999', 899999.00899999, 89999900899999)
        test_case('0.0', 0.0, 0)
        test_case('1.0', 1.0, 100000000)
        test_case('1.1', 1.1, 110000000)
        test_case('1.2', 1.2, 120000000)
        test_case('0.00899991', 0.00899991, 899991)
        test_case('0.0089999', 0.0089999, 899990)
        test_case('0.0089991', 0.0089991, 899910)
        test_case('0.123', 0.123, 12300000)
        test_case('123000.000123', 123000.000123, 12300000012300)

        try:
            make_int('0.123456789')
            assert (False)
        except Exception as e:
            assert (str(e) == 'Mantissa too long')
        validate_amount('0.12345678')

        # floor
        assert (make_int('0.123456789', r=-1) == 12345678)
        # Round up
        assert (make_int('0.123456789', r=1) == 12345679)
Esempio n. 6
0
    def test_11_particl_anon(self):
        logging.info('---------- Test Particl anon transactions')
        swap_clients = self.swap_clients

        js_0 = json.loads(
            urlopen('http://127.0.0.1:1800/json/wallets/part').read())
        assert (float(js_0['anon_balance']) == 0.0)

        js_1 = json.loads(
            urlopen('http://127.0.0.1:1801/json/wallets/part').read())
        assert (float(js_1['balance']) > 200.0)

        callnoderpc(
            1, 'reservebalance', [True, 1000000]
        )  # Stop staking to avoid conflicts (input used by tx->anon staked before tx gets in the chain)
        post_json = {
            'value': 100,
            'address': js_1['stealth_address'],
            'subfee': False,
            'type_to': 'anon',
        }
        json_rv = json.loads(
            post_json_req('http://127.0.0.1:1801/json/wallets/part/withdraw',
                          post_json))
        assert (len(json_rv['txid']) == 64)

        post_json['value'] = 0.5
        for i in range(22):
            json_rv = json.loads(
                post_json_req(
                    'http://127.0.0.1:1801/json/wallets/part/withdraw',
                    post_json))
            assert (len(json_rv['txid']) == 64)

        logging.info('Waiting for anon balance')
        try:
            wait_for_balance(test_delay_event,
                             'http://127.0.0.1:1801/json/wallets/part',
                             'anon_balance', 110.0)
        except Exception as e:
            ft = callnoderpc(0, 'filtertransactions', [{'count': 0}])
            raise e

        callnoderpc(1, 'reservebalance', [False])
        post_json = {
            'value': 10,
            'address': js_0['stealth_address'],
            'subfee': True,
            'type_from': 'anon',
            'type_to': 'blind',
        }
        json_rv = json.loads(
            post_json_req('http://127.0.0.1:1801/json/wallets/part/withdraw',
                          post_json))
        assert (len(json_rv['txid']) == 64)

        logging.info('Waiting for blind balance')
        wait_for_balance(test_delay_event,
                         'http://127.0.0.1:1800/json/wallets/part',
                         'blind_balance', 9.8)
        if float(js_0['blind_balance']) >= 10.0:
            raise ValueError('Expect blind balance < 10')

        return  # TODO

        amt_swap = make_int(random.uniform(0.1, 2.0), scale=8, r=1)
        rate_swap = make_int(random.uniform(2.0, 20.0), scale=8, r=1)
        offer_id = swap_clients[0].postOffer(Coins.BTC, Coins.PART_ANON,
                                             amt_swap, rate_swap, amt_swap,
                                             SwapTypes.XMR_SWAP)
        wait_for_offer(test_delay_event, swap_clients[1], offer_id)
        offers = swap_clients[0].listOffers(filters={'offer_id': offer_id})
        offer = offers[0]

        bid_id = swap_clients[1].postXmrBid(offer_id, offer.amount_from)

        wait_for_bid(test_delay_event, swap_clients[0], bid_id,
                     BidStates.BID_RECEIVED)

        bid, xmr_swap = swap_clients[0].getXmrBid(bid_id)
        assert (xmr_swap)

        swap_clients[0].acceptXmrBid(bid_id)

        wait_for_bid(test_delay_event,
                     swap_clients[0],
                     bid_id,
                     BidStates.SWAP_COMPLETED,
                     wait_for=180)
        wait_for_bid(test_delay_event,
                     swap_clients[1],
                     bid_id,
                     BidStates.SWAP_COMPLETED,
                     sent=True)

        js_1 = json.loads(
            urlopen('http://127.0.0.1:1801/json/wallets/part').read())
        print('[rm] js_1', js_1)
Esempio n. 7
0
    def test_06_multiple_swaps(self):
        logging.info('---------- Test Multiple concurrent swaps')
        swap_clients = self.swap_clients

        js_w0_before = json.loads(
            urlopen('http://127.0.0.1:1800/json/wallets').read())
        js_w1_before = json.loads(
            urlopen('http://127.0.0.1:1801/json/wallets').read())

        amt_1 = make_int(random.uniform(0.001, 49.0), scale=8, r=1)
        amt_2 = make_int(random.uniform(0.001, 49.0), scale=8, r=1)

        rate_1 = make_int(random.uniform(80.0, 110.0), scale=12, r=1)
        rate_2 = make_int(random.uniform(0.01, 0.5), scale=12, r=1)

        logging.info('amt_1 {}, rate_1 {}'.format(amt_1, rate_1))
        logging.info('amt_2 {}, rate_2 {}'.format(amt_2, rate_2))
        offer1_id = swap_clients[0].postOffer(Coins.BTC, Coins.XMR, amt_1,
                                              rate_1, amt_1,
                                              SwapTypes.XMR_SWAP)
        offer2_id = swap_clients[0].postOffer(Coins.PART, Coins.XMR, amt_2,
                                              rate_2, amt_2,
                                              SwapTypes.XMR_SWAP)

        wait_for_offer(test_delay_event, swap_clients[1], offer1_id)
        offer1 = swap_clients[1].getOffer(offer1_id)
        wait_for_offer(test_delay_event, swap_clients[1], offer2_id)
        offer2 = swap_clients[1].getOffer(offer2_id)

        bid1_id = swap_clients[1].postXmrBid(offer1_id, offer1.amount_from)
        bid2_id = swap_clients[1].postXmrBid(offer2_id, offer2.amount_from)

        offer3_id = swap_clients[0].postOffer(Coins.PART, Coins.XMR, 11 * COIN,
                                              0.15 * XMR_COIN, 11 * COIN,
                                              SwapTypes.XMR_SWAP)

        wait_for_bid(test_delay_event, swap_clients[0], bid1_id,
                     BidStates.BID_RECEIVED)
        swap_clients[0].acceptXmrBid(bid1_id)

        wait_for_offer(test_delay_event, swap_clients[1], offer3_id)
        offer3 = swap_clients[1].getOffer(offer3_id)
        bid3_id = swap_clients[1].postXmrBid(offer3_id, offer3.amount_from)

        wait_for_bid(test_delay_event, swap_clients[0], bid2_id,
                     BidStates.BID_RECEIVED)
        swap_clients[0].acceptXmrBid(bid2_id)

        wait_for_bid(test_delay_event, swap_clients[0], bid3_id,
                     BidStates.BID_RECEIVED)
        swap_clients[0].acceptXmrBid(bid3_id)

        wait_for_bid(test_delay_event,
                     swap_clients[0],
                     bid1_id,
                     BidStates.SWAP_COMPLETED,
                     wait_for=180)
        wait_for_bid(test_delay_event,
                     swap_clients[1],
                     bid1_id,
                     BidStates.SWAP_COMPLETED,
                     sent=True)

        wait_for_bid(test_delay_event,
                     swap_clients[0],
                     bid2_id,
                     BidStates.SWAP_COMPLETED,
                     wait_for=120)
        wait_for_bid(test_delay_event,
                     swap_clients[1],
                     bid2_id,
                     BidStates.SWAP_COMPLETED,
                     sent=True)

        wait_for_bid(test_delay_event,
                     swap_clients[0],
                     bid3_id,
                     BidStates.SWAP_COMPLETED,
                     wait_for=120)
        wait_for_bid(test_delay_event,
                     swap_clients[1],
                     bid3_id,
                     BidStates.SWAP_COMPLETED,
                     sent=True)

        wait_for_none_active(test_delay_event, 1800)
        wait_for_none_active(test_delay_event, 1801)

        js_w0_after = json.loads(
            urlopen('http://127.0.0.1:1800/json/wallets').read())
        js_w1_after = json.loads(
            urlopen('http://127.0.0.1:1801/json/wallets').read())
        logging.info('[rm] js_w0_after {}'.format(
            json.dumps(js_w0_after, indent=4)))
        logging.info('[rm] js_w1_after {}'.format(
            json.dumps(js_w1_after, indent=4)))

        assert (make_int(js_w1_after['2']['balance'], scale=8, r=1) -
                (make_int(js_w1_before['2']['balance'], scale=8, r=1) + amt_1)
                < 1000)
Esempio n. 8
0
    def test_rate(self):
        scale_from = 8
        scale_to = 12
        amount_from = make_int(100, scale_from)
        rate = make_int(0.1, scale_to)

        amount_to = int((amount_from * rate) // (10**scale_from))
        assert ('100.00000000' == format_amount(amount_from, scale_from))
        assert ('10.000000000000' == format_amount(amount_to, scale_to))

        rate_check = make_int((amount_to / amount_from), scale_from)
        assert (rate == rate_check)

        scale_from = 12
        scale_to = 8
        amount_from = make_int(1, scale_from)
        rate = make_int(12, scale_to)

        amount_to = int((amount_from * rate) // (10**scale_from))
        assert ('1.000000000000' == format_amount(amount_from, scale_from))
        assert ('12.00000000' == format_amount(amount_to, scale_to))

        rate_check = make_int((amount_to / amount_from), scale_from)
        assert (rate == rate_check)

        scale_from = 8
        scale_to = 8
        amount_from = make_int(0.073, scale_from)
        amount_to = make_int(10, scale_to)
        rate = make_int(amount_to / amount_from, scale_to, r=1)
        amount_to_recreate = int((amount_from * rate) // (10**scale_from))
        assert ('10.00000000' == format_amount(amount_to_recreate, scale_to))

        scale_from = 8
        scale_to = 12
        amount_from = make_int(10.0, scale_from)
        amount_to = make_int(0.06935, scale_to)
        rate = make_int(amount_to / amount_from, scale_from, r=1)
        amount_to_recreate = int((amount_from * rate) // (10**scale_from))
        assert ('0.069350000000' == format_amount(amount_to_recreate,
                                                  scale_to))

        scale_from = 12
        scale_to = 8
        amount_from = make_int(0.06935, scale_from)
        amount_to = make_int(10.0, scale_to)
        rate = make_int(amount_to / amount_from, scale_from, r=1)
        amount_to_recreate = int((amount_from * rate) // (10**scale_from))
        assert ('10.00000000' == format_amount(amount_to_recreate, scale_to))