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)
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))
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)
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)
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)
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)
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)
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))