2016-03-19 16:58:06 -03:00
#!/usr/bin/env python3
2022-12-24 20:49:50 -03:00
# Copyright (c) 2014-2022 The Bitcoin Core developers
2014-10-22 22:48:19 -03:00
# Distributed under the MIT software license, see the accompanying
2014-03-25 10:33:44 -03:00
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
2021-12-07 12:48:37 -03:00
""" Test the listreceivedbyaddress, listreceivedbylabel, getreceivedybaddress, and getreceivedbylabel RPCs. """
2017-08-15 12:39:02 -03:00
from decimal import Decimal
2014-03-25 10:33:44 -03:00
2021-12-07 12:48:37 -03:00
from test_framework . blocktools import COINBASE_MATURITY
2015-05-02 07:53:35 -03:00
from test_framework . test_framework import BitcoinTestFramework
2018-05-22 17:07:19 -04:00
from test_framework . util import (
assert_array_result ,
assert_equal ,
assert_raises_rpc_error ,
)
2019-11-24 08:05:38 -03:00
from test_framework . wallet_util import test_address
2018-05-22 17:07:19 -04:00
2014-03-25 10:33:44 -03:00
2014-07-08 12:07:23 -04:00
class ReceivedByTest ( BitcoinTestFramework ) :
2022-11-09 08:53:13 -03:00
def add_options ( self , parser ) :
self . add_wallet_options ( parser )
2017-06-09 18:21:21 -04:00
def set_test_params ( self ) :
2017-08-24 12:11:56 -03:00
self . num_nodes = 2
2022-08-17 18:15:21 -04:00
# whitelist peers to speed up tx relay / mempool sync
2023-03-14 10:18:47 -03:00
self . noban_tx_relay = True
2015-12-05 14:02:02 -03:00
2018-09-09 14:32:37 -03:00
def skip_test_if_missing_module ( self ) :
self . skip_if_no_wallet ( )
2019-11-18 18:47:41 -03:00
self . skip_if_no_cli ( )
2018-09-09 14:32:37 -03:00
2014-10-20 09:14:04 -03:00
def run_test ( self ) :
2018-10-16 12:21:07 -03:00
# 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 ) )
2017-08-15 12:39:02 -03:00
self . log . info ( " listreceivedbyaddress Test " )
2014-07-08 12:07:23 -04:00
# Send from node 0 to 1
2014-10-20 09:14:04 -03:00
addr = self . nodes [ 1 ] . getnewaddress ( )
txid = self . nodes [ 0 ] . sendtoaddress ( addr , 0.1 )
self . sync_all ( )
2014-07-08 12:07:23 -04:00
2017-08-15 12:39:02 -03:00
# Check not listed in listreceivedbyaddress because has 0 confirmations
2016-04-19 08:22:11 -03:00
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( ) ,
2017-08-15 12:39:02 -03:00
{ " address " : addr } ,
{ } ,
True )
# Bury Tx under 10 block so it will be returned by listreceivedbyaddress
2021-08-19 11:10:24 -04:00
self . generate ( self . nodes [ 1 ] , 10 )
2016-04-19 08:22:11 -03:00
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( ) ,
2017-08-15 12:39:02 -03:00
{ " address " : addr } ,
2017-10-20 14:27:55 -03:00
{ " address " : addr , " label " : " " , " amount " : Decimal ( " 0.1 " ) , " confirmations " : 10 , " txids " : [ txid , ] } )
2017-08-15 12:39:02 -03:00
# With min confidence < 10
2016-04-19 08:22:11 -03:00
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( 5 ) ,
2017-08-15 12:39:02 -03:00
{ " address " : addr } ,
2017-10-20 14:27:55 -03:00
{ " address " : addr , " label " : " " , " amount " : Decimal ( " 0.1 " ) , " confirmations " : 10 , " txids " : [ txid , ] } )
2017-08-15 12:39:02 -03:00
# With min confidence > 10, should not find Tx
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( 11 ) , { " address " : addr } , { } , True )
2014-07-08 12:07:23 -04:00
2017-08-15 12:39:02 -03:00
# Empty Tx
2017-01-09 19:18:17 -03:00
empty_addr = self . nodes [ 1 ] . getnewaddress ( )
2017-08-15 12:39:02 -03:00
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True ) ,
2017-01-09 19:18:17 -03:00
{ " address " : empty_addr } ,
2017-10-20 14:27:55 -03:00
{ " address " : empty_addr , " label " : " " , " amount " : 0 , " confirmations " : 0 , " txids " : [ ] } )
2017-01-09 19:18:17 -03:00
2022-06-22 11:46:43 -04:00
# No returned addy should be a change addr
for node in self . nodes :
for addr_obj in node . listreceivedbyaddress ( ) :
assert_equal ( node . getaddressinfo ( addr_obj [ " address " ] ) [ " ischange " ] , False )
2018-04-24 16:55:53 -03:00
# Test Address filtering
# Only on addr
expected = { " address " : addr , " label " : " " , " amount " : Decimal ( " 0.1 " ) , " confirmations " : 10 , " txids " : [ txid , ] }
2017-01-09 19:18:17 -03:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( minconf = 0 , include_empty = True , include_watchonly = True , address_filter = addr )
2018-04-24 16:55:53 -03:00
assert_array_result ( res , { " address " : addr } , expected )
2017-01-09 19:18:17 -03:00
assert_equal ( len ( res ) , 1 )
2018-10-06 14:11:38 -03:00
# Test for regression on CLI calls with address string (#14173)
cli_res = self . nodes [ 1 ] . cli . listreceivedbyaddress ( 0 , True , True , addr )
assert_array_result ( cli_res , { " address " : addr } , expected )
assert_equal ( len ( cli_res ) , 1 )
2018-04-24 16:55:53 -03:00
# Error on invalid address
2017-01-09 19:18:17 -03:00
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 " )
2018-04-24 16:55:53 -03:00
# Another address receive money
2017-01-09 19:18:17 -03:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True )
2018-10-16 12:21:07 -03:00
assert_equal ( len ( res ) , 2 + num_cb_reward_addresses ) # Right now 2 entries
2017-01-09 19:18:17 -03:00
other_addr = self . nodes [ 1 ] . getnewaddress ( )
txid2 = self . nodes [ 0 ] . sendtoaddress ( other_addr , 0.1 )
2021-08-19 11:10:24 -04:00
self . generate ( self . nodes [ 0 ] , 1 )
2018-04-24 16:55:53 -03:00
# Same test as above should still pass
expected = { " address " : addr , " label " : " " , " amount " : Decimal ( " 0.1 " ) , " confirmations " : 11 , " txids " : [ txid , ] }
2017-01-09 19:18:17 -03:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True , addr )
2018-04-24 16:55:53 -03:00
assert_array_result ( res , { " address " : addr } , expected )
2017-01-09 19:18:17 -03:00
assert_equal ( len ( res ) , 1 )
2018-04-24 16:55:53 -03:00
# Same test as above but with other_addr should still pass
expected = { " address " : other_addr , " label " : " " , " amount " : Decimal ( " 0.1 " ) , " confirmations " : 1 , " txids " : [ txid2 , ] }
2017-01-09 19:18:17 -03:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True , other_addr )
2018-04-24 16:55:53 -03:00
assert_array_result ( res , { " address " : other_addr } , expected )
2017-01-09 19:18:17 -03:00
assert_equal ( len ( res ) , 1 )
2018-04-24 16:55:53 -03:00
# Should be two entries though without filter
2017-01-09 19:18:17 -03:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True )
2018-10-16 12:21:07 -03:00
assert_equal ( len ( res ) , 3 + num_cb_reward_addresses ) # Became 3 entries
2017-01-09 19:18:17 -03:00
2018-04-24 16:55:53 -03:00
# Not on random addr
other_addr = self . nodes [ 0 ] . getnewaddress ( ) # note on node[0]! just a random addr
2017-01-09 19:18:17 -03:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True , other_addr )
assert_equal ( len ( res ) , 0 )
2017-08-15 12:39:02 -03:00
self . log . info ( " getreceivedbyaddress Test " )
2014-07-08 12:07:23 -04:00
# Send from node 0 to 1
2014-10-20 09:14:04 -03:00
addr = self . nodes [ 1 ] . getnewaddress ( )
txid = self . nodes [ 0 ] . sendtoaddress ( addr , 0.1 )
self . sync_all ( )
2014-07-08 12:07:23 -04:00
2017-08-15 12:39:02 -03:00
# Check balance is 0 because of 0 confirmations
2014-10-20 09:14:04 -03:00
balance = self . nodes [ 1 ] . getreceivedbyaddress ( addr )
2017-08-15 12:39:02 -03:00
assert_equal ( balance , Decimal ( " 0.0 " ) )
2014-07-08 12:07:23 -04:00
2017-08-15 12:39:02 -03:00
# Check balance is 0.1
balance = self . nodes [ 1 ] . getreceivedbyaddress ( addr , 0 )
assert_equal ( balance , Decimal ( " 0.1 " ) )
2014-07-08 12:07:23 -04:00
2017-08-15 12:39:02 -03:00
# Bury Tx under 10 block so it will be returned by the default getreceivedbyaddress
2021-08-19 11:10:24 -04:00
self . generate ( self . nodes [ 1 ] , 10 )
2014-10-20 09:14:04 -03:00
balance = self . nodes [ 1 ] . getreceivedbyaddress ( addr )
2017-08-15 12:39:02 -03:00
assert_equal ( balance , Decimal ( " 0.1 " ) )
2017-08-15 12:33:39 -03:00
# 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 )
2017-10-20 14:27:55 -03:00
self . log . info ( " listreceivedbylabel + getreceivedbylabel Test " )
2014-07-08 12:07:23 -04:00
2017-08-15 12:39:02 -03:00
# set pre-state
2018-04-24 16:50:00 -03:00
label = ' '
2018-04-24 16:55:53 -03:00
address = self . nodes [ 1 ] . getnewaddress ( )
2019-11-24 21:31:38 -03:00
test_address ( self . nodes [ 1 ] , address , labels = [ label ] )
2017-10-20 14:27:55 -03:00
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 )
2014-07-08 12:07:23 -04:00
2014-10-20 09:14:04 -03:00
txid = self . nodes [ 0 ] . sendtoaddress ( addr , 0.1 )
2014-11-20 17:49:07 -03:00
self . sync_all ( )
2014-07-08 12:07:23 -04:00
2022-05-12 15:51:36 -04:00
# 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 " )
2017-10-20 14:27:55 -03:00
# listreceivedbylabel should return received_by_label_json because of 0 confirmations
assert_array_result ( self . nodes [ 1 ] . listreceivedbylabel ( ) ,
{ " label " : label } ,
received_by_label_json )
2014-07-08 12:07:23 -04:00
# getreceivedbyaddress should return same balance because of 0 confirmations
2017-10-20 14:27:55 -03:00
balance = self . nodes [ 1 ] . getreceivedbylabel ( label )
assert_equal ( balance , balance_by_label )
2014-07-08 12:07:23 -04:00
2021-08-19 11:10:24 -04:00
self . generate ( self . nodes [ 1 ] , 10 )
2017-10-20 14:27:55 -03:00
# 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 " ) ) } )
2014-07-08 12:07:23 -04:00
2017-10-20 14:27:55 -03:00
# getreceivedbylabel should return updated receive total
balance = self . nodes [ 1 ] . getreceivedbylabel ( label )
assert_equal ( balance , balance_by_label + Decimal ( " 0.1 " ) )
2014-07-08 12:07:23 -04:00
2017-10-20 14:27:55 -03:00
# Create a new label named "mynewlabel" that has a 0 balance
2018-04-24 16:50:00 -03:00
address = self . nodes [ 1 ] . getnewaddress ( )
self . nodes [ 1 ] . setlabel ( address , " mynewlabel " )
2017-10-20 14:27:55 -03:00
received_by_label_json = [ r for r in self . nodes [ 1 ] . listreceivedbylabel ( 0 , True ) if r [ " label " ] == " mynewlabel " ] [ 0 ]
2014-07-08 12:07:23 -04:00
2017-10-20 14:27:55 -03:00
# Test includeempty of listreceivedbylabel
assert_equal ( received_by_label_json [ " amount " ] , Decimal ( " 0.0 " ) )
2014-07-08 12:07:23 -04:00
2017-10-20 14:27:55 -03:00
# Test getreceivedbylabel for 0 amount labels
balance = self . nodes [ 1 ] . getreceivedbylabel ( " mynewlabel " )
2017-08-15 12:39:02 -03:00
assert_equal ( balance , Decimal ( " 0.0 " ) )
2014-03-25 10:33:44 -03:00
2021-12-07 12:48:37 -03:00
self . log . info ( " Tests for including coinbase outputs " )
# Generate block reward to address with label
label = " label "
address = self . nodes [ 0 ] . getnewaddress ( label )
reward = Decimal ( " 25 " )
2022-04-01 10:19:26 -03:00
self . generatetoaddress ( self . nodes [ 0 ] , 1 , address )
2021-12-07 12:48:37 -03:00
hash = self . nodes [ 0 ] . getbestblockhash ( )
self . log . info ( " getreceivedbyaddress returns nothing with defaults " )
balance = self . nodes [ 0 ] . getreceivedbyaddress ( address )
assert_equal ( balance , 0 )
self . log . info ( " getreceivedbyaddress returns block reward when including immature coinbase " )
balance = self . nodes [ 0 ] . getreceivedbyaddress ( address = address , include_immature_coinbase = True )
assert_equal ( balance , reward )
self . log . info ( " getreceivedbylabel returns nothing with defaults " )
balance = self . nodes [ 0 ] . getreceivedbylabel ( " label " )
assert_equal ( balance , 0 )
self . log . info ( " getreceivedbylabel returns block reward when including immature coinbase " )
balance = self . nodes [ 0 ] . getreceivedbylabel ( label = " label " , include_immature_coinbase = True )
assert_equal ( balance , reward )
self . log . info ( " listreceivedbyaddress does not include address with defaults " )
assert_array_result ( self . nodes [ 0 ] . listreceivedbyaddress ( ) ,
{ " address " : address } ,
{ } , True )
self . log . info ( " listreceivedbyaddress includes address when including immature coinbase " )
assert_array_result ( self . nodes [ 0 ] . listreceivedbyaddress ( minconf = 1 , include_immature_coinbase = True ) ,
{ " address " : address } ,
{ " address " : address , " amount " : reward } )
self . log . info ( " listreceivedbylabel does not include label with defaults " )
assert_array_result ( self . nodes [ 0 ] . listreceivedbylabel ( ) ,
{ " label " : label } ,
{ } , True )
self . log . info ( " listreceivedbylabel includes label when including immature coinbase " )
assert_array_result ( self . nodes [ 0 ] . listreceivedbylabel ( minconf = 1 , include_immature_coinbase = True ) ,
{ " label " : label } ,
{ " label " : label , " amount " : reward } )
self . log . info ( " Generate 100 more blocks " )
2022-04-01 10:19:26 -03:00
self . generate ( self . nodes [ 0 ] , COINBASE_MATURITY )
2021-12-07 12:48:37 -03:00
self . log . info ( " getreceivedbyaddress returns reward with defaults " )
balance = self . nodes [ 0 ] . getreceivedbyaddress ( address )
assert_equal ( balance , reward )
self . log . info ( " getreceivedbylabel returns reward with defaults " )
balance = self . nodes [ 0 ] . getreceivedbylabel ( " label " )
assert_equal ( balance , reward )
self . log . info ( " listreceivedbyaddress includes address with defaults " )
assert_array_result ( self . nodes [ 0 ] . listreceivedbyaddress ( ) ,
{ " address " : address } ,
{ " address " : address , " amount " : reward } )
self . log . info ( " listreceivedbylabel includes label with defaults " )
assert_array_result ( self . nodes [ 0 ] . listreceivedbylabel ( ) ,
{ " label " : label } ,
{ " label " : label , " amount " : reward } )
self . log . info ( " Invalidate block that paid to address " )
self . nodes [ 0 ] . invalidateblock ( hash )
self . log . info ( " getreceivedbyaddress does not include invalidated block when minconf is 0 when including immature coinbase " )
balance = self . nodes [ 0 ] . getreceivedbyaddress ( address = address , minconf = 0 , include_immature_coinbase = True )
assert_equal ( balance , 0 )
self . log . info ( " getreceivedbylabel does not include invalidated block when minconf is 0 when including immature coinbase " )
balance = self . nodes [ 0 ] . getreceivedbylabel ( label = " label " , minconf = 0 , include_immature_coinbase = True )
assert_equal ( balance , 0 )
self . log . info ( " listreceivedbyaddress does not include invalidated block when minconf is 0 when including immature coinbase " )
assert_array_result ( self . nodes [ 0 ] . listreceivedbyaddress ( minconf = 0 , include_immature_coinbase = True ) ,
{ " address " : address } ,
{ } , True )
self . log . info ( " listreceivedbylabel does not include invalidated block when minconf is 0 when including immature coinbase " )
assert_array_result ( self . nodes [ 0 ] . listreceivedbylabel ( minconf = 0 , include_immature_coinbase = True ) ,
{ " label " : label } ,
{ } , True )
2014-03-25 10:33:44 -03:00
if __name__ == ' __main__ ' :
2024-07-16 17:05:14 -04:00
ReceivedByTest ( __file__ ) . main ( )