Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_import_with_label.py
Show All 15 Lines | from test_framework.script import ( | ||||
OP_CHECKSIG, | OP_CHECKSIG, | ||||
OP_DUP, | OP_DUP, | ||||
OP_EQUALVERIFY, | OP_EQUALVERIFY, | ||||
OP_HASH160, | OP_HASH160, | ||||
hash160, | hash160, | ||||
) | ) | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import ( | from test_framework.util import hex_str_to_bytes | ||||
assert_equal, | from test_framework.wallet_util import test_address | ||||
hex_str_to_bytes, | |||||
) | |||||
class ImportWithLabel(BitcoinTestFramework): | class ImportWithLabel(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 2 | self.num_nodes = 2 | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
def skip_test_if_missing_module(self): | def skip_test_if_missing_module(self): | ||||
self.skip_if_no_wallet() | self.skip_if_no_wallet() | ||||
def run_test(self): | def run_test(self): | ||||
"""Main test logic""" | """Main test logic""" | ||||
self.log.info( | self.log.info( | ||||
"Test importaddress with label and importprivkey without label." | "Test importaddress with label and importprivkey without label." | ||||
) | ) | ||||
self.log.info("Import a watch-only address with a label.") | self.log.info("Import a watch-only address with a label.") | ||||
address = self.nodes[0].getnewaddress() | address = self.nodes[0].getnewaddress() | ||||
label = "Test Label" | label = "Test Label" | ||||
self.nodes[1].importaddress(address, label) | self.nodes[1].importaddress(address, label) | ||||
address_assert = self.nodes[1].getaddressinfo(address) | test_address(self.nodes[1], | ||||
address, | |||||
assert_equal(address_assert["iswatchonly"], True) | iswatchonly=True, | ||||
assert_equal(address_assert["ismine"], False) | ismine=False, | ||||
assert_equal(address_assert["label"], label) | label=label) | ||||
self.log.info( | self.log.info( | ||||
"Import the watch-only address's private key without a " | "Import the watch-only address's private key without a " | ||||
"label and the address should keep its label." | "label and the address should keep its label." | ||||
) | ) | ||||
priv_key = self.nodes[0].dumpprivkey(address) | priv_key = self.nodes[0].dumpprivkey(address) | ||||
self.nodes[1].importprivkey(priv_key) | self.nodes[1].importprivkey(priv_key) | ||||
assert_equal(label, self.nodes[1].getaddressinfo(address)["label"]) | test_address(self.nodes[1], | ||||
address, | |||||
label=label) | |||||
self.log.info( | self.log.info( | ||||
"Test importaddress without label and importprivkey with label." | "Test importaddress without label and importprivkey with label." | ||||
) | ) | ||||
self.log.info("Import a watch-only address without a label.") | self.log.info("Import a watch-only address without a label.") | ||||
address2 = self.nodes[0].getnewaddress() | address2 = self.nodes[0].getnewaddress() | ||||
self.nodes[1].importaddress(address2) | self.nodes[1].importaddress(address2) | ||||
address_assert2 = self.nodes[1].getaddressinfo(address2) | test_address(self.nodes[1], | ||||
address2, | |||||
assert_equal(address_assert2["iswatchonly"], True) | iswatchonly=True, | ||||
assert_equal(address_assert2["ismine"], False) | ismine=False, | ||||
assert_equal(address_assert2["label"], "") | label="") | ||||
self.log.info( | self.log.info( | ||||
"Import the watch-only address's private key with a " | "Import the watch-only address's private key with a " | ||||
"label and the address should have its label updated." | "label and the address should have its label updated." | ||||
) | ) | ||||
priv_key2 = self.nodes[0].dumpprivkey(address2) | priv_key2 = self.nodes[0].dumpprivkey(address2) | ||||
label2 = "Test Label 2" | label2 = "Test Label 2" | ||||
self.nodes[1].importprivkey(priv_key2, label2) | self.nodes[1].importprivkey(priv_key2, label2) | ||||
assert_equal(label2, self.nodes[1].getaddressinfo(address2)["label"]) | test_address(self.nodes[1], | ||||
address2, | |||||
label=label2) | |||||
self.log.info( | self.log.info( | ||||
"Test importaddress with label and importprivkey with label.") | "Test importaddress with label and importprivkey with label.") | ||||
self.log.info("Import a watch-only address with a label.") | self.log.info("Import a watch-only address with a label.") | ||||
address3 = self.nodes[0].getnewaddress() | address3 = self.nodes[0].getnewaddress() | ||||
label3_addr = "Test Label 3 for importaddress" | label3_addr = "Test Label 3 for importaddress" | ||||
self.nodes[1].importaddress(address3, label3_addr) | self.nodes[1].importaddress(address3, label3_addr) | ||||
address_assert3 = self.nodes[1].getaddressinfo(address3) | test_address(self.nodes[1], | ||||
address3, | |||||
assert_equal(address_assert3["iswatchonly"], True) | iswatchonly=True, | ||||
assert_equal(address_assert3["ismine"], False) | ismine=False, | ||||
assert_equal(address_assert3["label"], label3_addr) | label=label3_addr) | ||||
self.log.info( | self.log.info( | ||||
"Import the watch-only address's private key with a " | "Import the watch-only address's private key with a " | ||||
"label and the address should have its label updated." | "label and the address should have its label updated." | ||||
) | ) | ||||
priv_key3 = self.nodes[0].dumpprivkey(address3) | priv_key3 = self.nodes[0].dumpprivkey(address3) | ||||
label3_priv = "Test Label 3 for importprivkey" | label3_priv = "Test Label 3 for importprivkey" | ||||
self.nodes[1].importprivkey(priv_key3, label3_priv) | self.nodes[1].importprivkey(priv_key3, label3_priv) | ||||
assert_equal( | test_address(self.nodes[1], | ||||
label3_priv, | address3, | ||||
self.nodes[1].getaddressinfo(address3)["label"]) | label=label3_priv) | ||||
self.log.info( | self.log.info( | ||||
"Test importprivkey won't label new dests with the same " | "Test importprivkey won't label new dests with the same " | ||||
"label as others labeled dests for the same key." | "label as others labeled dests for the same key." | ||||
) | ) | ||||
self.log.info("Import a watch-only legacy address with a label.") | self.log.info("Import a watch-only legacy address with a label.") | ||||
address4 = self.nodes[0].getnewaddress() | address4 = self.nodes[0].getnewaddress() | ||||
label4_addr = "Test Label 4 for importaddress" | label4_addr = "Test Label 4 for importaddress" | ||||
self.nodes[1].importaddress(address4, label4_addr) | self.nodes[1].importaddress(address4, label4_addr) | ||||
address_assert4 = self.nodes[1].getaddressinfo(address4) | test_address(self.nodes[1], | ||||
address4, | |||||
assert_equal(address_assert4["iswatchonly"], True) | iswatchonly=True, | ||||
assert_equal(address_assert4["ismine"], False) | ismine=False, | ||||
assert_equal(address_assert4["label"], label4_addr) | label=label4_addr, | ||||
embedded=None) | |||||
self.log.info("Asserts address has no embedded field with dests.") | |||||
assert_equal(address_assert4.get("embedded"), None) | |||||
self.log.info( | self.log.info( | ||||
"Import the watch-only address's private key without a " | "Import the watch-only address's private key without a " | ||||
"label and new destinations for the key should have an " | "label and new destinations for the key should have an " | ||||
"empty label while the 'old' destination should keep " | "empty label while the 'old' destination should keep " | ||||
"its label." | "its label." | ||||
) | ) | ||||
# Build a P2SH manually for this test. | # Build a P2SH manually for this test. | ||||
priv_key4 = self.nodes[0].dumpprivkey(address4) | priv_key4 = self.nodes[0].dumpprivkey(address4) | ||||
pubkey4 = self.nodes[0].getaddressinfo(address4)['pubkey'] | pubkey4 = self.nodes[0].getaddressinfo(address4)['pubkey'] | ||||
pkh4 = hash160(hex_str_to_bytes(pubkey4)) | pkh4 = hash160(hex_str_to_bytes(pubkey4)) | ||||
script4 = CScript( | script4 = CScript( | ||||
[OP_DUP, OP_HASH160, pkh4, OP_EQUALVERIFY, OP_CHECKSIG]) | [OP_DUP, OP_HASH160, pkh4, OP_EQUALVERIFY, OP_CHECKSIG]) | ||||
p2shaddr4 = script_to_p2sh(script4) | p2shaddr4 = script_to_p2sh(script4) | ||||
self.nodes[1].importmulti([{ | self.nodes[1].importmulti([{ | ||||
"scriptPubKey": {"address": p2shaddr4}, | "scriptPubKey": {"address": p2shaddr4}, | ||||
"timestamp": "now", | "timestamp": "now", | ||||
"redeemscript": script4.hex(), | "redeemscript": script4.hex(), | ||||
"keys": [priv_key4], | "keys": [priv_key4], | ||||
}]) | }]) | ||||
p2shaddrinfo = self.nodes[1].getaddressinfo(p2shaddr4) | test_address(self.nodes[1], | ||||
p2shaddr4, | |||||
assert p2shaddrinfo.get("embedded") | label="") | ||||
embedded_addrinfo = self.nodes[1].getaddressinfo( | embedded_addr = self.nodes[1].getaddressinfo( | ||||
p2shaddrinfo["embedded"]["address"] | p2shaddr4)['embedded']['address'] | ||||
) | test_address(self.nodes[1], | ||||
embedded_addr, | |||||
assert_equal(p2shaddrinfo["label"], "") | label=label4_addr) | ||||
assert_equal(embedded_addrinfo["label"], label4_addr) | |||||
self.stop_nodes() | self.stop_nodes() | ||||
if __name__ == "__main__": | if __name__ == "__main__": | ||||
ImportWithLabel().main() | ImportWithLabel().main() |