|
11 | 11 | from test_framework.util import ( |
12 | 12 | assert_equal, |
13 | 13 | connect_nodes_bi, |
| 14 | + assert_raises_rpc_error |
14 | 15 | ) |
15 | 16 |
|
16 | 17 |
|
@@ -120,5 +121,39 @@ def run_test(self): |
120 | 121 |
|
121 | 122 | assert_equal(keypath[0:7], "m/0'/1'") |
122 | 123 |
|
| 124 | + # Generate a new HD seed on node 1 and make sure it is set |
| 125 | + orig_masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] |
| 126 | + self.nodes[1].sethdseed() |
| 127 | + new_masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] |
| 128 | + assert orig_masterkeyid != new_masterkeyid |
| 129 | + addr = self.nodes[1].getnewaddress() |
| 130 | + assert_equal(self.nodes[1].getaddressinfo(addr)['hdkeypath'], 'm/0\'/0\'/0\'') # Make sure the new address is the first from the keypool |
| 131 | + self.nodes[1].keypoolrefill(1) # Fill keypool with 1 key |
| 132 | + |
| 133 | + # Set a new HD seed on node 1 without flushing the keypool |
| 134 | + new_seed = self.nodes[0].dumpprivkey(self.nodes[0].getnewaddress()) |
| 135 | + orig_masterkeyid = new_masterkeyid |
| 136 | + self.nodes[1].sethdseed(False, new_seed) |
| 137 | + new_masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] |
| 138 | + assert orig_masterkeyid != new_masterkeyid |
| 139 | + addr = self.nodes[1].getnewaddress() |
| 140 | + assert_equal(orig_masterkeyid, self.nodes[1].getaddressinfo(addr)['hdmasterkeyid']) |
| 141 | + assert_equal(self.nodes[1].getaddressinfo(addr)['hdkeypath'], 'm/0\'/0\'/1\'') # Make sure the new address continues previous keypool |
| 142 | + |
| 143 | + # Check that the next address is from the new seed |
| 144 | + self.nodes[1].keypoolrefill(1) |
| 145 | + next_addr = self.nodes[1].getnewaddress() |
| 146 | + assert_equal(new_masterkeyid, self.nodes[1].getaddressinfo(next_addr)['hdmasterkeyid']) |
| 147 | + assert_equal(self.nodes[1].getaddressinfo(next_addr)['hdkeypath'], 'm/0\'/0\'/0\'') # Make sure the new address is not from previous keypool |
| 148 | + assert next_addr != addr |
| 149 | + |
| 150 | + # Sethdseed parameter validity |
| 151 | + assert_raises_rpc_error(-1, 'sethdseed', self.nodes[0].sethdseed, False, new_seed, 0) |
| 152 | + assert_raises_rpc_error(-5, "Invalid private key", self.nodes[1].sethdseed, False, "not_wif") |
| 153 | + assert_raises_rpc_error(-1, "JSON value is not a boolean as expected", self.nodes[1].sethdseed, "Not_bool") |
| 154 | + assert_raises_rpc_error(-1, "JSON value is not a string as expected", self.nodes[1].sethdseed, False, True) |
| 155 | + assert_raises_rpc_error(-5, "Already have this key", self.nodes[1].sethdseed, False, new_seed) |
| 156 | + assert_raises_rpc_error(-5, "Already have this key", self.nodes[1].sethdseed, False, self.nodes[1].dumpprivkey(self.nodes[1].getnewaddress())) |
| 157 | + |
123 | 158 | if __name__ == '__main__': |
124 | 159 | WalletHDTest().main () |
0 commit comments