Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1#!/usr/bin/env python32# Copyright (c) 2014-present The Bitcoin Core developers3# Distributed under the MIT software license, see the accompanying4# file COPYING or http://www.opensource.org/licenses/mit-license.php.5"""Test the listreceivedbyaddress, listreceivedbylabel, getreceivedybaddress, and getreceivedbylabel RPCs."""6from decimal import Decimal8from test_framework.blocktools import COINBASE_MATURITY9from test_framework.test_framework import BitcoinTestFramework10from test_framework.util import (11assert_array_result,12assert_equal,13assert_raises_rpc_error,14)15from test_framework.wallet_util import test_address18class ReceivedByTest(BitcoinTestFramework):19def set_test_params(self):20self.num_nodes = 221# whitelist peers to speed up tx relay / mempool sync22self.noban_tx_relay = True24def skip_test_if_missing_module(self):25self.skip_if_no_wallet()26self.skip_if_no_cli()28def run_test(self):29# save the number of coinbase reward addresses so far30num_cb_reward_addresses = len(self.nodes[1].listreceivedbyaddress(minconf=0, include_empty=True))32self.log.info("listreceivedbyaddress Test")34# Send from node 0 to 135addr = self.nodes[1].getnewaddress()36txid = self.nodes[0].sendtoaddress(addr, 0.1)37self.sync_all()39# Check not listed in listreceivedbyaddress because has 0 confirmations40assert_array_result(self.nodes[1].listreceivedbyaddress(),41{"address": addr},42{},43True)44# Bury Tx under 10 block so it will be returned by listreceivedbyaddress45self.generate(self.nodes[1], 10)46assert_array_result(self.nodes[1].listreceivedbyaddress(),47{"address": addr},48{"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]})49# With min confidence < 1050assert_array_result(self.nodes[1].listreceivedbyaddress(5),51{"address": addr},52{"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]})53# With min confidence > 10, should not find Tx54assert_array_result(self.nodes[1].listreceivedbyaddress(11), {"address": addr}, {}, True)56# Empty Tx57empty_addr = self.nodes[1].getnewaddress()58assert_array_result(self.nodes[1].listreceivedbyaddress(0, True),59{"address": empty_addr},60{"address": empty_addr, "label": "", "amount": 0, "confirmations": 0, "txids": []})62# No returned addy should be a change addr63for node in self.nodes:64for addr_obj in node.listreceivedbyaddress():65assert_equal(node.getaddressinfo(addr_obj["address"])["ischange"], False)67# Test Address filtering68# Only on addr69expected = {"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]}70res = self.nodes[1].listreceivedbyaddress(minconf=0, include_empty=True, address_filter=addr)71assert_array_result(res, {"address": addr}, expected)72assert_equal(len(res), 1)73# Test for regression on CLI calls with address string (#14173)74cli_res = self.nodes[1].cli.listreceivedbyaddress(0, True, True, addr)75assert_array_result(cli_res, {"address": addr}, expected)76assert_equal(len(cli_res), 1)77# Error on invalid address78assert_raises_rpc_error(-4, "address_filter parameter was invalid", self.nodes[1].listreceivedbyaddress, minconf=0, include_empty=True, address_filter="bamboozling")79# Another address receive money80res = self.nodes[1].listreceivedbyaddress(0, True, True)81assert_equal(len(res), 2 + num_cb_reward_addresses) # Right now 2 entries82other_addr = self.nodes[1].getnewaddress()83txid2 = self.nodes[0].sendtoaddress(other_addr, 0.1)84self.generate(self.nodes[0], 1)85# Same test as above should still pass86expected = {"address": addr, "label": "", "amount": Decimal("0.1"), "confirmations": 11, "txids": [txid, ]}87res = self.nodes[1].listreceivedbyaddress(0, True, True, addr)88assert_array_result(res, {"address": addr}, expected)89assert_equal(len(res), 1)90# Same test as above but with other_addr should still pass91expected = {"address": other_addr, "label": "", "amount": Decimal("0.1"), "confirmations": 1, "txids": [txid2, ]}92res = self.nodes[1].listreceivedbyaddress(0, True, True, other_addr)93assert_array_result(res, {"address": other_addr}, expected)94assert_equal(len(res), 1)95# Should be two entries though without filter96res = self.nodes[1].listreceivedbyaddress(0, True, True)97assert_equal(len(res), 3 + num_cb_reward_addresses) # Became 3 entries99# Not on random addr100other_addr = self.nodes[0].getnewaddress() # note on node[0]! just a random addr101res = self.nodes[1].listreceivedbyaddress(0, True, True, other_addr)102assert_equal(len(res), 0)104self.log.info("listreceivedbyaddress and listreceivedbylabel exclude not owned addresses")105# setlabel assigns a "send" purpose when the wallet doesn't own the address.106send_label = "external-address"107external_addr = self.nodes[0].getnewaddress(send_label)108self.nodes[1].setlabel(external_addr, send_label)109assert_equal(self.nodes[1].getaddressinfo(external_addr)["ismine"], False)110assert_array_result(self.nodes[1].listreceivedbyaddress(minconf=0, include_empty=True),111{"address": external_addr}, {}, True)112assert_array_result(self.nodes[1].listreceivedbylabel(minconf=0, include_empty=True),113{"label": send_label}, {}, True)115self.log.info("getreceivedbyaddress Test")117# Send from node 0 to 1118addr = self.nodes[1].getnewaddress()119txid = self.nodes[0].sendtoaddress(addr, 0.1)120self.sync_all()122# Check balance is 0 because of 0 confirmations123balance = self.nodes[1].getreceivedbyaddress(addr)124assert_equal(balance, Decimal("0.0"))126# Check balance is 0.1127balance = self.nodes[1].getreceivedbyaddress(addr, 0)128assert_equal(balance, Decimal("0.1"))130# Bury Tx under 10 block so it will be returned by the default getreceivedbyaddress131self.generate(self.nodes[1], 10)132balance = self.nodes[1].getreceivedbyaddress(addr)133assert_equal(balance, Decimal("0.1"))135# Trying to getreceivedby for an address the wallet doesn't own should return an error136assert_raises_rpc_error(-4, "Address not found in wallet", self.nodes[0].getreceivedbyaddress, addr)138# Test multiple transactions to the same address139addr_with_multiple_txs = self.nodes[1].getnewaddress()140self.nodes[0].sendtoaddress(addr_with_multiple_txs, Decimal("0.1"))141self.nodes[0].sendtoaddress(addr_with_multiple_txs, Decimal("0.2"))142self.generate(self.nodes[0], 1)143balance = self.nodes[1].getreceivedbyaddress(addr_with_multiple_txs)144assert_equal(balance, Decimal("0.3"))146# Test invalid address format error147assert_raises_rpc_error(-5, "Invalid Bitcoin address", self.nodes[1].getreceivedbyaddress, "invalid_address")149self.log.info("listreceivedbylabel + getreceivedbylabel Test")151# set pre-state152label = ''153address = self.nodes[1].getnewaddress()154test_address(self.nodes[1], address, labels=[label])155received_by_label_json = [r for r in self.nodes[1].listreceivedbylabel() if r["label"] == label][0]156balance_by_label = self.nodes[1].getreceivedbylabel(label)158txid = self.nodes[0].sendtoaddress(addr, 0.1)159self.sync_all()161# getreceivedbylabel returns an error if the wallet doesn't own the label162assert_raises_rpc_error(-4, "Label not found in wallet", self.nodes[0].getreceivedbylabel, "dummy")164# listreceivedbylabel should return received_by_label_json because of 0 confirmations165assert_array_result(self.nodes[1].listreceivedbylabel(),166{"label": label},167received_by_label_json)169# getreceivedbylabel should return same balance because of 0 confirmations170balance = self.nodes[1].getreceivedbylabel(label)171assert_equal(balance, balance_by_label)173self.generate(self.nodes[1], 10)174# listreceivedbylabel should return updated received list175assert_array_result(self.nodes[1].listreceivedbylabel(),176{"label": label},177{"label": received_by_label_json["label"], "amount": (received_by_label_json["amount"] + Decimal("0.1"))})179# getreceivedbylabel should return updated receive total180balance = self.nodes[1].getreceivedbylabel(label)181assert_equal(balance, balance_by_label + Decimal("0.1"))183# Create a new label named "mynewlabel" that has a 0 balance184address = self.nodes[1].getnewaddress()185self.nodes[1].setlabel(address, "mynewlabel")186received_by_label_json = [r for r in self.nodes[1].listreceivedbylabel(0, True) if r["label"] == "mynewlabel"][0]188# Test includeempty of listreceivedbylabel189assert_equal(received_by_label_json["amount"], Decimal("0.0"))191# Test getreceivedbylabel for 0 amount labels192balance = self.nodes[1].getreceivedbylabel("mynewlabel")193assert_equal(balance, Decimal("0.0"))195self.log.info("Tests for including coinbase outputs")197# Generate block reward to address with label198label = "label"199address = self.nodes[0].getnewaddress(label)201reward = Decimal("25")202self.generatetoaddress(self.nodes[0], 1, address)203hash = self.nodes[0].getbestblockhash()205self.log.info("getreceivedbyaddress returns nothing with defaults")206balance = self.nodes[0].getreceivedbyaddress(address)207assert_equal(balance, 0)209self.log.info("getreceivedbyaddress returns block reward when including immature coinbase")210balance = self.nodes[0].getreceivedbyaddress(address=address, include_immature_coinbase=True)211assert_equal(balance, reward)213self.log.info("getreceivedbylabel returns nothing with defaults")214balance = self.nodes[0].getreceivedbylabel("label")215assert_equal(balance, 0)217self.log.info("getreceivedbylabel returns block reward when including immature coinbase")218balance = self.nodes[0].getreceivedbylabel(label="label", include_immature_coinbase=True)219assert_equal(balance, reward)221self.log.info("listreceivedbyaddress does not include address with defaults")222assert_array_result(self.nodes[0].listreceivedbyaddress(),223{"address": address},224{}, True)226self.log.info("listreceivedbyaddress includes address when including immature coinbase")227assert_array_result(self.nodes[0].listreceivedbyaddress(minconf=1, include_immature_coinbase=True),228{"address": address},229{"address": address, "amount": reward})231self.log.info("listreceivedbylabel does not include label with defaults")232assert_array_result(self.nodes[0].listreceivedbylabel(),233{"label": label},234{}, True)236self.log.info("listreceivedbylabel includes label when including immature coinbase")237assert_array_result(self.nodes[0].listreceivedbylabel(minconf=1, include_immature_coinbase=True),238{"label": label},239{"label": label, "amount": reward})241self.log.info("Generate 100 more blocks")242self.generate(self.nodes[0], COINBASE_MATURITY)244self.log.info("getreceivedbyaddress returns reward with defaults")245balance = self.nodes[0].getreceivedbyaddress(address)246assert_equal(balance, reward)248self.log.info("getreceivedbylabel returns reward with defaults")249balance = self.nodes[0].getreceivedbylabel("label")250assert_equal(balance, reward)
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.