From d3142077794f4e910d3cdc749020d725e30feb24 Mon Sep 17 00:00:00 2001 From: Ava Chow Date: Thu, 8 May 2025 11:48:38 -0700 Subject: [PATCH] test: Replace usage of importaddress --- test/functional/rpc_psbt.py | 3 +- test/functional/test_framework/test_node.py | 27 ------------------ test/functional/wallet_basic.py | 3 +- test/functional/wallet_importprunedfunds.py | 2 +- test/functional/wallet_labels.py | 13 +++++---- test/functional/wallet_reindex.py | 6 ++-- .../wallet_transactiontime_rescan.py | 28 +++++++++++++------ 7 files changed, 34 insertions(+), 48 deletions(-) diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py index 9d4750a7322..fbbbae91a7c 100755 --- a/test/functional/rpc_psbt.py +++ b/test/functional/rpc_psbt.py @@ -112,7 +112,8 @@ class PSBTTest(BitcoinTestFramework): # Mine a transaction that credits the offline address offline_addr = offline_node.getnewaddress(address_type="bech32m") online_addr = w2.getnewaddress(address_type="bech32m") - wonline.importaddress(offline_addr, label="", rescan=False) + import_res = wonline.importdescriptors([{"desc": offline_node.getaddressinfo(offline_addr)["desc"], "timestamp": "now"}]) + assert_equal(import_res[0]["success"], True) mining_wallet = mining_node.get_wallet_rpc(self.default_wallet_name) mining_wallet.sendtoaddress(address=offline_addr, amount=1.0) self.generate(mining_node, nblocks=1, sync_fun=lambda: self.sync_all([online_node, mining_node])) diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py index 02e3b0c4e30..14d1e5a09ed 100755 --- a/test/functional/test_framework/test_node.py +++ b/test/functional/test_framework/test_node.py @@ -959,30 +959,3 @@ class RPCOverloadWrapper(): import_res = self.importdescriptors(req) if not import_res[0]['success']: raise JSONRPCException(import_res[0]['error']) - - def importaddress(self, address, *, label=None, rescan=None, p2sh=None): - wallet_info = self.getwalletinfo() - if 'descriptors' not in wallet_info or ('descriptors' in wallet_info and not wallet_info['descriptors']): - return self.__getattr__('importaddress')(address, label, rescan, p2sh) - is_hex = False - try: - int(address ,16) - is_hex = True - desc = descsum_create('raw(' + address + ')') - except Exception: - desc = descsum_create('addr(' + address + ')') - reqs = [{ - 'desc': desc, - 'timestamp': 0 if rescan else 'now', - 'label': label if label else '', - }] - if is_hex and p2sh: - reqs.append({ - 'desc': descsum_create('p2sh(raw(' + address + '))'), - 'timestamp': 0 if rescan else 'now', - 'label': label if label else '', - }) - import_res = self.importdescriptors(reqs) - for res in import_res: - if not res['success']: - raise JSONRPCException(res['error']) diff --git a/test/functional/wallet_basic.py b/test/functional/wallet_basic.py index ce5790100b8..fe8b53bcaa7 100755 --- a/test/functional/wallet_basic.py +++ b/test/functional/wallet_basic.py @@ -673,7 +673,8 @@ class WalletTest(BitcoinTestFramework): self.generate(self.wallet, 1, sync_fun=self.no_op) self.nodes[0].createwallet("watch_wallet", disable_private_keys=True) watch_wallet = self.nodes[0].get_wallet_rpc("watch_wallet") - watch_wallet.importaddress(self.wallet.get_address()) + import_res = watch_wallet.importdescriptors([{"desc": self.wallet.get_descriptor(), "timestamp": "now"}]) + assert_equal(import_res[0]["success"], True) # DEFAULT_ANCESTOR_LIMIT transactions off a confirmed tx should be fine chain = self.wallet.create_self_transfer_chain(chain_length=DEFAULT_ANCESTOR_LIMIT) diff --git a/test/functional/wallet_importprunedfunds.py b/test/functional/wallet_importprunedfunds.py index b97735389c7..b7b2589f554 100755 --- a/test/functional/wallet_importprunedfunds.py +++ b/test/functional/wallet_importprunedfunds.py @@ -90,7 +90,7 @@ class ImportPrunedFundsTest(BitcoinTestFramework): # Import with affiliated address with no rescan self.nodes[1].createwallet('wwatch', disable_private_keys=True) wwatch = self.nodes[1].get_wallet_rpc('wwatch') - wwatch.importaddress(address=address2, rescan=False) + wwatch.importdescriptors([{"desc": self.nodes[0].getaddressinfo(address2)["desc"], "timestamp": "now"}]) wwatch.importprunedfunds(rawtransaction=rawtxn2, txoutproof=proof2) assert [tx for tx in wwatch.listtransactions(include_watchonly=True) if tx['txid'] == txnid2] diff --git a/test/functional/wallet_labels.py b/test/functional/wallet_labels.py index 800f3ad7c40..2f580e18d92 100755 --- a/test/functional/wallet_labels.py +++ b/test/functional/wallet_labels.py @@ -12,6 +12,7 @@ RPCs tested are: from collections import defaultdict from test_framework.blocktools import COINBASE_MATURITY +from test_framework.descriptors import descsum_create from test_framework.test_framework import BitcoinTestFramework from test_framework.util import assert_equal, assert_raises_rpc_error from test_framework.wallet_util import test_address @@ -176,17 +177,17 @@ class WalletLabelsTest(BitcoinTestFramework): } for l in BECH32_VALID: ad = BECH32_VALID[l] - wallet_watch_only.importaddress(label=l, rescan=False, address=ad) + import_res = wallet_watch_only.importdescriptors([{"desc": descsum_create(f"addr({ad})"), "timestamp": "now", "label": l}]) + assert_equal(import_res[0]["success"], True) self.generatetoaddress(node, 1, ad) assert_equal(wallet_watch_only.getaddressesbylabel(label=l), {ad: {'purpose': 'receive'}}) assert_equal(wallet_watch_only.getreceivedbylabel(label=l), 0) for l in BECH32_INVALID: ad = BECH32_INVALID[l] - assert_raises_rpc_error( - -5, - "Address is not valid", - lambda: wallet_watch_only.importaddress(label=l, rescan=False, address=ad), - ) + import_res = wallet_watch_only.importdescriptors([{"desc": descsum_create(f"addr({ad})"), "timestamp": "now", "label": l}]) + assert_equal(import_res[0]["success"], False) + assert_equal(import_res[0]["error"]["code"], -5) + assert_equal(import_res[0]["error"]["message"], "Address is not valid") class Label: diff --git a/test/functional/wallet_reindex.py b/test/functional/wallet_reindex.py index 32e717d1a9e..71ab69e01bf 100755 --- a/test/functional/wallet_reindex.py +++ b/test/functional/wallet_reindex.py @@ -46,10 +46,8 @@ class WalletReindexTest(BitcoinTestFramework): # Blank wallets don't have a birth time assert 'birthtime' not in wallet_watch_only.getwalletinfo() - # For a descriptors wallet: Import address with timestamp=now. - # For legacy wallet: There is no way of importing a script/address with a custom time. The wallet always imports it with birthtime=1. - # In both cases, disable rescan to not detect the transaction. - wallet_watch_only.importaddress(wallet_addr, rescan=False) + # Import address with timestamp=now. + wallet_watch_only.importdescriptors([{"desc": miner_wallet.getaddressinfo(wallet_addr)["desc"], "timestamp": "now"}]) assert_equal(len(wallet_watch_only.listtransactions()), 0) # Depending on the wallet type, the birth time changes. diff --git a/test/functional/wallet_transactiontime_rescan.py b/test/functional/wallet_transactiontime_rescan.py index a40048fa81b..834e6d07686 100755 --- a/test/functional/wallet_transactiontime_rescan.py +++ b/test/functional/wallet_transactiontime_rescan.py @@ -50,15 +50,23 @@ class TransactionTimeRescanTest(BitcoinTestFramework): # prepare the user wallet with 3 watch only addresses wo1 = usernode.getnewaddress() + wo1_desc = usernode.getaddressinfo(wo1)["desc"] wo2 = usernode.getnewaddress() + wo2_desc = usernode.getaddressinfo(wo2)["desc"] wo3 = usernode.getnewaddress() + wo3_desc = usernode.getaddressinfo(wo3)["desc"] usernode.createwallet(wallet_name='wo', disable_private_keys=True) wo_wallet = usernode.get_wallet_rpc('wo') - wo_wallet.importaddress(wo1) - wo_wallet.importaddress(wo2) - wo_wallet.importaddress(wo3) + import_res = wo_wallet.importdescriptors( + [ + {"desc": wo1_desc, "timestamp": "now"}, + {"desc": wo2_desc, "timestamp": "now"}, + {"desc": wo3_desc, "timestamp": "now"}, + ] + ) + assert_equal(all([r["success"] for r in import_res]), True) self.log.info('Start transactions') @@ -124,16 +132,20 @@ class TransactionTimeRescanTest(BitcoinTestFramework): restorenode.createwallet(wallet_name='wo', disable_private_keys=True) restorewo_wallet = restorenode.get_wallet_rpc('wo') - # for descriptor wallets, the test framework maps the importaddress RPC to the - # importdescriptors RPC (with argument 'timestamp'='now'), which always rescans + # importdescriptors with "timestamp": "now" always rescans # blocks of the past 2 hours, based on the current MTP timestamp; in order to avoid # importing the last address (wo3), we advance the time further and generate 10 blocks set_node_times(self.nodes, cur_time + ten_days + ten_days + ten_days + ten_days) self.generatetoaddress(minernode, 10, m1) - restorewo_wallet.importaddress(wo1, rescan=False) - restorewo_wallet.importaddress(wo2, rescan=False) - restorewo_wallet.importaddress(wo3, rescan=False) + import_res = restorewo_wallet.importdescriptors( + [ + {"desc": wo1_desc, "timestamp": "now"}, + {"desc": wo2_desc, "timestamp": "now"}, + {"desc": wo3_desc, "timestamp": "now"}, + ] + ) + assert_equal(all([r["success"] for r in import_res]), True) # check user has 0 balance and no transactions assert_equal(restorewo_wallet.getbalance(), 0)