Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_importmulti.py
Show First 20 Lines • Show All 574 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
}] | }] | ||||
) | ) | ||||
assert result[0]['success'] | assert result[0]['success'] | ||||
pub_import_info = self.nodes[0].getaddressinfo(pub_addr) | pub_import_info = self.nodes[0].getaddressinfo(pub_addr) | ||||
assert_equal(pub_import_info['pubkey'], pub) | assert_equal(pub_import_info['pubkey'], pub) | ||||
assert 'hdmasterfingerprint' not in pub_import_info | assert 'hdmasterfingerprint' not in pub_import_info | ||||
assert 'hdkeypath' not in pub_import_info | assert 'hdkeypath' not in pub_import_info | ||||
# Import some public keys to the keypool of a no privkey wallet | |||||
self.log.info("Adding pubkey to keypool of disableprivkey wallet") | |||||
self.nodes[1].createwallet( | |||||
wallet_name="noprivkeys", | |||||
disable_private_keys=True) | |||||
wrpc = self.nodes[1].get_wallet_rpc("noprivkeys") | |||||
addr1 = self.nodes[0].getnewaddress() | |||||
addr2 = self.nodes[0].getnewaddress() | |||||
pub1 = self.nodes[0].getaddressinfo(addr1)['pubkey'] | |||||
pub2 = self.nodes[0].getaddressinfo(addr2)['pubkey'] | |||||
result = wrpc.importmulti( | |||||
[{ | |||||
'desc': 'pkh(' + pub1 + ')', | |||||
'keypool': True, | |||||
"timestamp": "now", | |||||
}, | |||||
{ | |||||
'desc': 'pkh(' + pub2 + ')', | |||||
'keypool': True, | |||||
"timestamp": "now", | |||||
}] | |||||
) | |||||
assert result[0]['success'] | |||||
assert result[1]['success'] | |||||
assert_equal(wrpc.getwalletinfo()["keypoolsize"], 2) | |||||
newaddr1 = wrpc.getnewaddress() | |||||
assert_equal(addr1, newaddr1) | |||||
newaddr2 = wrpc.getnewaddress() | |||||
assert_equal(addr2, newaddr2) | |||||
# Import some public keys to the internal keypool of a no privkey | |||||
# wallet | |||||
self.log.info( | |||||
"Adding pubkey to internal keypool of disableprivkey wallet") | |||||
addr1 = self.nodes[0].getnewaddress() | |||||
addr2 = self.nodes[0].getnewaddress() | |||||
pub1 = self.nodes[0].getaddressinfo(addr1)['pubkey'] | |||||
pub2 = self.nodes[0].getaddressinfo(addr2)['pubkey'] | |||||
result = wrpc.importmulti( | |||||
[{ | |||||
'desc': 'pkh(' + pub1 + ')', | |||||
'keypool': True, | |||||
'internal': True, | |||||
"timestamp": "now", | |||||
}, | |||||
{ | |||||
'desc': 'pkh(' + pub2 + ')', | |||||
'keypool': True, | |||||
'internal': True, | |||||
"timestamp": "now", | |||||
}] | |||||
) | |||||
assert result[0]['success'] | |||||
assert result[1]['success'] | |||||
assert_equal(wrpc.getwalletinfo()["keypoolsize_hd_internal"], 2) | |||||
newaddr1 = wrpc.getrawchangeaddress() | |||||
assert_equal(addr1, newaddr1) | |||||
newaddr2 = wrpc.getrawchangeaddress() | |||||
assert_equal(addr2, newaddr2) | |||||
# Import a multisig and make sure the keys don't go into the keypool | |||||
self.log.info( | |||||
'Imported scripts with pubkeys shoud not have their pubkeys go into the keypool') | |||||
addr1 = self.nodes[0].getnewaddress() | |||||
addr2 = self.nodes[0].getnewaddress() | |||||
pub1 = self.nodes[0].getaddressinfo(addr1)['pubkey'] | |||||
pub2 = self.nodes[0].getaddressinfo(addr2)['pubkey'] | |||||
result = wrpc.importmulti( | |||||
[{ | |||||
'desc': 'sh(multi(2,' + pub1 + ',' + pub2 + '))', | |||||
'keypool': True, | |||||
"timestamp": "now", | |||||
}] | |||||
) | |||||
assert result[0]['success'] | |||||
assert_equal(wrpc.getwalletinfo()["keypoolsize"], 0) | |||||
# Cannot import those pubkeys to keypool of wallet with privkeys | |||||
self.log.info( | |||||
"Pubkeys cannot be added to the keypool of a wallet with private keys") | |||||
wrpc = self.nodes[1].get_wallet_rpc("") | |||||
assert wrpc.getwalletinfo()['private_keys_enabled'] | |||||
result = wrpc.importmulti( | |||||
[{ | |||||
'desc': 'pkh(' + pub1 + ')', | |||||
'keypool': True, | |||||
"timestamp": "now", | |||||
}] | |||||
) | |||||
assert_equal(result[0]['error']['code'], -8) | |||||
assert_equal( | |||||
result[0]['error']['message'], | |||||
"Keys can only be imported to the keypool when private keys are disabled") | |||||
# Make sure ranged imports import keys in order | |||||
self.log.info('Key ranges should be imported in order') | |||||
wrpc = self.nodes[1].get_wallet_rpc("noprivkeys") | |||||
assert_equal(wrpc.getwalletinfo()["keypoolsize"], 0) | |||||
assert_equal(wrpc.getwalletinfo()["private_keys_enabled"], False) | |||||
xpub = "tpubDAXcJ7s7ZwicqjprRaEWdPoHKrCS215qxGYxpusRLLmJuT69ZSicuGdSfyvyKpvUNYBW1s2U3NSrT6vrCYB9e6nZUEvrqnwXPF8ArTCRXMY" | |||||
addresses = [ | |||||
'bchreg:qp0v86h53rc92hjrlpwzpjtdlgzsxu25svryj39hul', # m/0'/0'/0 | |||||
'bchreg:qqasy0zlkdleqt4pkn8fs4ehm5gnnz6qpgzxm0035q', # m/0'/0'/1 | |||||
'bchreg:qp0sp4wlhctvprqvdt2dgvqcfdjssu04xgk64mmwew', # m/0'/0'/2 | |||||
'bchreg:qrhn24tegn04cptfv4ldhtkduxq55zcwryhvnfcm3r', # m/0'/0'/3 | |||||
'bchreg:qzpqhett2uwltq803vrxv7zkqhft5vsnmca8ds9jjp', # m/0'/0'/4 | |||||
] | |||||
result = wrpc.importmulti( | |||||
[{ | |||||
'desc': 'pkh([80002067/0h/0h]' + xpub + '/*)', | |||||
'keypool': True, | |||||
'timestamp': 'now', | |||||
'range': {'start': 0, 'end': 4} | |||||
}] | |||||
) | |||||
self.log.info(result) | |||||
for i in range(0, 5): | |||||
addr = wrpc.getnewaddress('') | |||||
assert_equal(addr, addresses[i]) | |||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
ImportMultiTest().main() | ImportMultiTest().main() |