mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-01 09:35:52 -05:00
Merge a35115f17c
into 85f96b01b7
This commit is contained in:
commit
fd635f05f1
2 changed files with 71 additions and 33 deletions
|
@ -142,6 +142,9 @@ static UniValue ListReceived(const CWallet& wallet, const UniValue& params, cons
|
||||||
const auto& func = [&](const CTxDestination& address, const std::string& label, bool is_change, const std::optional<AddressPurpose>& purpose) {
|
const auto& func = [&](const CTxDestination& address, const std::string& label, bool is_change, const std::optional<AddressPurpose>& purpose) {
|
||||||
if (is_change) return; // no change addresses
|
if (is_change) return; // no change addresses
|
||||||
|
|
||||||
|
LOCK(wallet.cs_wallet);
|
||||||
|
if (!wallet.IsMine(address)) return; // no send addresses
|
||||||
|
|
||||||
auto it = mapTally.find(address);
|
auto it = mapTally.find(address);
|
||||||
if (it == mapTally.end() && !fIncludeEmpty)
|
if (it == mapTally.end() && !fIncludeEmpty)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -29,10 +29,18 @@ class ReceivedByTest(BitcoinTestFramework):
|
||||||
self.skip_if_no_cli()
|
self.skip_if_no_cli()
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
self.test_listreceivedbyaddress()
|
||||||
|
self.test_listreceivedby()
|
||||||
|
self.test_getreceivedby()
|
||||||
|
self.test_receivedbylabel()
|
||||||
|
self.test_coinbase_inclusion()
|
||||||
|
|
||||||
|
def test_listreceivedbyaddress(self):
|
||||||
# save the number of coinbase reward addresses so far
|
# save the number of coinbase reward addresses so far
|
||||||
num_cb_reward_addresses = len(self.nodes[1].listreceivedbyaddress(minconf=0, include_empty=True, include_watchonly=True))
|
num_cb_reward_addresses = len(self.nodes[1].listreceivedbyaddress(minconf=0, include_empty=True, include_watchonly=True))
|
||||||
|
|
||||||
self.log.info("listreceivedbyaddress Test")
|
self.log.info("Tests listreceivedbyaddress")
|
||||||
|
self.log.info("- respects minimum confirmations")
|
||||||
|
|
||||||
# Send from node 0 to 1
|
# Send from node 0 to 1
|
||||||
addr = self.nodes[1].getnewaddress()
|
addr = self.nodes[1].getnewaddress()
|
||||||
|
@ -40,36 +48,31 @@ class ReceivedByTest(BitcoinTestFramework):
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
|
|
||||||
# Check not listed in listreceivedbyaddress because has 0 confirmations
|
# Check not listed in listreceivedbyaddress because has 0 confirmations
|
||||||
assert_array_result(self.nodes[1].listreceivedbyaddress(),
|
assert_array_result(self.nodes[1].listreceivedbyaddress(), {"address": addr}, {}, True)
|
||||||
{"address": addr},
|
|
||||||
{},
|
|
||||||
True)
|
|
||||||
# Bury Tx under 10 block so it will be returned by listreceivedbyaddress
|
# Bury Tx under 10 block so it will be returned by listreceivedbyaddress
|
||||||
self.generate(self.nodes[1], 10)
|
self.generate(self.nodes[1], 10)
|
||||||
assert_array_result(self.nodes[1].listreceivedbyaddress(),
|
expected = {"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]}
|
||||||
{"address": addr},
|
assert_array_result(self.nodes[1].listreceivedbyaddress(), {"address": addr}, expected)
|
||||||
{"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]})
|
|
||||||
# With min confidence < 10
|
# With min confidence < 10
|
||||||
assert_array_result(self.nodes[1].listreceivedbyaddress(5),
|
assert_array_result(self.nodes[1].listreceivedbyaddress(5), {"address": addr}, expected)
|
||||||
{"address": addr},
|
|
||||||
{"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]})
|
|
||||||
# With min confidence > 10, should not find Tx
|
# With min confidence > 10, should not find Tx
|
||||||
assert_array_result(self.nodes[1].listreceivedbyaddress(11), {"address": addr}, {}, True)
|
assert_array_result(self.nodes[1].listreceivedbyaddress(11), {"address": addr}, {}, True)
|
||||||
|
|
||||||
# Empty Tx
|
# Empty Tx
|
||||||
|
self.log.info("- includes empty addresses")
|
||||||
empty_addr = self.nodes[1].getnewaddress()
|
empty_addr = self.nodes[1].getnewaddress()
|
||||||
assert_array_result(self.nodes[1].listreceivedbyaddress(0, True),
|
expected_tx = {"address": empty_addr, "label": "", "amount": 0, "confirmations": 0, "txids": []}
|
||||||
{"address": empty_addr},
|
assert_array_result(self.nodes[1].listreceivedbyaddress(0, True), {"address": empty_addr}, expected_tx)
|
||||||
{"address": empty_addr, "label": "", "amount": 0, "confirmations": 0, "txids": []})
|
|
||||||
|
|
||||||
# No returned addy should be a change addr
|
self.log.info("- does not return changes addresses")
|
||||||
|
# No returned addr should be a change addr
|
||||||
for node in self.nodes:
|
for node in self.nodes:
|
||||||
for addr_obj in node.listreceivedbyaddress():
|
for addr_obj in node.listreceivedbyaddress():
|
||||||
assert_equal(node.getaddressinfo(addr_obj["address"])["ischange"], False)
|
assert_equal(node.getaddressinfo(addr_obj["address"])["ischange"], False)
|
||||||
|
|
||||||
|
self.log.info("- respects address filtering")
|
||||||
# Test Address filtering
|
# Test Address filtering
|
||||||
# Only on addr
|
# 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)
|
res = self.nodes[1].listreceivedbyaddress(minconf=0, include_empty=True, include_watchonly=True, address_filter=addr)
|
||||||
assert_array_result(res, {"address": addr}, expected)
|
assert_array_result(res, {"address": addr}, expected)
|
||||||
assert_equal(len(res), 1)
|
assert_equal(len(res), 1)
|
||||||
|
@ -86,7 +89,7 @@ class ReceivedByTest(BitcoinTestFramework):
|
||||||
txid2 = self.nodes[0].sendtoaddress(other_addr, 0.1)
|
txid2 = self.nodes[0].sendtoaddress(other_addr, 0.1)
|
||||||
self.generate(self.nodes[0], 1)
|
self.generate(self.nodes[0], 1)
|
||||||
# Same test as above should still pass
|
# Same test as above should still pass
|
||||||
expected = {"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 11, "txids": [txid, ]}
|
expected["confirmations"] += 1
|
||||||
res = self.nodes[1].listreceivedbyaddress(0, True, True, addr)
|
res = self.nodes[1].listreceivedbyaddress(0, True, True, addr)
|
||||||
assert_array_result(res, {"address": addr}, expected)
|
assert_array_result(res, {"address": addr}, expected)
|
||||||
assert_equal(len(res), 1)
|
assert_equal(len(res), 1)
|
||||||
|
@ -104,13 +107,37 @@ class ReceivedByTest(BitcoinTestFramework):
|
||||||
res = self.nodes[1].listreceivedbyaddress(0, True, True, other_addr)
|
res = self.nodes[1].listreceivedbyaddress(0, True, True, other_addr)
|
||||||
assert_equal(len(res), 0)
|
assert_equal(len(res), 0)
|
||||||
|
|
||||||
self.log.info("getreceivedbyaddress Test")
|
def test_listreceivedby(self):
|
||||||
|
self.log.info("Tests listreceivedbyaddress does not return address with 'send' purpose")
|
||||||
|
label = "node0address"
|
||||||
|
address = self.nodes[0].getnewaddress(label)
|
||||||
|
# using setlabel for an address that does not belong to the wallet assigns a "send" purpose to that address
|
||||||
|
self.nodes[1].setlabel(address, label) # address has now assigned a "send" purpose on node1
|
||||||
|
assert_equal(self.nodes[0].getaddressesbylabel(label=label), {address: {'purpose': 'receive'}})
|
||||||
|
assert_equal(self.nodes[1].getaddressesbylabel(label=label), {address: {'purpose': 'send'}})
|
||||||
|
|
||||||
|
txid = self.nodes[0].sendtoaddress(address, 0.1)
|
||||||
|
self.sync_all()
|
||||||
|
|
||||||
|
expected = {"address": address, "label": label, "amount": Decimal("0.1"), "confirmations": 0, "txids": [txid, ]}
|
||||||
|
assert_array_result(self.nodes[0].listreceivedbyaddress(minconf=0, include_empty=True), {"address": address}, expected)
|
||||||
|
assert_array_result(self.nodes[1].listreceivedbyaddress(minconf=0, include_empty=True), {"address": address}, {}, True)
|
||||||
|
|
||||||
|
self.log.info("Tests listreceivedbylabel does not return label of address with 'send' purpose")
|
||||||
|
expected = {"label": label, "amount": Decimal("0.1")}
|
||||||
|
assert_array_result(self.nodes[0].listreceivedbylabel(minconf=0, include_empty=True), {"label": label}, expected)
|
||||||
|
assert_array_result(self.nodes[1].listreceivedbylabel(minconf=0, include_empty=True), {"label": label}, {}, True)
|
||||||
|
|
||||||
|
def test_getreceivedby(self):
|
||||||
|
self.log.info("Tests getreceivedbyaddress")
|
||||||
|
|
||||||
# Send from node 0 to 1
|
# Send from node 0 to 1
|
||||||
addr = self.nodes[1].getnewaddress()
|
addr = self.nodes[1].getnewaddress()
|
||||||
txid = self.nodes[0].sendtoaddress(addr, 0.1)
|
|
||||||
|
self.nodes[0].sendtoaddress(addr, 0.1)
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
|
|
||||||
|
self.log.info("- respects minimum confirmations")
|
||||||
# Check balance is 0 because of 0 confirmations
|
# Check balance is 0 because of 0 confirmations
|
||||||
balance = self.nodes[1].getreceivedbyaddress(addr)
|
balance = self.nodes[1].getreceivedbyaddress(addr)
|
||||||
assert_equal(balance, Decimal("0.0"))
|
assert_equal(balance, Decimal("0.0"))
|
||||||
|
@ -124,11 +151,17 @@ class ReceivedByTest(BitcoinTestFramework):
|
||||||
balance = self.nodes[1].getreceivedbyaddress(addr)
|
balance = self.nodes[1].getreceivedbyaddress(addr)
|
||||||
assert_equal(balance, Decimal("0.1"))
|
assert_equal(balance, Decimal("0.1"))
|
||||||
|
|
||||||
|
self.log.info("- does not accept address not found in the wallet")
|
||||||
# Trying to getreceivedby for an address the wallet doesn't own should return an error
|
# 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)
|
assert_raises_rpc_error(-4, "Address not found in wallet", self.nodes[0].getreceivedbyaddress, addr)
|
||||||
|
|
||||||
self.log.info("listreceivedbylabel + getreceivedbylabel Test")
|
def test_receivedbylabel(self):
|
||||||
|
self.log.info("Tests getreceivedbylabel does not accept label not found in the wallet")
|
||||||
|
# getreceivedbylabel returns an error if the wallet does not own the label
|
||||||
|
assert_raises_rpc_error(-4, "Label not found in wallet", self.nodes[0].getreceivedbylabel, "dummy")
|
||||||
|
|
||||||
|
self.log.info("Tests listreceivedbylabel + getreceivedbylabel")
|
||||||
|
self.log.info("- returns matching balances")
|
||||||
# set pre-state
|
# set pre-state
|
||||||
label = ''
|
label = ''
|
||||||
address = self.nodes[1].getnewaddress()
|
address = self.nodes[1].getnewaddress()
|
||||||
|
@ -136,12 +169,9 @@ class ReceivedByTest(BitcoinTestFramework):
|
||||||
received_by_label_json = [r for r in self.nodes[1].listreceivedbylabel() if r["label"] == label][0]
|
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)
|
balance_by_label = self.nodes[1].getreceivedbylabel(label)
|
||||||
|
|
||||||
txid = self.nodes[0].sendtoaddress(addr, 0.1)
|
self.nodes[0].sendtoaddress(address, 0.1)
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
|
|
||||||
# getreceivedbylabel returns an error if the wallet doesn't own the label
|
|
||||||
assert_raises_rpc_error(-4, "Label not found in wallet", self.nodes[0].getreceivedbylabel, "dummy")
|
|
||||||
|
|
||||||
# listreceivedbylabel should return received_by_label_json because of 0 confirmations
|
# listreceivedbylabel should return received_by_label_json because of 0 confirmations
|
||||||
assert_array_result(self.nodes[1].listreceivedbylabel(),
|
assert_array_result(self.nodes[1].listreceivedbylabel(),
|
||||||
{"label": label},
|
{"label": label},
|
||||||
|
@ -173,7 +203,8 @@ class ReceivedByTest(BitcoinTestFramework):
|
||||||
balance = self.nodes[1].getreceivedbylabel("mynewlabel")
|
balance = self.nodes[1].getreceivedbylabel("mynewlabel")
|
||||||
assert_equal(balance, Decimal("0.0"))
|
assert_equal(balance, Decimal("0.0"))
|
||||||
|
|
||||||
self.log.info("Tests for including coinbase outputs")
|
def test_coinbase_inclusion(self):
|
||||||
|
self.log.info("Tests for including coinbase outputs for immature coinbase")
|
||||||
|
|
||||||
# Generate block reward to address with label
|
# Generate block reward to address with label
|
||||||
label = "label"
|
label = "label"
|
||||||
|
@ -183,38 +214,42 @@ class ReceivedByTest(BitcoinTestFramework):
|
||||||
self.generatetoaddress(self.nodes[0], 1, address)
|
self.generatetoaddress(self.nodes[0], 1, address)
|
||||||
hash = self.nodes[0].getbestblockhash()
|
hash = self.nodes[0].getbestblockhash()
|
||||||
|
|
||||||
self.log.info("getreceivedbyaddress returns nothing with defaults")
|
self.log.info("- getreceivedbyaddress")
|
||||||
|
self.log.info(" - returns nothing with defaults")
|
||||||
balance = self.nodes[0].getreceivedbyaddress(address)
|
balance = self.nodes[0].getreceivedbyaddress(address)
|
||||||
assert_equal(balance, 0)
|
assert_equal(balance, 0)
|
||||||
|
|
||||||
self.log.info("getreceivedbyaddress returns block reward when including immature coinbase")
|
self.log.info(" - returns block reward when including immature coinbase")
|
||||||
balance = self.nodes[0].getreceivedbyaddress(address=address, include_immature_coinbase=True)
|
balance = self.nodes[0].getreceivedbyaddress(address=address, include_immature_coinbase=True)
|
||||||
assert_equal(balance, reward)
|
assert_equal(balance, reward)
|
||||||
|
|
||||||
self.log.info("getreceivedbylabel returns nothing with defaults")
|
self.log.info("- getreceivedbylabel")
|
||||||
|
self.log.info(" - returns nothing with defaults")
|
||||||
balance = self.nodes[0].getreceivedbylabel("label")
|
balance = self.nodes[0].getreceivedbylabel("label")
|
||||||
assert_equal(balance, 0)
|
assert_equal(balance, 0)
|
||||||
|
|
||||||
self.log.info("getreceivedbylabel returns block reward when including immature coinbase")
|
self.log.info(" - returns block reward when including immature coinbase")
|
||||||
balance = self.nodes[0].getreceivedbylabel(label="label", include_immature_coinbase=True)
|
balance = self.nodes[0].getreceivedbylabel(label="label", include_immature_coinbase=True)
|
||||||
assert_equal(balance, reward)
|
assert_equal(balance, reward)
|
||||||
|
|
||||||
self.log.info("listreceivedbyaddress does not include address with defaults")
|
self.log.info("- listreceivedbyaddress")
|
||||||
|
self.log.info(" - does not include address with defaults")
|
||||||
assert_array_result(self.nodes[0].listreceivedbyaddress(),
|
assert_array_result(self.nodes[0].listreceivedbyaddress(),
|
||||||
{"address": address},
|
{"address": address},
|
||||||
{}, True)
|
{}, True)
|
||||||
|
|
||||||
self.log.info("listreceivedbyaddress includes address when including immature coinbase")
|
self.log.info(" - includes address when including immature coinbase")
|
||||||
assert_array_result(self.nodes[0].listreceivedbyaddress(minconf=1, include_immature_coinbase=True),
|
assert_array_result(self.nodes[0].listreceivedbyaddress(minconf=1, include_immature_coinbase=True),
|
||||||
{"address": address},
|
{"address": address},
|
||||||
{"address": address, "amount": reward})
|
{"address": address, "amount": reward})
|
||||||
|
|
||||||
self.log.info("listreceivedbylabel does not include label with defaults")
|
self.log.info("- listreceivedbylabel")
|
||||||
|
self.log.info(" - does not include label with defaults")
|
||||||
assert_array_result(self.nodes[0].listreceivedbylabel(),
|
assert_array_result(self.nodes[0].listreceivedbylabel(),
|
||||||
{"label": label},
|
{"label": label},
|
||||||
{}, True)
|
{}, True)
|
||||||
|
|
||||||
self.log.info("listreceivedbylabel includes label when including immature coinbase")
|
self.log.info(" - includes label when including immature coinbase")
|
||||||
assert_array_result(self.nodes[0].listreceivedbylabel(minconf=1, include_immature_coinbase=True),
|
assert_array_result(self.nodes[0].listreceivedbylabel(minconf=1, include_immature_coinbase=True),
|
||||||
{"label": label},
|
{"label": label},
|
||||||
{"label": label, "amount": reward})
|
{"label": label, "amount": reward})
|
||||||
|
|
Loading…
Add table
Reference in a new issue