2016-05-06 11:23:48 +02:00
#!/usr/bin/env python3
# Copyright (c) 2014-2016 The Bitcoin Core developers
2014-10-23 03:48:19 +02:00
# Distributed under the MIT software license, see the accompanying
2014-03-25 14:33:44 +01:00
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
2019-01-07 10:55:35 +01:00
""" Test the listreceivedbyaddress RPC. """
2017-11-11 18:35:32 +01:00
from decimal import Decimal
2014-03-25 14:33:44 +01:00
2015-05-02 12:53:35 +02:00
from test_framework . test_framework import BitcoinTestFramework
2018-05-24 16:09:08 +02:00
from test_framework . util import (
assert_array_result ,
assert_equal ,
assert_raises_rpc_error ,
)
2020-01-07 23:23:58 +01:00
from test_framework . wallet_util import test_address
2018-05-24 16:09:08 +02:00
2014-03-25 14:33:44 +01:00
2014-07-08 18:07:23 +02:00
class ReceivedByTest ( BitcoinTestFramework ) :
2017-09-01 18:47:13 +02:00
def set_test_params ( self ) :
self . num_nodes = 2
2017-05-02 20:02:55 +02:00
2018-09-13 12:33:15 +02:00
def skip_test_if_missing_module ( self ) :
self . skip_if_no_wallet ( )
Merge #17497: test: skip tests when utils haven't been compiled
a67352161c68fea9764cc31aff199f112d8572c6 test: skip tool_wallet test when bitcoin-wallet isn't compiled (fanquake)
e9277baed64e1d4054a102e40b39a9aed7839c2f test: skip wallet_listreceivedby test when the cli isn't compiled (fanquake)
621d398750d9f5ce3e7ec75ccb160b3534dcc436 test: skip bitcoin_cli test when the cli isn't compiled (fanquake)
Pull request description:
Don't try and run the `interface_bitcoin_cli.py` test when `bitcoin-cli` isn't available.
```bash
stdout:
2019-11-17T01:51:41.623000Z TestFramework (INFO): Initializing test directory /var/folders/z2/cn877pxd3czdfh47mfkmbwgm0000gn/T/test_runner_₿_🏃_20191116_205141/interface_bitcoin_cli_0
2019-11-17T01:51:41.890000Z TestFramework (ERROR): Unexpected exception caught during testing
Traceback (most recent call last):
File "/Users/michael/github/bitcoin/test/functional/test_framework/test_framework.py", line 111, in main
self.run_test()
File "/Users/michael/github/bitcoin/test/functional/interface_bitcoin_cli.py", line 18, in run_test
cli_response = self.nodes[0].cli("-version").send_cli()
File "/Users/michael/github/bitcoin/test/functional/test_framework/test_node.py", line 528, in send_cli
process = subprocess.Popen(p_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
File "/Users/michael/.pyenv/versions/3.5.6/lib/python3.5/subprocess.py", line 676, in __init__
restore_signals, start_new_session)
File "/Users/michael/.pyenv/versions/3.5.6/lib/python3.5/subprocess.py", line 1289, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/github/bitcoin/src/bitcoin-cli'
```
Top commit has no ACKs.
Tree-SHA512: de27513a615d9d21271a0948e012c3209351e7374efd19bfa1bb9cda77e8fffe15d99e3424e4dbfa8cf826084f8af1670726f4703bd2b6093e7d37df4bea64f0
2019-11-19 16:11:27 +01:00
self . skip_if_no_cli ( )
2018-09-13 12:33:15 +02:00
2014-10-20 14:14:04 +02:00
def run_test ( self ) :
2017-11-11 18:35:32 +01:00
# Generate block to get out of IBD
self . nodes [ 0 ] . generate ( 1 )
2020-06-21 15:17:31 +02:00
self . sync_blocks ( )
2017-11-11 18:35:32 +01:00
2018-11-02 16:41:29 +01: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-11-11 18:35:32 +01:00
self . log . info ( " listreceivedbyaddress Test " )
2014-07-08 18:07:23 +02:00
# Send from node 0 to 1
2014-10-20 14:14:04 +02:00
addr = self . nodes [ 1 ] . getnewaddress ( )
txid = self . nodes [ 0 ] . sendtoaddress ( addr , 0.1 )
self . sync_all ( )
2014-07-08 18:07:23 +02:00
2017-11-11 18:35:32 +01:00
# Check not listed in listreceivedbyaddress because has 0 confirmations
2016-04-19 13:22:11 +02:00
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( ) ,
2017-11-11 18:35:32 +01:00
{ " address " : addr } ,
{ } ,
True )
# Bury Tx under 10 block so it will be returned by listreceivedbyaddress
2015-04-01 05:28:28 +02:00
self . nodes [ 1 ] . generate ( 10 )
2014-10-20 14:14:04 +02:00
self . sync_all ( )
2016-04-19 13:22:11 +02:00
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( ) ,
2017-11-11 18:35:32 +01:00
{ " address " : addr } ,
2017-10-20 19:27:55 +02:00
{ " address " : addr , " label " : " " , " amount " : Decimal ( " 0.1 " ) , " confirmations " : 10 , " txids " : [ txid , ] } )
2017-11-11 18:35:32 +01:00
# With min confidence < 10
2016-04-19 13:22:11 +02:00
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( 5 ) ,
2017-11-11 18:35:32 +01:00
{ " address " : addr } ,
2017-10-20 19:27:55 +02:00
{ " address " : addr , " label " : " " , " amount " : Decimal ( " 0.1 " ) , " confirmations " : 10 , " txids " : [ txid , ] } )
2017-11-11 18:35:32 +01:00
# With min confidence > 10, should not find Tx
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( 11 ) , { " address " : addr } , { } , True )
2014-07-08 18:07:23 +02:00
2017-11-11 18:35:32 +01:00
# Empty Tx
2018-03-07 16:03:42 +01:00
empty_addr = self . nodes [ 1 ] . getnewaddress ( )
2017-09-20 22:34:54 +02:00
assert_array_result ( self . nodes [ 1 ] . listreceivedbyaddress ( 0 , False , True ) ,
2018-03-07 16:03:42 +01:00
{ " address " : empty_addr } ,
2017-10-20 19:27:55 +02:00
{ " address " : empty_addr , " label " : " " , " amount " : 0 , " confirmations " : 0 , " txids " : [ ] } )
2018-03-07 16:03:42 +01:00
2021-04-12 16:58:49 +02:00
# Test Address filtering
# Only on addr
expected = { " address " : addr , " label " : " " , " amount " : Decimal ( " 0.1 " ) , " confirmations " : 10 , " txids " : [ txid , ] }
2018-03-07 16:03:42 +01:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( minconf = 0 , addlocked = False , include_empty = True , include_watchonly = True , address_filter = addr )
2021-04-12 16:58:49 +02:00
assert_array_result ( res , { " address " : addr } , expected )
2018-03-07 16:03:42 +01:00
assert_equal ( len ( res ) , 1 )
2018-10-24 01:03:45 +02:00
# Test for regression on CLI calls with address string (#14173)
cli_res = self . nodes [ 1 ] . cli . listreceivedbyaddress ( 0 , True , True , True , addr )
assert_array_result ( cli_res , { " address " : addr } , expected )
assert_equal ( len ( cli_res ) , 1 )
2021-04-12 16:58:49 +02:00
# Error on invalid address
2018-03-07 16:03:42 +01:00
assert_raises_rpc_error ( - 4 , " address_filter parameter was invalid " , self . nodes [ 1 ] . listreceivedbyaddress , minconf = 0 , addlocked = True , include_empty = True , include_watchonly = True , address_filter = " bamboozling " )
2021-04-12 16:58:49 +02:00
# Another address receive money
2018-03-07 16:03:42 +01:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True , True )
2018-11-02 16:41:29 +01:00
assert_equal ( len ( res ) , 2 + num_cb_reward_addresses ) # Right now 2 entries
2018-03-07 16:03:42 +01:00
other_addr = self . nodes [ 1 ] . getnewaddress ( )
txid2 = self . nodes [ 0 ] . sendtoaddress ( other_addr , 0.1 )
self . nodes [ 0 ] . generate ( 1 )
self . sync_all ( )
2021-04-12 16:58:49 +02:00
# Same test as above should still pass
expected = { " address " : addr , " label " : " " , " amount " : Decimal ( " 0.1 " ) , " confirmations " : 11 , " txids " : [ txid , ] }
2018-03-07 16:03:42 +01:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True , True , addr )
2021-04-12 16:58:49 +02:00
assert_array_result ( res , { " address " : addr } , expected )
2018-03-07 16:03:42 +01:00
assert_equal ( len ( res ) , 1 )
2021-04-12 16:58:49 +02: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 , ] }
2018-03-07 16:03:42 +01:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True , True , other_addr )
2021-04-12 16:58:49 +02:00
assert_array_result ( res , { " address " : other_addr } , expected )
2018-03-07 16:03:42 +01:00
assert_equal ( len ( res ) , 1 )
2021-04-12 16:58:49 +02:00
# Should be two entries though without filter
2018-03-07 16:03:42 +01:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True , True )
2018-11-02 16:41:29 +01:00
assert_equal ( len ( res ) , 3 + num_cb_reward_addresses ) # Became 3 entries
2018-03-07 16:03:42 +01:00
2021-04-12 16:58:49 +02:00
# Not on random addr
other_addr = self . nodes [ 0 ] . getnewaddress ( ) # note on node[0]! just a random addr
2018-03-07 16:03:42 +01:00
res = self . nodes [ 1 ] . listreceivedbyaddress ( 0 , True , True , True , other_addr )
assert_equal ( len ( res ) , 0 )
2014-07-08 18:07:23 +02:00
2017-11-11 18:35:32 +01:00
self . log . info ( " getreceivedbyaddress Test " )
2014-07-08 18:07:23 +02:00
# Send from node 0 to 1
2014-10-20 14:14:04 +02:00
addr = self . nodes [ 1 ] . getnewaddress ( )
txid = self . nodes [ 0 ] . sendtoaddress ( addr , 0.1 )
self . sync_all ( )
2014-07-08 18:07:23 +02:00
2017-11-11 18:35:32 +01:00
# Check balance is 0 because of 0 confirmations
2014-10-20 14:14:04 +02:00
balance = self . nodes [ 1 ] . getreceivedbyaddress ( addr )
2017-11-11 18:35:32 +01:00
assert_equal ( balance , Decimal ( " 0.0 " ) )
2014-07-08 18:07:23 +02:00
2017-11-11 18:35:32 +01:00
# Check balance is 0.1
balance = self . nodes [ 1 ] . getreceivedbyaddress ( addr , 0 )
assert_equal ( balance , Decimal ( " 0.1 " ) )
2014-07-08 18:07:23 +02:00
2017-11-11 18:35:32 +01:00
# Bury Tx under 10 block so it will be returned by the default getreceivedbyaddress
2015-04-01 05:28:28 +02:00
self . nodes [ 1 ] . generate ( 10 )
2014-10-20 14:14:04 +02:00
self . sync_all ( )
balance = self . nodes [ 1 ] . getreceivedbyaddress ( addr )
2017-11-11 18:35:32 +01:00
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 )
2017-10-20 19:27:55 +02:00
self . log . info ( " listreceivedbylabel + getreceivedbylabel Test " )
2014-07-08 18:07:23 +02:00
2017-11-11 18:35:32 +01:00
# set pre-state
2018-05-11 00:08:57 +02:00
label = ' '
address = self . nodes [ 1 ] . getnewaddress ( )
2020-01-07 23:23:58 +01:00
test_address ( self . nodes [ 1 ] , address , label = label , labels = [ label ] )
2017-10-20 19:27:55 +02: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 18:07:23 +02:00
2014-10-20 14:14:04 +02:00
txid = self . nodes [ 0 ] . sendtoaddress ( addr , 0.1 )
2014-11-20 21:49:07 +01:00
self . sync_all ( )
2014-07-08 18:07:23 +02:00
2017-10-20 19:27:55 +02: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 18:07:23 +02:00
# getreceivedbyaddress should return same balance because of 0 confirmations
2017-10-20 19:27:55 +02:00
balance = self . nodes [ 1 ] . getreceivedbylabel ( label )
assert_equal ( balance , balance_by_label )
2014-07-08 18:07:23 +02:00
2015-04-01 05:28:28 +02:00
self . nodes [ 1 ] . generate ( 10 )
2014-10-20 14:14:04 +02:00
self . sync_all ( )
2017-10-20 19:27:55 +02: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 18:07:23 +02:00
2017-10-20 19:27:55 +02: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 18:07:23 +02:00
2017-10-20 19:27:55 +02:00
# Create a new label named "mynewlabel" that has a 0 balance
2018-05-11 00:08:57 +02:00
address = self . nodes [ 1 ] . getnewaddress ( )
self . nodes [ 1 ] . setlabel ( address , " mynewlabel " )
2017-10-20 19:27:55 +02:00
received_by_label_json = [ r for r in self . nodes [ 1 ] . listreceivedbylabel ( 0 , False , True ) if r [ " label " ] == " mynewlabel " ] [ 0 ]
2014-07-08 18:07:23 +02:00
2017-10-20 19:27:55 +02:00
# Test includeempty of listreceivedbylabel
assert_equal ( received_by_label_json [ " amount " ] , Decimal ( " 0.0 " ) )
2014-07-08 18:07:23 +02:00
2017-10-20 19:27:55 +02:00
# Test getreceivedbylabel for 0 amount labels
balance = self . nodes [ 1 ] . getreceivedbylabel ( " mynewlabel " )
2017-11-11 18:35:32 +01:00
assert_equal ( balance , Decimal ( " 0.0 " ) )
2014-03-25 14:33:44 +01:00
if __name__ == ' __main__ ' :
2014-07-08 18:07:23 +02:00
ReceivedByTest ( ) . main ( )