Closes #2910. Add z_listunspent RPC call.
This commit is contained in:
@@ -8,7 +8,7 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.authproxy import JSONRPCException
|
||||
from test_framework.mininode import COIN
|
||||
from test_framework.util import assert_equal, initialize_chain_clean, \
|
||||
start_nodes, connect_nodes_bi, stop_node, wait_and_assert_operationid_status
|
||||
start_nodes, connect_nodes_bi, wait_and_assert_operationid_status
|
||||
|
||||
import sys
|
||||
import time
|
||||
@@ -96,8 +96,6 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
|
||||
break
|
||||
assert_equal("failed", status)
|
||||
assert_equal("no UTXOs found for taddr from address" in errorString, True)
|
||||
stop_node(self.nodes[3], 3)
|
||||
self.nodes.pop()
|
||||
|
||||
# This send will fail because our wallet does not allow any change when protecting a coinbase utxo,
|
||||
# as it's currently not possible to specify a change address in z_sendmany.
|
||||
@@ -129,6 +127,10 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
|
||||
assert_equal("failed", status)
|
||||
assert_equal("wallet does not allow any change" in errorString, True)
|
||||
|
||||
# Add viewing key for myzaddr to Node 3
|
||||
myviewingkey = self.nodes[0].z_exportviewingkey(myzaddr)
|
||||
self.nodes[3].z_importviewingkey(myviewingkey, "no")
|
||||
|
||||
# This send will succeed. We send two coinbase utxos totalling 20.0 less a fee of 0.00010000, with no change.
|
||||
shieldvalue = Decimal('20.0') - Decimal('0.0001')
|
||||
recipients = []
|
||||
@@ -136,9 +138,43 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
|
||||
myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
|
||||
mytxid = wait_and_assert_operationid_status(self.nodes[0], myopid)
|
||||
self.sync_all()
|
||||
|
||||
# Verify that z_listunspent can return a note that has zero confirmations
|
||||
results = self.nodes[0].z_listunspent()
|
||||
assert(len(results) == 0)
|
||||
results = self.nodes[0].z_listunspent(0) # set minconf to zero
|
||||
assert(len(results) == 1)
|
||||
assert_equal(results[0]["address"], myzaddr)
|
||||
assert_equal(results[0]["amount"], shieldvalue)
|
||||
assert_equal(results[0]["confirmations"], 0)
|
||||
|
||||
# Mine the tx
|
||||
self.nodes[1].generate(1)
|
||||
self.sync_all()
|
||||
|
||||
# Verify that z_listunspent returns one note which has been confirmed
|
||||
results = self.nodes[0].z_listunspent()
|
||||
assert(len(results) == 1)
|
||||
assert_equal(results[0]["address"], myzaddr)
|
||||
assert_equal(results[0]["amount"], shieldvalue)
|
||||
assert_equal(results[0]["confirmations"], 1)
|
||||
assert_equal(results[0]["spendable"], True)
|
||||
|
||||
# Verify that z_listunspent returns note for watchonly address on node 3.
|
||||
results = self.nodes[3].z_listunspent(1, 999, True)
|
||||
assert(len(results) == 1)
|
||||
assert_equal(results[0]["address"], myzaddr)
|
||||
assert_equal(results[0]["amount"], shieldvalue)
|
||||
assert_equal(results[0]["confirmations"], 1)
|
||||
assert_equal(results[0]["spendable"], False)
|
||||
|
||||
# Verify that z_listunspent returns error when address spending key from node 0 is not available in wallet of node 1.
|
||||
try:
|
||||
results = self.nodes[1].z_listunspent(1, 999, False, [myzaddr])
|
||||
except JSONRPCException as e:
|
||||
errorString = e.error['message']
|
||||
assert_equal("Invalid parameter, spending key for address does not belong to wallet" in errorString, True)
|
||||
|
||||
# Verify that debug=zrpcunsafe logs params, and that full txid is associated with opid
|
||||
logpath = self.options.tmpdir+"/node0/regtest/debug.log"
|
||||
logcounter = 0
|
||||
@@ -333,13 +369,22 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
|
||||
self.nodes[1].generate(1)
|
||||
self.sync_all()
|
||||
|
||||
# check balances
|
||||
# check balances and unspent notes
|
||||
resp = self.nodes[2].z_gettotalbalance()
|
||||
assert_equal(Decimal(resp["private"]), send_amount)
|
||||
|
||||
notes = self.nodes[2].z_listunspent()
|
||||
sum_of_notes = sum([note["amount"] for note in notes])
|
||||
assert_equal(Decimal(resp["private"]), sum_of_notes)
|
||||
|
||||
resp = self.nodes[0].z_getbalance(myzaddr)
|
||||
assert_equal(Decimal(resp), zbalance - custom_fee - send_amount)
|
||||
sproutvalue -= custom_fee
|
||||
check_value_pool(self.nodes[0], 'sprout', sproutvalue)
|
||||
|
||||
notes = self.nodes[0].z_listunspent(1, 99999, False, [myzaddr])
|
||||
sum_of_notes = sum([note["amount"] for note in notes])
|
||||
assert_equal(Decimal(resp), sum_of_notes)
|
||||
|
||||
if __name__ == '__main__':
|
||||
WalletProtectCoinbaseTest().main()
|
||||
|
||||
Reference in New Issue
Block a user