0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-01 09:35:52 -05:00
This commit is contained in:
Brandon Odiwuor 2025-02-01 00:05:16 +01:00 committed by GitHub
commit fd635f05f1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 71 additions and 33 deletions

View file

@ -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;

View file

@ -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})