189e0ef33e
Add label API to wallet RPC. This is one step towards #3816 ("Remove bolt-on account system") although it doesn't actually remove anything yet. These initially mirror the account functions, with the following differences: - These functions aren't DEPRECATED in the help - Help mentions 'label' instead of accounts. In the language used, labels are associated with addresses, instead of addresses associated with labels. (unlike with accounts.) - Labels have no balance - No balances in `listlabels` - `listlabels` has no minconf or watchonly argument - Like in the GUI, labels can be set on any address, not just receiving addreses - Unlike accounts, labels can be deleted. Being unable to delete them is a common annoyance (see #1231). Currently only by reassigning all addresses using `setlabel`, but an explicit call `deletelabel` which assigns all address to the default label may make sense. Thanks to Pierre Rochard for test fixes.
154 lines
7.2 KiB
Python
Executable file
154 lines
7.2 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
# Copyright (c) 2014-2017 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
"""Test the listreceivedbyaddress RPC."""
|
|
from decimal import Decimal
|
|
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
from test_framework.util import (assert_array_result,
|
|
assert_equal,
|
|
assert_raises_rpc_error,
|
|
)
|
|
|
|
class ReceivedByTest(BitcoinTestFramework):
|
|
def set_test_params(self):
|
|
self.num_nodes = 2
|
|
|
|
def run_test(self):
|
|
# Generate block to get out of IBD
|
|
self.nodes[0].generate(1)
|
|
|
|
self.log.info("listreceivedbyaddress Test")
|
|
|
|
# Send from node 0 to 1
|
|
addr = self.nodes[1].getnewaddress()
|
|
txid = self.nodes[0].sendtoaddress(addr, 0.1)
|
|
self.sync_all()
|
|
|
|
# Check not listed in listreceivedbyaddress because has 0 confirmations
|
|
assert_array_result(self.nodes[1].listreceivedbyaddress(),
|
|
{"address": addr},
|
|
{},
|
|
True)
|
|
# Bury Tx under 10 block so it will be returned by listreceivedbyaddress
|
|
self.nodes[1].generate(10)
|
|
self.sync_all()
|
|
assert_array_result(self.nodes[1].listreceivedbyaddress(),
|
|
{"address": addr},
|
|
{"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]})
|
|
# With min confidence < 10
|
|
assert_array_result(self.nodes[1].listreceivedbyaddress(5),
|
|
{"address": addr},
|
|
{"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]})
|
|
# With min confidence > 10, should not find Tx
|
|
assert_array_result(self.nodes[1].listreceivedbyaddress(11), {"address": addr}, {}, True)
|
|
|
|
# Empty Tx
|
|
empty_addr = self.nodes[1].getnewaddress()
|
|
assert_array_result(self.nodes[1].listreceivedbyaddress(0, True),
|
|
{"address": empty_addr},
|
|
{"address": empty_addr, "label": "", "amount": 0, "confirmations": 0, "txids": []})
|
|
|
|
#Test Address filtering
|
|
#Only on addr
|
|
expected = {"address":addr, "label":"", "amount":Decimal("0.1"), "confirmations":10, "txids":[txid,]}
|
|
res = self.nodes[1].listreceivedbyaddress(minconf=0, include_empty=True, include_watchonly=True, address_filter=addr)
|
|
assert_array_result(res, {"address":addr}, expected)
|
|
assert_equal(len(res), 1)
|
|
#Error on invalid address
|
|
assert_raises_rpc_error(-4, "address_filter parameter was invalid", self.nodes[1].listreceivedbyaddress, minconf=0, include_empty=True, include_watchonly=True, address_filter="bamboozling")
|
|
#Another address receive money
|
|
res = self.nodes[1].listreceivedbyaddress(0, True, True)
|
|
assert_equal(len(res), 2) #Right now 2 entries
|
|
other_addr = self.nodes[1].getnewaddress()
|
|
txid2 = self.nodes[0].sendtoaddress(other_addr, 0.1)
|
|
self.nodes[0].generate(1)
|
|
self.sync_all()
|
|
#Same test as above should still pass
|
|
expected = {"address":addr, "label":"", "amount":Decimal("0.1"), "confirmations":11, "txids":[txid,]}
|
|
res = self.nodes[1].listreceivedbyaddress(0, True, True, addr)
|
|
assert_array_result(res, {"address":addr}, expected)
|
|
assert_equal(len(res), 1)
|
|
#Same test as above but with other_addr should still pass
|
|
expected = {"address":other_addr, "label":"", "amount":Decimal("0.1"), "confirmations":1, "txids":[txid2,]}
|
|
res = self.nodes[1].listreceivedbyaddress(0, True, True, other_addr)
|
|
assert_array_result(res, {"address":other_addr}, expected)
|
|
assert_equal(len(res), 1)
|
|
#Should be two entries though without filter
|
|
res = self.nodes[1].listreceivedbyaddress(0, True, True)
|
|
assert_equal(len(res), 3) #Became 3 entries
|
|
|
|
#Not on random addr
|
|
other_addr = self.nodes[0].getnewaddress() # note on node[0]! just a random addr
|
|
res = self.nodes[1].listreceivedbyaddress(0, True, True, other_addr)
|
|
assert_equal(len(res), 0)
|
|
|
|
self.log.info("getreceivedbyaddress Test")
|
|
|
|
# Send from node 0 to 1
|
|
addr = self.nodes[1].getnewaddress()
|
|
txid = self.nodes[0].sendtoaddress(addr, 0.1)
|
|
self.sync_all()
|
|
|
|
# Check balance is 0 because of 0 confirmations
|
|
balance = self.nodes[1].getreceivedbyaddress(addr)
|
|
assert_equal(balance, Decimal("0.0"))
|
|
|
|
# Check balance is 0.1
|
|
balance = self.nodes[1].getreceivedbyaddress(addr, 0)
|
|
assert_equal(balance, Decimal("0.1"))
|
|
|
|
# Bury Tx under 10 block so it will be returned by the default getreceivedbyaddress
|
|
self.nodes[1].generate(10)
|
|
self.sync_all()
|
|
balance = self.nodes[1].getreceivedbyaddress(addr)
|
|
assert_equal(balance, Decimal("0.1"))
|
|
|
|
# Trying to getreceivedby for an address the wallet doesn't own should return an error
|
|
assert_raises_rpc_error(-4, "Address not found in wallet", self.nodes[0].getreceivedbyaddress, addr)
|
|
|
|
self.log.info("listreceivedbylabel + getreceivedbylabel Test")
|
|
|
|
# set pre-state
|
|
addrArr = self.nodes[1].getnewaddress()
|
|
label = self.nodes[1].getaccount(addrArr)
|
|
received_by_label_json = [r for r in self.nodes[1].listreceivedbylabel() if r["label"] == label][0]
|
|
balance_by_label = self.nodes[1].getreceivedbylabel(label)
|
|
|
|
txid = self.nodes[0].sendtoaddress(addr, 0.1)
|
|
self.sync_all()
|
|
|
|
# listreceivedbylabel should return received_by_label_json because of 0 confirmations
|
|
assert_array_result(self.nodes[1].listreceivedbylabel(),
|
|
{"label": label},
|
|
received_by_label_json)
|
|
|
|
# getreceivedbyaddress should return same balance because of 0 confirmations
|
|
balance = self.nodes[1].getreceivedbylabel(label)
|
|
assert_equal(balance, balance_by_label)
|
|
|
|
self.nodes[1].generate(10)
|
|
self.sync_all()
|
|
# listreceivedbylabel should return updated received list
|
|
assert_array_result(self.nodes[1].listreceivedbylabel(),
|
|
{"label": label},
|
|
{"label": received_by_label_json["label"], "amount": (received_by_label_json["amount"] + Decimal("0.1"))})
|
|
|
|
# getreceivedbylabel should return updated receive total
|
|
balance = self.nodes[1].getreceivedbylabel(label)
|
|
assert_equal(balance, balance_by_label + Decimal("0.1"))
|
|
|
|
# Create a new label named "mynewlabel" that has a 0 balance
|
|
self.nodes[1].getlabeladdress(label="mynewlabel", force=True)
|
|
received_by_label_json = [r for r in self.nodes[1].listreceivedbylabel(0, True) if r["label"] == "mynewlabel"][0]
|
|
|
|
# Test includeempty of listreceivedbylabel
|
|
assert_equal(received_by_label_json["amount"], Decimal("0.0"))
|
|
|
|
# Test getreceivedbylabel for 0 amount labels
|
|
balance = self.nodes[1].getreceivedbylabel("mynewlabel")
|
|
assert_equal(balance, Decimal("0.0"))
|
|
|
|
if __name__ == '__main__':
|
|
ReceivedByTest().main()
|