Changeset View
Changeset View
Standalone View
Standalone View
test/functional/rpc_deriveaddresses.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2018 The Bitcoin Core developers | # Copyright (c) 2018 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
"""Test the deriveaddresses rpc call.""" | """Test the deriveaddresses rpc call.""" | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.descriptors import descsum_create | |||||
from test_framework.util import assert_equal, assert_raises_rpc_error | from test_framework.util import assert_equal, assert_raises_rpc_error | ||||
class DeriveaddressesTest(BitcoinTestFramework): | class DeriveaddressesTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
self.supports_cli = 1 | self.supports_cli = 1 | ||||
def run_test(self): | def run_test(self): | ||||
assert_raises_rpc_error(-5, "Invalid descriptor", | assert_raises_rpc_error(-5, "Invalid descriptor", | ||||
self.nodes[0].deriveaddresses, "a") | self.nodes[0].deriveaddresses, "a") | ||||
descriptor = "pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)" | descriptor = "pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)#rdfjd0a9" | ||||
address = "bchreg:qzgrvmwc8vevauc25j86hgfpduz8j98yvvyr0qx0ew" | address = "bchreg:qzgrvmwc8vevauc25j86hgfpduz8j98yvvyr0qx0ew" | ||||
assert_equal(self.nodes[0].deriveaddresses(descriptor), [address]) | assert_equal(self.nodes[0].deriveaddresses(descriptor), [address]) | ||||
descriptor_pubkey = "pkh(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/0)" | descriptor = descriptor[:-9] | ||||
address = "bchreg:qzgrvmwc8vevauc25j86hgfpduz8j98yvvyr0qx0ew" | assert_raises_rpc_error(-5, | ||||
"Invalid descriptor", | |||||
self.nodes[0].deriveaddresses, | |||||
descriptor) | |||||
descriptor_pubkey = "pkh(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/0)#7st8eans" | |||||
address = "bchreg:qzgrvmwc8vevauc25j86hgfpduz8j98yvvyr0qx0ew" | |||||
assert_equal(self.nodes[0].deriveaddresses( | assert_equal(self.nodes[0].deriveaddresses( | ||||
descriptor_pubkey), [address]) | descriptor_pubkey), [address]) | ||||
ranged_descriptor = "pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)" | ranged_descriptor = "pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)#77vpsvm5" | ||||
assert_equal( | assert_equal( | ||||
self.nodes[0].deriveaddresses(ranged_descriptor, 0, 2), | self.nodes[0].deriveaddresses(ranged_descriptor, 0, 2), | ||||
[address, "bchreg:qz7mjsvr6gglnl389gnfxmqx0asxp0hcvqjx829c6k", "bchreg:qq9q9wefpjzuna7qhuzz7rvck9tuhrzp3gvrzd8kx2"]) | [address, "bchreg:qz7mjsvr6gglnl389gnfxmqx0asxp0hcvqjx829c6k", "bchreg:qq9q9wefpjzuna7qhuzz7rvck9tuhrzp3gvrzd8kx2"]) | ||||
assert_raises_rpc_error( | assert_raises_rpc_error( | ||||
-8, | -8, | ||||
"Range should not be specified for an un-ranged descriptor", | "Range should not be specified for an un-ranged descriptor", | ||||
self.nodes[0].deriveaddresses, | self.nodes[0].deriveaddresses, | ||||
"pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)", | descsum_create( | ||||
"pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)"), | |||||
0, | 0, | ||||
2) | 2) | ||||
assert_raises_rpc_error( | assert_raises_rpc_error( | ||||
-8, | -8, | ||||
"Range must be specified for a ranged descriptor", | "Range must be specified for a ranged descriptor", | ||||
self.nodes[0].deriveaddresses, | self.nodes[0].deriveaddresses, | ||||
"pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)") | descsum_create("pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)")) | ||||
assert_raises_rpc_error( | assert_raises_rpc_error( | ||||
-8, | -8, | ||||
"Missing range end parameter", | "Missing range end parameter", | ||||
self.nodes[0].deriveaddresses, | self.nodes[0].deriveaddresses, | ||||
"pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)", | descsum_create( | ||||
"pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)"), | |||||
0) | 0) | ||||
assert_raises_rpc_error( | assert_raises_rpc_error( | ||||
-8, | -8, | ||||
"Range end should be equal to or greater than begin", | "Range end should be equal to or greater than begin", | ||||
self.nodes[0].deriveaddresses, | self.nodes[0].deriveaddresses, | ||||
"pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)", | descsum_create( | ||||
"pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)"), | |||||
2, | 2, | ||||
0) | 0) | ||||
assert_raises_rpc_error( | assert_raises_rpc_error( | ||||
-8, | -8, | ||||
"Range should be greater or equal than 0", | "Range should be greater or equal than 0", | ||||
self.nodes[0].deriveaddresses, | self.nodes[0].deriveaddresses, | ||||
"pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)", | descsum_create( | ||||
"pkh(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)"), | |||||
-1, | -1, | ||||
0) | 0) | ||||
combo_descriptor = "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)" | combo_descriptor = descsum_create( | ||||
"combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)") | |||||
assert_equal(self.nodes[0].deriveaddresses( | assert_equal(self.nodes[0].deriveaddresses( | ||||
combo_descriptor), [address, address]) | combo_descriptor), [address, address]) | ||||
hardened_without_privkey_descriptor = "pkh(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1'/1/0)" | hardened_without_privkey_descriptor = descsum_create( | ||||
"pkh(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1'/1/0)") | |||||
assert_raises_rpc_error(-5, | assert_raises_rpc_error(-5, | ||||
"Cannot derive script without private keys", | "Cannot derive script without private keys", | ||||
self.nodes[0].deriveaddresses, | self.nodes[0].deriveaddresses, | ||||
hardened_without_privkey_descriptor) | hardened_without_privkey_descriptor) | ||||
bare_multisig_descriptor = "multi(1, tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/0, tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/1)" | bare_multisig_descriptor = descsum_create( | ||||
"multi(1, tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/0, tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/1)") | |||||
assert_raises_rpc_error(-5, | assert_raises_rpc_error(-5, | ||||
"Descriptor does not have a corresponding address", | "Descriptor does not have a corresponding address", | ||||
self.nodes[0].deriveaddresses, | self.nodes[0].deriveaddresses, | ||||
bare_multisig_descriptor) | bare_multisig_descriptor) | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
DeriveaddressesTest().main() | DeriveaddressesTest().main() |