1 #!/usr/bin/env python3
2 # Copyright (c) 2018-2022 The Limenka developers
3 # Distributed under the MIT software license, see the accompanying
4 # file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 """Test the behavior of RPC importprivkey on set and unset labels of
6 addresses.
7 8 It tests different cases in which an address is imported with importaddress
9 with or without a label and then its private key is imported with importprivkey
10 with and without a label.
11 """
12 13 from test_framework.test_framework import LimenkaTestFramework
14 from test_framework.wallet_util import test_address
15 16 17 class ImportWithLabel(LimenkaTestFramework):
18 def add_options(self, parser):
19 self.add_wallet_options(parser, descriptors=False)
20 21 def set_test_params(self):
22 self.num_nodes = 2
23 self.setup_clean_chain = True
24 25 def skip_test_if_missing_module(self):
26 self.skip_if_no_wallet()
27 28 def run_test(self):
29 """Main test logic"""
30 31 self.log.info(
32 "Test importaddress with label and importprivkey without label."
33 )
34 self.log.info("Import a watch-only address with a label.")
35 address = self.nodes[0].getnewaddress()
36 label = "Test Label"
37 self.nodes[1].importaddress(address, label)
38 test_address(self.nodes[1],
39 address,
40 iswatchonly=True,
41 ismine=False,
42 labels=[label])
43 44 self.log.info(
45 "Import the watch-only address's private key without a "
46 "label and the address should keep its label."
47 )
48 priv_key = self.nodes[0].dumpprivkey(address)
49 self.nodes[1].importprivkey(priv_key)
50 test_address(self.nodes[1], address, labels=[label])
51 52 self.log.info(
53 "Test importaddress without label and importprivkey with label."
54 )
55 self.log.info("Import a watch-only address without a label.")
56 address2 = self.nodes[0].getnewaddress()
57 self.nodes[1].importaddress(address2)
58 test_address(self.nodes[1],
59 address2,
60 iswatchonly=True,
61 ismine=False,
62 labels=[""])
63 64 self.log.info(
65 "Import the watch-only address's private key with a "
66 "label and the address should have its label updated."
67 )
68 priv_key2 = self.nodes[0].dumpprivkey(address2)
69 label2 = "Test Label 2"
70 self.nodes[1].importprivkey(priv_key2, label2)
71 72 test_address(self.nodes[1], address2, labels=[label2])
73 74 self.log.info("Test importaddress with label and importprivkey with label.")
75 self.log.info("Import a watch-only address with a label.")
76 address3 = self.nodes[0].getnewaddress()
77 label3_addr = "Test Label 3 for importaddress"
78 self.nodes[1].importaddress(address3, label3_addr)
79 test_address(self.nodes[1],
80 address3,
81 iswatchonly=True,
82 ismine=False,
83 labels=[label3_addr])
84 85 self.log.info(
86 "Import the watch-only address's private key with a "
87 "label and the address should have its label updated."
88 )
89 priv_key3 = self.nodes[0].dumpprivkey(address3)
90 label3_priv = "Test Label 3 for importprivkey"
91 self.nodes[1].importprivkey(priv_key3, label3_priv)
92 93 test_address(self.nodes[1], address3, labels=[label3_priv])
94 95 self.log.info(
96 "Test importprivkey won't label new dests with the same "
97 "label as others labeled dests for the same key."
98 )
99 self.log.info("Import a watch-only p2sh-segwit address with a label.")
100 address4 = self.nodes[0].getnewaddress("", "p2sh-segwit")
101 label4_addr = "Test Label 4 for importaddress"
102 self.nodes[1].importaddress(address4, label4_addr)
103 test_address(self.nodes[1],
104 address4,
105 iswatchonly=True,
106 ismine=False,
107 labels=[label4_addr],
108 embedded=None)
109 110 self.log.info(
111 "Import the watch-only address's private key without a "
112 "label and new destinations for the key should have an "
113 "empty label while the 'old' destination should keep "
114 "its label."
115 )
116 priv_key4 = self.nodes[0].dumpprivkey(address4)
117 self.nodes[1].importprivkey(priv_key4)
118 embedded_addr = self.nodes[1].getaddressinfo(address4)['embedded']['address']
119 120 test_address(self.nodes[1], embedded_addr, labels=[""])
121 122 test_address(self.nodes[1], address4, labels=[label4_addr])
123 124 self.stop_nodes()
125 126 127 if __name__ == "__main__":
128 ImportWithLabel(__file__).main()
129