diff --git a/basicswap/basicswap.py b/basicswap/basicswap.py index 39b3b35..8a5e1d4 100644 --- a/basicswap/basicswap.py +++ b/basicswap/basicswap.py @@ -391,7 +391,7 @@ class BasicSwap(BaseApp): Coins.PART_BLIND, Coins.BCH, ) - self.coins_without_segwit = (Coins.PIVX, Coins.DASH, Coins.NMC) + self.coins_without_segwit = (Coins.PIVX, Coins.DASH) # TODO: Adjust ranges self.min_delay_event = self.get_int_setting("min_delay_event", 10, 0, 20 * 60) diff --git a/basicswap/bin/prepare.py b/basicswap/bin/prepare.py index 5b6ab47..98a4e18 100755 --- a/basicswap/bin/prepare.py +++ b/basicswap/bin/prepare.py @@ -1400,6 +1400,7 @@ def prepareDataDir(coin, settings, chain, particl_mnemonic, extra_opts={}): ) ) elif coin == "namecoin": + fp.write("deprecatedrpc=create_bdb\n") fp.write("prune=2000\n") elif coin == "pivx": params_dir = os.path.join(data_dir, "pivx-params") @@ -1910,7 +1911,7 @@ def initialise_wallets( f'Creating wallet "{wallet_name}" for {getCoinName(c)}.' ) - if c in (Coins.BTC, Coins.LTC, Coins.DOGE, Coins.DASH): + if c in (Coins.BTC, Coins.LTC, Coins.NMC, Coins.DOGE, Coins.DASH): # wallet_name, disable_private_keys, blank, passphrase, avoid_reuse, descriptors use_descriptors = coin_settings.get("use_descriptors", False) diff --git a/basicswap/config.py b/basicswap/config.py index 9c8d06d..cc010a0 100644 --- a/basicswap/config.py +++ b/basicswap/config.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2019-2024 The Basicswap developers +# Copyright (c) 2019-2025 The Basicswap developers # Distributed under the MIT software license, see the accompanying # file LICENSE or http://www.opensource.org/licenses/mit-license.php. @@ -40,13 +40,6 @@ DOGECOIND = os.getenv("DOGECOIND", "dogecoind" + bin_suffix) DOGECOIN_CLI = os.getenv("DOGECOIN_CLI", "dogecoin-cli" + bin_suffix) DOGECOIN_TX = os.getenv("DOGECOIN_TX", "dogecoin-tx" + bin_suffix) -NAMECOIN_BINDIR = os.path.expanduser( - os.getenv("NAMECOIN_BINDIR", os.path.join(DEFAULT_TEST_BINDIR, "namecoin")) -) -NAMECOIND = os.getenv("NAMECOIND", "namecoind" + bin_suffix) -NAMECOIN_CLI = os.getenv("NAMECOIN_CLI", "namecoin-cli" + bin_suffix) -NAMECOIN_TX = os.getenv("NAMECOIN_TX", "namecoin-tx" + bin_suffix) - XMR_BINDIR = os.path.expanduser( os.getenv("XMR_BINDIR", os.path.join(DEFAULT_TEST_BINDIR, "monero")) ) diff --git a/basicswap/pgp/keys/namecoin_JeremyRand.pgp b/basicswap/pgp/keys/namecoin_JeremyRand.pgp deleted file mode 100644 index 0e0ce2a..0000000 --- a/basicswap/pgp/keys/namecoin_JeremyRand.pgp +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -mDMEXPNfCBYJKwYBBAHaRw8BAQdAWGFiEJYnlV2TDTesLIO/eoQ3IPduzcG97GpA -6K+Gj+K0K0BKZXJlbXlSYW5kIG9uIEdpdEh1YiA8amVyZW15QG5hbWVjb2luLm9y -Zz6IlgQTFggAPhYhBJza8EpykDv+wJWdvi2+M54p9ilMBQJc88q7AhsDBQkB4TOA -BQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEC2+M54p9ilMMUoA/1oZn8AtwQ7D -wXgNKq++zqHaiEcHGgsyFeDRbQARsYRVAQDxa36p181id1YuMjeV1KhC5vaDS4nY -GB4FHPsQ4bbqDLRESmVyZW15IFJhbmQgKE5hbWVjb2luIENvcmUgR2l0aWFuIFNp -Z25pbmcgS2V5KSA8amVyZW15QG5hbWVjb2luLm9yZz6ImQQTFggAQQIbAwUJAeEz -gAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBJza8EpykDv+wJWdvi2+M54p9ilM -BQJc9WDrAhkBAAoJEC2+M54p9ilMz3IA/3mCKeFYcEJFlwP43mdIMGOV2zt/R4Fn -z/rBJpv5hFoHAQDXAY8+mbY/9N+5Rn8Iy51tXEaTq3khdruuFFdty+bXAg== -=EpnJ ------END PGP PUBLIC KEY BLOCK----- diff --git a/basicswap/pgp/keys/namecoin_RoseTuring.pgp b/basicswap/pgp/keys/namecoin_RoseTuring.pgp new file mode 100644 index 0000000..97c8076 --- /dev/null +++ b/basicswap/pgp/keys/namecoin_RoseTuring.pgp @@ -0,0 +1,52 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=atlH +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/basicswap/extended/test_nmc.py b/tests/basicswap/extended/test_nmc.py index 80c29bf..1bee5a1 100644 --- a/tests/basicswap/extended/test_nmc.py +++ b/tests/basicswap/extended/test_nmc.py @@ -44,6 +44,7 @@ from basicswap.rpc import ( from basicswap.contrib.key import ( ECKey, ) +from basicswap.contrib.rpcauth import generate_salt, password_to_hmac from basicswap.http_server import ( HttpThread, ) @@ -64,6 +65,7 @@ from tests.basicswap.common import ( BASE_ZMQ_PORT, PREFIX_SECRET_KEY_REGTEST, waitForRPC, + make_rpc_func, ) from basicswap.bin.run import startDaemon @@ -73,6 +75,17 @@ logger.level = logging.DEBUG if not len(logger.handlers): logger.addHandler(logging.StreamHandler(sys.stdout)) + +NAMECOIN_BINDIR = os.path.expanduser( + os.getenv("NAMECOIN_BINDIR", os.path.join(cfg.DEFAULT_TEST_BINDIR, "namecoin")) +) +NAMECOIND = os.getenv("NAMECOIND", "namecoind" + cfg.bin_suffix) +NAMECOIN_CLI = os.getenv("NAMECOIN_CLI", "namecoin-cli" + cfg.bin_suffix) +NAMECOIN_TX = os.getenv("NAMECOIN_TX", "namecoin-tx" + cfg.bin_suffix) + +NMC_BASE_PORT = 8136 +NMC_BASE_RPC_PORT= 8146 + NUM_NODES = 3 NMC_NODE = 3 BTC_NODE = 4 @@ -90,8 +103,21 @@ def prepareOtherDir(datadir, nodeId, conf_file="namecoin.conf"): with open(filePath, "w+") as fp: fp.write("regtest=1\n") fp.write("[regtest]\n") - fp.write("port=" + str(BASE_PORT + nodeId) + "\n") - fp.write("rpcport=" + str(BASE_RPC_PORT + nodeId) + "\n") + + if conf_file == "bitcoin.conf": + fp.write("port=" + str(BASE_PORT + nodeId) + "\n") + fp.write("rpcport=" + str(BASE_RPC_PORT + nodeId) + "\n") + else: + fp.write("port=" + str(NMC_BASE_PORT + nodeId) + "\n") + fp.write("rpcport=" + str(NMC_BASE_RPC_PORT + nodeId) + "\n") + salt = generate_salt(16) + fp.write( + "rpcauth={}:{}${}\n".format( + "test" + str(nodeId), + salt, + password_to_hmac(salt, "test_pass" + str(nodeId)), + ) + ) fp.write("daemon=0\n") fp.write("printtoconsole=0\n") @@ -105,9 +131,8 @@ def prepareOtherDir(datadir, nodeId, conf_file="namecoin.conf"): fp.write("fallbackfee=0.01\n") fp.write("acceptnonstdtxn=0\n") - - if conf_file == "bitcoin.conf": - fp.write("wallet=wallet.dat\n") + fp.write("deprecatedrpc=create_bdb\n") + fp.write("wallet=wallet.dat\n") def prepareDir(datadir, nodeId, network_key, network_pubkey): @@ -175,11 +200,11 @@ def prepareDir(datadir, nodeId, network_key, network_pubkey): "namecoin": { "connection_type": "rpc", "manage_daemon": False, - "rpcport": BASE_RPC_PORT + NMC_NODE, + "rpcport": NMC_BASE_RPC_PORT + NMC_NODE, "datadir": nmcdatadir, - "bindir": cfg.NAMECOIN_BINDIR, - "use_csv": False, - # 'use_segwit': True, + "bindir": NAMECOIN_BINDIR, + "use_csv": True, + "use_segwit": True, }, "bitcoin": { "connection_type": "rpc", @@ -221,11 +246,11 @@ def btcRpc(cmd): def nmcRpc(cmd): return callrpc_cli( - cfg.NAMECOIN_BINDIR, + NAMECOIN_BINDIR, os.path.join(cfg.TEST_DATADIRS, str(NMC_NODE)), "regtest", cmd, - cfg.NAMECOIN_CLI, + NAMECOIN_CLI, ) @@ -305,11 +330,15 @@ class Test(unittest.TestCase): cls.daemons.append( startDaemon( os.path.join(cfg.TEST_DATADIRS, str(NMC_NODE)), - cfg.NAMECOIN_BINDIR, - cfg.NAMECOIND, + NAMECOIN_BINDIR, + NAMECOIND, ) ) - logging.info("Started %s %d", cfg.NAMECOIND, cls.daemons[-1].handle.pid) + logging.info("Started %s %d", NAMECOIND, cls.daemons[-1].handle.pid) + nmcRpc2 = make_rpc_func(NMC_NODE, base_rpc_port=NMC_BASE_RPC_PORT) + waitForRPC(nmcRpc2, delay_event, rpc_command="getblockchaininfo") + if len(nmcRpc2("listwallets")) < 1: + nmcRpc2("createwallet", ["wallet.dat", False, False, "", False, False]) for i in range(NUM_NODES): data_dir = os.path.join(cfg.TEST_DATADIRS, str(i)) @@ -378,10 +407,9 @@ class Test(unittest.TestCase): cls.http_threads.append(t) t.start() - waitForRPC(nmcRpc, delay_event) num_blocks = 500 logging.info("Mining %d namecoin blocks", num_blocks) - cls.nmc_addr = nmcRpc("getnewaddress mining_addr legacy") + cls.nmc_addr = nmcRpc("getnewaddress mining_addr bech32") nmcRpc("generatetoaddress {} {}".format(num_blocks, cls.nmc_addr)) ro = nmcRpc("getblockchaininfo") @@ -453,8 +481,7 @@ class Test(unittest.TestCase): 100 * COIN, 0.1 * COIN, 100 * COIN, - SwapTypes.SELLER_FIRST, - TxLockTypes.ABS_LOCK_TIME, + SwapTypes.SELLER_FIRST ) wait_for_offer(delay_event, swap_clients[1], offer_id) @@ -494,8 +521,7 @@ class Test(unittest.TestCase): 10 * COIN, 9.0 * COIN, 10 * COIN, - SwapTypes.SELLER_FIRST, - TxLockTypes.ABS_LOCK_TIME, + SwapTypes.SELLER_FIRST ) wait_for_offer(delay_event, swap_clients[0], offer_id) @@ -534,8 +560,7 @@ class Test(unittest.TestCase): 10 * COIN, 0.1 * COIN, 10 * COIN, - SwapTypes.SELLER_FIRST, - TxLockTypes.ABS_LOCK_TIME, + SwapTypes.SELLER_FIRST ) wait_for_offer(delay_event, swap_clients[1], offer_id) @@ -577,7 +602,7 @@ class Test(unittest.TestCase): 0.1 * COIN, 10 * COIN, SwapTypes.SELLER_FIRST, - TxLockTypes.ABS_LOCK_BLOCKS, + TxLockTypes.SEQUENCE_LOCK_BLOCKS, 10, ) @@ -618,8 +643,7 @@ class Test(unittest.TestCase): 10 * COIN, 10 * COIN, 10 * COIN, - SwapTypes.SELLER_FIRST, - TxLockTypes.ABS_LOCK_TIME, + SwapTypes.SELLER_FIRST ) wait_for_offer(delay_event, swap_clients[0], offer_id) @@ -655,11 +679,10 @@ class Test(unittest.TestCase): offer_id = swap_clients[0].postOffer( Coins.NMC, Coins.BTC, - 0.001 * COIN, + 0.01 * COIN, 1.0 * COIN, - 0.001 * COIN, - SwapTypes.SELLER_FIRST, - TxLockTypes.ABS_LOCK_TIME, + 0.01 * COIN, + SwapTypes.SELLER_FIRST ) wait_for_offer(delay_event, swap_clients[0], offer_id) @@ -669,8 +692,8 @@ class Test(unittest.TestCase): wait_for_bid(delay_event, swap_clients[0], bid_id) swap_clients[0].acceptBid(bid_id) try: - swap_clients[0].getChainClientSettings(Coins.BTC)["override_feerate"] = 10.0 - swap_clients[0].getChainClientSettings(Coins.NMC)["override_feerate"] = 10.0 + swap_clients[0].getChainClientSettings(Coins.BTC)["override_feerate"] = 100.0 + swap_clients[0].getChainClientSettings(Coins.NMC)["override_feerate"] = 100.0 wait_for_bid( delay_event, swap_clients[0], bid_id, BidStates.BID_ERROR, wait_for=60 )