diff --git a/basicswap/basicswap.py b/basicswap/basicswap.py index af86b42..74517a6 100644 --- a/basicswap/basicswap.py +++ b/basicswap/basicswap.py @@ -5552,8 +5552,8 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp): use_cursor = self.openDB(cursor) bid, offer = self.getBidAndOffer(bid_id, use_cursor) - ensure(bid, "Bid not found") - ensure(offer, "Offer not found") + ensure(bid, f"Bid not found: {self.log.id(bid_id)}.") + ensure(offer, f"Offer not found: {self.log.id(bid.offer_id)}.") # Ensure bid is still valid now: int = self.getTime() @@ -6828,8 +6828,8 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp): try: use_cursor = self.openDB(cursor) bid, offer = self.getBidAndOffer(bid_id, use_cursor, with_txns=False) - ensure(bid, "Bid not found") - ensure(offer, "Offer not found") + ensure(bid, f"Bid not found: {self.log.id(bid_id)}.") + ensure(offer, f"Offer not found: {self.log.id(bid.offer_id)}.") bid.setState(new_state) self.deactivateBid(use_cursor, offer, bid) @@ -13018,8 +13018,8 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp): self.log.info(f"Route established for bid {self.log.id(bid_id)}") bid, offer = self.getBidAndOffer(bid_id, cursor) - ensure(bid, "Bid not found") - ensure(offer, "Offer not found") + ensure(bid, f"Bid not found: {self.log.id(bid_id)}.") + ensure(offer, f"Offer not found: {self.log.id(bid.offer_id)}.") coin_from = Coins(offer.coin_from) coin_to = Coins(offer.coin_to) @@ -15133,8 +15133,7 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp): return bid = self.getBid(bid_id) - if bid is None: - raise ValueError("Bid not found.") + ensure(bid, f"Bid not found: {self.log.id(bid_id)}.") bid.debug_ind = debug_ind diff --git a/basicswap/interface/btc.py b/basicswap/interface/btc.py index ce60c0a..da62769 100644 --- a/basicswap/interface/btc.py +++ b/basicswap/interface/btc.py @@ -3667,7 +3667,7 @@ class BTCInterface(FeeValidator, Secp256k1Interface): continue if "desc" in u: desc = u["desc"] - if self.using_segwit: + if self.using_segwit(): if self.use_p2shp2wsh(): if not desc.startswith("sh(wpkh"): continue @@ -3828,7 +3828,7 @@ class BTCInterface(FeeValidator, Secp256k1Interface): ensure( sign_for_addr is not None, - "Could not find address with enough funds for proof", + f"Could not find {self.ticker()} address with enough funds for proof", ) self._log.debug(f"sign_for_addr {sign_for_addr}") diff --git a/basicswap/interface/ltc.py b/basicswap/interface/ltc.py index 2faadfc..a60edae 100644 --- a/basicswap/interface/ltc.py +++ b/basicswap/interface/ltc.py @@ -102,7 +102,7 @@ class LTCInterface(BTCInterface): continue if "desc" in u: desc = u["desc"] - if self.using_segwit: + if self.using_segwit(): if self.use_p2shp2wsh(): if not desc.startswith("sh(wpkh"): continue diff --git a/basicswap/interface/pivx.py b/basicswap/interface/pivx.py index 9c32696..689e2c0 100644 --- a/basicswap/interface/pivx.py +++ b/basicswap/interface/pivx.py @@ -170,3 +170,13 @@ class PIVXInterface(BTCInterface): block_height = self.getBlockHeader(rv["blockhash"])["height"] return {"txid": txid_hex, "amount": 0, "height": block_height} return None + + def getChainMedianTime(self) -> int: + bestblockhash = self.rpc("getbestblockhash") + bestblockheader = self.rpc( + "getblockheader", + [ + bestblockhash, + ], + ) + return bestblockheader["mediantime"] diff --git a/basicswap/protocols/xmr_swap_1.py b/basicswap/protocols/xmr_swap_1.py index 575b162..0b32762 100644 --- a/basicswap/protocols/xmr_swap_1.py +++ b/basicswap/protocols/xmr_swap_1.py @@ -50,11 +50,11 @@ def recoverNoScriptTxnWithKey(self, bid_id: bytes, encoded_key, cursor=None): try: use_cursor = self.openDB(cursor) bid, xmr_swap = self.getXmrBidFromSession(use_cursor, bid_id) - ensure(bid, "Bid not found: {}.".format(bid_id.hex())) - ensure(xmr_swap, "Adaptor-sig swap not found: {}.".format(bid_id.hex())) + ensure(bid, f"Bid not found: {self.log.id(bid_id)}.") + ensure(xmr_swap, f"Adaptor-sig swap not found: {self.log.id(bid_id)}.") offer, xmr_offer = self.getXmrOfferFromSession(use_cursor, bid.offer_id) - ensure(offer, "Offer not found: {}.".format(bid.offer_id.hex())) - ensure(xmr_offer, "Adaptor-sig offer not found: {}.".format(bid.offer_id.hex())) + ensure(offer, f"Offer not found: {self.log.id(bid.offer_id)}.") + ensure(xmr_offer, f"Adaptor-sig offer not found: {self.log.id(bid.offer_id)}.") # The no-script coin is always the follower reverse_bid: bool = self.is_reverse_ads_bid(offer.coin_from, offer.coin_to) @@ -106,7 +106,10 @@ def recoverNoScriptTxnWithKey(self, bid_id: bytes, encoded_key, cursor=None): address_to = self.getReceiveAddressFromPool( base_coin_to, bid_id, TxTypes.XMR_SWAP_B_LOCK_SPEND, use_cursor ) - amount = bid.amount_to + amount: int = bid.amount_to + chain_b_fee_rate: int = ( + xmr_offer.a_fee_rate if reverse_bid else xmr_offer.b_fee_rate + ) lock_tx_vout = bid.getLockTXBVout() txid = ci_follower.spendBLockTx( xmr_swap.b_lock_tx_id, @@ -114,7 +117,7 @@ def recoverNoScriptTxnWithKey(self, bid_id: bytes, encoded_key, cursor=None): xmr_swap.vkbv, vkbs, amount, - xmr_offer.b_fee_rate, + chain_b_fee_rate, bid.chain_b_height_start, spend_actual_balance=True, lock_tx_vout=lock_tx_vout, diff --git a/tests/basicswap/common.py b/tests/basicswap/common.py index 78616ea..8d414d2 100644 --- a/tests/basicswap/common.py +++ b/tests/basicswap/common.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (c) 2020-2024 tecnovert @@ -163,7 +162,7 @@ def prepare_balance( post_json["type_to"] = type_to json_rv = read_json_api( port_take_from_node, - "wallets/{}/withdraw".format(coin_ticker.lower()), + f"wallets/{coin_ticker.lower()}/withdraw", post_json, ) assert len(json_rv["txid"]) == 64 diff --git a/tests/basicswap/common_xmr.py b/tests/basicswap/common_xmr.py index f7e2c80..0eb689b 100644 --- a/tests/basicswap/common_xmr.py +++ b/tests/basicswap/common_xmr.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (c) 2020-2024 tecnovert diff --git a/tests/basicswap/extended/test_dash.py b/tests/basicswap/extended/test_dash.py index c052f78..7482cc1 100644 --- a/tests/basicswap/extended/test_dash.py +++ b/tests/basicswap/extended/test_dash.py @@ -175,6 +175,7 @@ def prepareDir(datadir, nodeId, network_key, network_pubkey): "datadir": node_dir, "bindir": cfg.PARTICL_BINDIR, "blocks_confirmed": 2, # Faster testing + "wallet_name": "bsx_wallet", }, "dash": { "connection_type": "rpc", @@ -184,6 +185,7 @@ def prepareDir(datadir, nodeId, network_key, network_pubkey): "bindir": DASH_BINDIR, "use_csv": True, "use_segwit": False, + "wallet_name": "bsx_wallet", }, "bitcoin": { "connection_type": "rpc", @@ -192,6 +194,7 @@ def prepareDir(datadir, nodeId, network_key, network_pubkey): "datadir": btcdatadir, "bindir": cfg.BITCOIN_BINDIR, "use_segwit": True, + "wallet_name": "bsx_wallet", }, }, "check_progress_seconds": 2, @@ -285,7 +288,7 @@ class Test(unittest.TestCase): @classmethod def setUpClass(cls): - super(Test, cls).setUpClass() + super().setUpClass() k = PrivateKey() cls.network_key = toWIF(PREFIX_SECRET_KEY_REGTEST, k.secret) @@ -409,15 +412,15 @@ class Test(unittest.TestCase): waitForRPC(dashRpc, delay_event, rpc_command="getblockchaininfo") if len(dashRpc("listwallets")) < 1: - dashRpc("createwallet wbsx_wallet") + dashRpc("createwallet bsx_wallet") sc.start() waitForRPC(dashRpc, delay_event) num_blocks = 500 - logging.info("Mining %d dash blocks", num_blocks) + logging.info(f"Mining {num_blocks} dash blocks") cls.dash_addr = dashRpc("getnewaddress mining_addr") - dashRpc("generatetoaddress {} {}".format(num_blocks, cls.dash_addr)) + dashRpc(f"generatetoaddress {num_blocks} {cls.dash_addr}") ro = dashRpc("getblockchaininfo") try: @@ -431,8 +434,8 @@ class Test(unittest.TestCase): waitForRPC(btcRpc, delay_event) cls.btc_addr = btcRpc("getnewaddress mining_addr bech32") - logging.info("Mining %d Bitcoin blocks to %s", num_blocks, cls.btc_addr) - btcRpc("generatetoaddress {} {}".format(num_blocks, cls.btc_addr)) + logging.info(f"Mining {num_blocks} Bitcoin blocks to {cls.btc_addr}") + btcRpc(f"generatetoaddress {num_blocks} {cls.btc_addr}") ro = btcRpc("getblockchaininfo") checkForks(ro) @@ -449,7 +452,7 @@ class Test(unittest.TestCase): # Wait for height, or sequencelock is thrown off by genesis blocktime num_blocks = 3 - logging.info("Waiting for Particl chain height %d", num_blocks) + logging.info(f"Waiting for Particl chain height {num_blocks}") for i in range(60): particl_blocks = cls.swap_clients[0].callrpc("getblockcount") print("particl_blocks", particl_blocks) @@ -473,7 +476,7 @@ class Test(unittest.TestCase): cls.swap_clients.clear() cls.daemons.clear() - super(Test, cls).tearDownClass() + super().tearDownClass() def test_02_part_dash(self): logging.info("---------- Test PART to DASH") @@ -683,9 +686,9 @@ class Test(unittest.TestCase): offer_id = swap_clients[0].postOffer( Coins.DASH, Coins.BTC, - 0.001 * COIN, + 0.01 * COIN, 1.0 * COIN, - 0.001 * COIN, + 0.01 * COIN, SwapTypes.SELLER_FIRST, ) @@ -709,7 +712,7 @@ class Test(unittest.TestCase): del swap_clients[0].getChainClientSettings(Coins.DASH)["override_feerate"] def test_08_wallet(self): - logging.info("---------- Test {} wallet".format(self.test_coin_from.name)) + logging.info(f"---------- Test {self.test_coin_from.name} wallet") logging.info("Test withdrawal") addr = dashRpc('getnewaddress "Withdrawal test"') diff --git a/tests/basicswap/extended/test_dcr.py b/tests/basicswap/extended/test_dcr.py index 1f0ba0e..423baf3 100644 --- a/tests/basicswap/extended/test_dcr.py +++ b/tests/basicswap/extended/test_dcr.py @@ -747,14 +747,14 @@ class Test(BaseTest): @classmethod def tearDownClass(cls): logging.info("Finalising Decred Test") - super(Test, cls).tearDownClass() + super().tearDownClass() stopDaemons(cls.dcr_daemons) cls.dcr_daemons.clear() @classmethod def coins_loop(cls): - super(Test, cls).coins_loop() + super().coins_loop() ci0 = cls.swap_clients[0].ci(cls.test_coin) num_passed: int = 0 diff --git a/tests/basicswap/extended/test_doge.py b/tests/basicswap/extended/test_doge.py index 63a6a1c..3373f1b 100644 --- a/tests/basicswap/extended/test_doge.py +++ b/tests/basicswap/extended/test_doge.py @@ -179,6 +179,7 @@ class Test(TestFunctions): @classmethod def prepareExtraCoins(cls): + super().prepareExtraCoins() if cls.restore_instance: void_block_rewards_pubkey = cls.getRandomPubkey() cls.doge_addr = ( @@ -232,7 +233,7 @@ class Test(TestFunctions): @classmethod def tearDownClass(cls): logging.info("Finalising DOGE Test") - super(Test, cls).tearDownClass() + super().tearDownClass() stopDaemons(cls.doge_daemons) cls.doge_daemons.clear() @@ -251,11 +252,12 @@ class Test(TestFunctions): "use_segwit": False, "blocks_confirmed": 1, "min_relay_fee": 0.01, # RECOMMENDED_MIN_TX_FEE + "wallet_name": "bsx_wallet", } @classmethod def coins_loop(cls): - super(Test, cls).coins_loop() + super().coins_loop() if cls.pause_chain: return ci0 = cls.swap_clients[0].ci(cls.test_coin) diff --git a/tests/basicswap/extended/test_doge_with_prepare.py b/tests/basicswap/extended/test_doge_with_prepare.py index 7402732..1aad060 100644 --- a/tests/basicswap/extended/test_doge_with_prepare.py +++ b/tests/basicswap/extended/test_doge_with_prepare.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Copyright (c) 2024 The Basicswap developers +# Copyright (c) 2024-2026 The Basicswap developers # Distributed under the MIT software license, see the accompanying # file LICENSE or http://www.opensource.org/licenses/mit-license.php. @@ -12,7 +12,7 @@ mkdir -p ${TEST_PATH}/bin cp -r ~/tmp/basicswap_bin/* ${TEST_PATH}/bin export PYTHONPATH=$(pwd) export TEST_COINS_LIST='bitcoin,dogecoin' -python tests/basicswap/extended/test_doge.py +python tests/basicswap/extended/test_doge_with_prepare.py """ @@ -27,11 +27,9 @@ from tests.basicswap.extended.test_xmr_persistent import ( BaseTestWithPrepare, UI_PORT, ) -from tests.basicswap.extended.test_scripts import ( - wait_for_offers, -) from tests.basicswap.util import ( read_json_api, + wait_for_offers, ) logger = logging.getLogger() @@ -50,11 +48,11 @@ def wait_for_bid( bid = read_json_api(UI_PORT + node_id, f"bids/{bid_id}") - if "state" not in bid: + if "bid_state" not in bid: continue if state is None: return - if bid["state"].lower() == state.lower(): + if bid["bid_state"].lower() == state.lower(): return raise ValueError("wait_for_bid failed") @@ -101,8 +99,8 @@ def prepare_balance( class DOGETest(BaseTestWithPrepare): + __test__ = True def test_a(self): - amount_from = 10.0 offer_json = { "coin_from": "btc", @@ -114,10 +112,8 @@ class DOGETest(BaseTestWithPrepare): "automation_strat_id": 1, } offer_id = read_json_api(UI_PORT + 0, "offers/new", offer_json)["offer_id"] - logging.debug(f"offer_id {offer_id}") prepare_balance(self.delay_event, 1, 0, "DOGE", 1000.0) - wait_for_offers(self.delay_event, 1, 1, offer_id) post_json = {"offer_id": offer_id, "amount_from": amount_from} diff --git a/tests/basicswap/extended/test_firo.py b/tests/basicswap/extended/test_firo.py index fea55d2..7d533cd 100644 --- a/tests/basicswap/extended/test_firo.py +++ b/tests/basicswap/extended/test_firo.py @@ -104,7 +104,7 @@ def prepareDataDir( fp.write("debug=1\n") fp.write("debugexclude=libevent\n") - fp.write("fallbackfee=0.01\n") + fp.write("fallbackfee=0.0002\n") fp.write("acceptnonstdtxn=0\n") """ diff --git a/tests/basicswap/extended/test_key_paths.py b/tests/basicswap/extended/test_key_paths.py index 3c66b37..a2f63fb 100644 --- a/tests/basicswap/extended/test_key_paths.py +++ b/tests/basicswap/extended/test_key_paths.py @@ -29,6 +29,7 @@ import unittest from tests.basicswap.util import ( read_json_api, waitForServer, + UI_PORT, ) logger = logging.getLogger() @@ -37,9 +38,6 @@ if not len(logger.handlers): logger.addHandler(logging.StreamHandler(sys.stdout)) -PORT_OFS = int(os.getenv("PORT_OFS", 1)) -UI_PORT = 12700 + PORT_OFS - ELECTRUM_PATH = os.getenv("ELECTRUM_PATH") ELECTRUM_DATADIR = os.getenv("ELECTRUM_DATADIR") diff --git a/tests/basicswap/extended/test_pivx.py b/tests/basicswap/extended/test_pivx.py index e1aec6c..17f94ef 100644 --- a/tests/basicswap/extended/test_pivx.py +++ b/tests/basicswap/extended/test_pivx.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Copyright (c) 2022-2023 tecnovert -# Copyright (c) 2024-2025 The Basicswap developers +# Copyright (c) 2024-2026 The Basicswap developers # Distributed under the MIT software license, see the accompanying # file LICENSE or http://www.opensource.org/licenses/mit-license.php. @@ -147,6 +147,7 @@ def prepareDir(datadir, nodeId, network_key, network_pubkey): fp.write("acceptnonstdtxn=0\n") fp.write("minstakeinterval=5\n") + fp.write("stakethreadconddelayms=1000\n") fp.write("smsgsregtestadjust=0\n") for i in range(0, NUM_NODES): @@ -293,7 +294,7 @@ class Test(unittest.TestCase): @classmethod def setUpClass(cls): - super(Test, cls).setUpClass() + super().setUpClass() k = PrivateKey() cls.network_key = toWIF(PREFIX_SECRET_KEY_REGTEST, k.secret) @@ -473,7 +474,7 @@ class Test(unittest.TestCase): cls.swap_clients.clear() cls.daemons.clear() - super(Test, cls).tearDownClass() + super().tearDownClass() def test_02_part_pivx(self): logging.info("---------- Test PART to PIVX") @@ -500,7 +501,7 @@ class Test(unittest.TestCase): wait_for_in_progress(delay_event, swap_clients[1], bid_id, sent=True) wait_for_bid( - delay_event, swap_clients[0], bid_id, BidStates.SWAP_COMPLETED, wait_for=60 + delay_event, swap_clients[0], bid_id, BidStates.SWAP_COMPLETED, wait_for=80 ) wait_for_bid( delay_event, @@ -508,7 +509,7 @@ class Test(unittest.TestCase): bid_id, BidStates.SWAP_COMPLETED, sent=True, - wait_for=60, + wait_for=80, ) js_0 = read_json_api(1800) @@ -548,7 +549,7 @@ class Test(unittest.TestCase): wait_for=60, ) wait_for_bid( - delay_event, swap_clients[1], bid_id, BidStates.SWAP_COMPLETED, wait_for=60 + delay_event, swap_clients[1], bid_id, BidStates.SWAP_COMPLETED, wait_for=80 ) js_0 = read_json_api(1800) @@ -580,7 +581,7 @@ class Test(unittest.TestCase): wait_for_in_progress(delay_event, swap_clients[1], bid_id, sent=True) wait_for_bid( - delay_event, swap_clients[0], bid_id, BidStates.SWAP_COMPLETED, wait_for=60 + delay_event, swap_clients[0], bid_id, BidStates.SWAP_COMPLETED, wait_for=80 ) wait_for_bid( delay_event, diff --git a/tests/basicswap/extended/test_scripts.py b/tests/basicswap/extended/test_scripts.py index d1b49ca..81f2561 100644 --- a/tests/basicswap/extended/test_scripts.py +++ b/tests/basicswap/extended/test_scripts.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Copyright (c) 2023-2024 tecnovert -# Copyright (c) 2024-2025 The Basicswap developers +# Copyright (c) 2024-2026 The Basicswap developers # Distributed under the MIT software license, see the accompanying # file LICENSE or http://www.opensource.org/licenses/mit-license.php. @@ -36,6 +36,8 @@ from tests.basicswap.common import ( from tests.basicswap.util import ( read_json_api, waitForServer, + wait_for_offers, + UI_PORT, ) logger = logging.getLogger() @@ -44,10 +46,6 @@ if not len(logger.handlers): logger.addHandler(logging.StreamHandler(sys.stdout)) -PORT_OFS = int(os.getenv("PORT_OFS", 1)) -UI_PORT = 12700 + PORT_OFS - - class HttpHandler(BaseHTTPRequestHandler): def js_response(self, url_split, post_string, is_json): @@ -131,18 +129,6 @@ def clear_offers(delay_event, node_id) -> None: raise ValueError("clear_offers failed") -def wait_for_offers(delay_event, node_id, num_offers, offer_id=None) -> None: - logging.info(f"Waiting for {num_offers} offers on node {node_id}") - for i in range(20): - delay_event.wait(1) - offers = read_json_api( - UI_PORT + node_id, "offers" if offer_id is None else f"offers/{offer_id}" - ) - if len(offers) >= num_offers: - return - raise ValueError("wait_for_offers failed") - - def wait_for_bids(delay_event, node_id, num_bids, offer_id=None) -> None: logging.info(f"Waiting for {num_bids} bids on node {node_id}") for i in range(20): diff --git a/tests/basicswap/extended/test_xmr_persistent.py b/tests/basicswap/extended/test_xmr_persistent.py index 896562e..367eb9e 100644 --- a/tests/basicswap/extended/test_xmr_persistent.py +++ b/tests/basicswap/extended/test_xmr_persistent.py @@ -59,6 +59,8 @@ from tests.basicswap.util import ( make_boolean, read_json_api, waitForServer, + PORT_OFS, + UI_PORT, ) from tests.basicswap.common_xmr import ( prepare_nodes, @@ -73,9 +75,6 @@ import basicswap.bin.run as runSystem test_path = os.path.expanduser(os.getenv("TEST_PATH", "/tmp/test_persistent")) RESET_TEST = make_boolean(os.getenv("RESET_TEST", "true")) -PORT_OFS = int(os.getenv("PORT_OFS", 1)) -UI_PORT = 12700 + PORT_OFS - PARTICL_RPC_PORT_BASE = int(os.getenv("PARTICL_RPC_PORT_BASE", BASE_RPC_PORT)) BITCOIN_RPC_PORT_BASE = int(os.getenv("BITCOIN_RPC_PORT_BASE", BTC_BASE_RPC_PORT)) LITECOIN_RPC_PORT_BASE = int(os.getenv("LITECOIN_RPC_PORT_BASE", LTC_BASE_RPC_PORT)) diff --git a/tests/basicswap/mnemonics.py b/tests/basicswap/mnemonics.py index 8da6a6c..357ce9d 100644 --- a/tests/basicswap/mnemonics.py +++ b/tests/basicswap/mnemonics.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (c) 2020 tecnovert diff --git a/tests/basicswap/selenium/util.py b/tests/basicswap/selenium/util.py index 5bf0f07..8105414 100644 --- a/tests/basicswap/selenium/util.py +++ b/tests/basicswap/selenium/util.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (c) 2023 tecnovert diff --git a/tests/basicswap/test_btc_xmr.py b/tests/basicswap/test_btc_xmr.py index bd76ec0..83466f3 100644 --- a/tests/basicswap/test_btc_xmr.py +++ b/tests/basicswap/test_btc_xmr.py @@ -306,11 +306,7 @@ class TestFunctions(BaseTest): def do_test_02_leader_recover_a_lock_tx( self, coin_from: Coins, coin_to: Coins, lock_value: int = 32 ) -> None: - logging.info( - "---------- Test {} to {} leader recovers coin a lock tx".format( - coin_from.name, coin_to.name - ) - ) + logging.info(f"---------- Test {coin_from.name} to {coin_to.name} leader recovers coin a lock tx") id_offerer: int = self.node_a_id id_bidder: int = self.node_b_id @@ -499,23 +495,19 @@ class TestFunctions(BaseTest): # Test manually redeeming the no-script lock tx offerer_key = read_json_api( 1800 + id_offerer, - "bids/{}".format(bid_id.hex()), + f"bids/{bid_id.hex()}", {"chainbkeysplit": True}, )["splitkey"] data = {"spendchainblocktx": True, "remote_key": offerer_key} redeemed_txid = read_json_api( - 1800 + id_bidder, "bids/{}".format(bid_id.hex()), data + 1800 + id_bidder, f"bids/{bid_id.hex()}", data )["txid"] assert len(redeemed_txid) == 64 def do_test_04_follower_recover_b_lock_tx( self, coin_from, coin_to, lock_value: int = 32 ): - logging.info( - "---------- Test {} to {} follower recovers coin b lock tx".format( - coin_from.name, coin_to.name - ) - ) + logging.info(f"---------- Test {coin_from.name} to {coin_to.name} follower recovers coin b lock tx") id_offerer: int = self.node_a_id id_bidder: int = self.node_b_id diff --git a/tests/basicswap/test_xmr.py b/tests/basicswap/test_xmr.py index 01e439d..84fa99d 100644 --- a/tests/basicswap/test_xmr.py +++ b/tests/basicswap/test_xmr.py @@ -815,7 +815,7 @@ class BaseTest(unittest.TestCase): .pubkey_to_address(void_block_rewards_pubkey) ) logging.info( - "Mining %d Litecoin blocks to %s", num_blocks, cls.ltc_addr + f"Mining {num_blocks} Litecoin blocks to {cls.ltc_addr}" ) callnoderpc( 0, diff --git a/tests/basicswap/util.py b/tests/basicswap/util.py index ee29187..045d208 100644 --- a/tests/basicswap/util.py +++ b/tests/basicswap/util.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (c) 2022-2024 tecnovert @@ -7,9 +6,15 @@ # file LICENSE.txt or http://www.opensource.org/licenses/mit-license.php. import json +import logging +import os import urllib from urllib.request import urlopen + +PORT_OFS = int(os.getenv("PORT_OFS", 1)) +UI_PORT = 12700 + PORT_OFS + REQUIRED_SETTINGS = { "blocks_confirmed": 1, "conf_target": 1, @@ -67,5 +72,17 @@ def waitForServer(delay_event, port, wait_for=40): _ = read_json_api(port) return except Exception as e: - print("waitForServer, error:", str(e)) + logging.error(f"waitForServer: {e}") raise ValueError("waitForServer failed") + + +def wait_for_offers(delay_event, node_id, num_offers, offer_id=None) -> None: + logging.info(f"Waiting for {num_offers} offers on node {node_id}") + for i in range(20): + delay_event.wait(1) + offers = read_json_api( + UI_PORT + node_id, "offers" if offer_id is None else f"offers/{offer_id}" + ) + if len(offers) >= num_offers: + return + raise ValueError("wait_for_offers failed")