Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_labels.py
Show All 25 Lines | class WalletLabelsTest(BitcoinTestFramework): | ||||
def run_test(self): | def run_test(self): | ||||
# Check that there's no UTXO on the node | # Check that there's no UTXO on the node | ||||
node = self.nodes[0] | node = self.nodes[0] | ||||
assert_equal(len(node.listunspent()), 0) | assert_equal(len(node.listunspent()), 0) | ||||
# Note each time we call generate, all generated coins go into | # Note each time we call generate, all generated coins go into | ||||
# the same address, so we call twice to get two addresses w/50 each | # the same address, so we call twice to get two addresses w/50 each | ||||
self.generatetoaddress(node, | self.generatetoaddress( | ||||
nblocks=1, address=node.getnewaddress( | node, nblocks=1, address=node.getnewaddress(label="coinbase") | ||||
label='coinbase')) | ) | ||||
self.generatetoaddress(node, | self.generatetoaddress( | ||||
nblocks=101, | node, nblocks=101, address=node.getnewaddress(label="coinbase") | ||||
address=node.getnewaddress( | ) | ||||
label='coinbase')) | |||||
assert_equal(node.getbalance(), 100000000) | assert_equal(node.getbalance(), 100000000) | ||||
# there should be 2 address groups | # there should be 2 address groups | ||||
# each with 1 address with a balance of 50 Bitcoins | # each with 1 address with a balance of 50 Bitcoins | ||||
address_groups = node.listaddressgroupings() | address_groups = node.listaddressgroupings() | ||||
assert_equal(len(address_groups), 2) | assert_equal(len(address_groups), 2) | ||||
# the addresses aren't linked now, but will be after we send to the | # the addresses aren't linked now, but will be after we send to the | ||||
# common address | # common address | ||||
linked_addresses = set() | linked_addresses = set() | ||||
for address_group in address_groups: | for address_group in address_groups: | ||||
assert_equal(len(address_group), 1) | assert_equal(len(address_group), 1) | ||||
assert_equal(len(address_group[0]), 3) | assert_equal(len(address_group[0]), 3) | ||||
assert_equal(address_group[0][1], 50000000) | assert_equal(address_group[0][1], 50000000) | ||||
assert_equal(address_group[0][2], 'coinbase') | assert_equal(address_group[0][2], "coinbase") | ||||
linked_addresses.add(address_group[0][0]) | linked_addresses.add(address_group[0][0]) | ||||
# send 50 from each address to a third address not in this wallet | # send 50 from each address to a third address not in this wallet | ||||
common_address = "msf4WtN1YQKXvNtvdFYt9JBnUD2FB41kjr" | common_address = "msf4WtN1YQKXvNtvdFYt9JBnUD2FB41kjr" | ||||
node.sendmany( | node.sendmany( | ||||
amounts={common_address: 100000000}, | amounts={common_address: 100000000}, | ||||
subtractfeefrom=[common_address], | subtractfeefrom=[common_address], | ||||
minconf=1, | minconf=1, | ||||
Show All 10 Lines | def run_test(self): | ||||
# we want to reset so that the "" label has what's expected. | # we want to reset so that the "" label has what's expected. | ||||
# otherwise we're off by exactly the fee amount as that's mined | # otherwise we're off by exactly the fee amount as that's mined | ||||
# and matures in the next 100 blocks | # and matures in the next 100 blocks | ||||
amount_to_send = 1000000 | amount_to_send = 1000000 | ||||
# Create labels and make sure subsequent label API calls | # Create labels and make sure subsequent label API calls | ||||
# recognize the label/address associations. | # recognize the label/address associations. | ||||
labels = [Label(name) | labels = [Label(name) for name in ("a", "b", "c", "d", "e")] | ||||
for name in ("a", "b", "c", "d", "e")] | |||||
for label in labels: | for label in labels: | ||||
address = node.getnewaddress(label.name) | address = node.getnewaddress(label.name) | ||||
label.add_receive_address(address) | label.add_receive_address(address) | ||||
label.verify(node) | label.verify(node) | ||||
# Check all labels are returned by listlabels. | # Check all labels are returned by listlabels. | ||||
assert_equal(node.listlabels(), sorted( | assert_equal( | ||||
['coinbase'] + [label.name for label in labels])) | node.listlabels(), sorted(["coinbase"] + [label.name for label in labels]) | ||||
) | |||||
# Send a transaction to each label. | # Send a transaction to each label. | ||||
for label in labels: | for label in labels: | ||||
node.sendtoaddress(label.addresses[0], amount_to_send) | node.sendtoaddress(label.addresses[0], amount_to_send) | ||||
label.verify(node) | label.verify(node) | ||||
# Check the amounts received. | # Check the amounts received. | ||||
self.generate(node, 1) | self.generate(node, 1) | ||||
for label in labels: | for label in labels: | ||||
assert_equal( | assert_equal(node.getreceivedbyaddress(label.addresses[0]), amount_to_send) | ||||
node.getreceivedbyaddress(label.addresses[0]), amount_to_send) | |||||
assert_equal(node.getreceivedbylabel(label.name), amount_to_send) | assert_equal(node.getreceivedbylabel(label.name), amount_to_send) | ||||
for i, label in enumerate(labels): | for i, label in enumerate(labels): | ||||
to_label = labels[(i + 1) % len(labels)] | to_label = labels[(i + 1) % len(labels)] | ||||
node.sendtoaddress(to_label.addresses[0], amount_to_send) | node.sendtoaddress(to_label.addresses[0], amount_to_send) | ||||
self.generate(node, 1) | self.generate(node, 1) | ||||
for label in labels: | for label in labels: | ||||
address = node.getnewaddress(label.name) | address = node.getnewaddress(label.name) | ||||
label.add_receive_address(address) | label.add_receive_address(address) | ||||
label.verify(node) | label.verify(node) | ||||
assert_equal(node.getreceivedbylabel(label.name), 2000000) | assert_equal(node.getreceivedbylabel(label.name), 2000000) | ||||
label.verify(node) | label.verify(node) | ||||
self.generate(node, 101) | self.generate(node, 101) | ||||
# Check that setlabel can assign a label to a new unused address. | # Check that setlabel can assign a label to a new unused address. | ||||
for label in labels: | for label in labels: | ||||
address = node.getnewaddress() | address = node.getnewaddress() | ||||
node.setlabel(address, label.name) | node.setlabel(address, label.name) | ||||
label.add_address(address) | label.add_address(address) | ||||
label.verify(node) | label.verify(node) | ||||
assert_raises_rpc_error(-11, | assert_raises_rpc_error( | ||||
"No addresses with label", | -11, "No addresses with label", node.getaddressesbylabel, "" | ||||
node.getaddressesbylabel, | ) | ||||
"") | |||||
# Check that addmultisigaddress can assign labels. | # Check that addmultisigaddress can assign labels. | ||||
if not self.options.descriptors: | if not self.options.descriptors: | ||||
for label in labels: | for label in labels: | ||||
addresses = [] | addresses = [] | ||||
for _ in range(10): | for _ in range(10): | ||||
addresses.append(node.getnewaddress()) | addresses.append(node.getnewaddress()) | ||||
multisig_address = node.addmultisigaddress( | multisig_address = node.addmultisigaddress(5, addresses, label.name)[ | ||||
5, addresses, label.name)['address'] | "address" | ||||
] | |||||
label.add_address(multisig_address) | label.add_address(multisig_address) | ||||
label.purpose[multisig_address] = "send" | label.purpose[multisig_address] = "send" | ||||
label.verify(node) | label.verify(node) | ||||
self.generate(node, 101) | self.generate(node, 101) | ||||
# Check that setlabel can change the label of an address from a | # Check that setlabel can change the label of an address from a | ||||
# different label. | # different label. | ||||
change_label(node, labels[0].addresses[0], labels[0], labels[1]) | change_label(node, labels[0].addresses[0], labels[0], labels[1]) | ||||
Show All 24 Lines | class Label: | ||||
def verify(self, node): | def verify(self, node): | ||||
if self.receive_address is not None: | if self.receive_address is not None: | ||||
assert self.receive_address in self.addresses | assert self.receive_address in self.addresses | ||||
for address in self.addresses: | for address in self.addresses: | ||||
test_address(node, address, labels=[self.name]) | test_address(node, address, labels=[self.name]) | ||||
assert self.name in node.listlabels() | assert self.name in node.listlabels() | ||||
assert_equal( | assert_equal( | ||||
node.getaddressesbylabel(self.name), | node.getaddressesbylabel(self.name), | ||||
{address: {"purpose": self.purpose[address]} for address in self.addresses}) | {address: {"purpose": self.purpose[address]} for address in self.addresses}, | ||||
) | |||||
def change_label(node, address, old_label, new_label): | def change_label(node, address, old_label, new_label): | ||||
assert_equal(address in old_label.addresses, True) | assert_equal(address in old_label.addresses, True) | ||||
node.setlabel(address, new_label.name) | node.setlabel(address, new_label.name) | ||||
old_label.addresses.remove(address) | old_label.addresses.remove(address) | ||||
new_label.add_address(address) | new_label.add_address(address) | ||||
old_label.verify(node) | old_label.verify(node) | ||||
new_label.verify(node) | new_label.verify(node) | ||||
if __name__ == '__main__': | if __name__ == "__main__": | ||||
WalletLabelsTest().main() | WalletLabelsTest().main() |