@ -14,6 +14,16 @@ import time
import timeit
from decimal import Decimal
def check_value_pool ( node , name , total ) :
value_pools = node . getblockchaininfo ( ) [ ' valuePools ' ]
found = False
for pool in value_pools :
if pool [ ' id ' ] == name :
found = True
assert_equal ( pool [ ' monitored ' ] , True )
assert_equal ( pool [ ' chainValue ' ] , total )
assert ( found )
class WalletProtectCoinbaseTest ( BitcoinTestFramework ) :
def setup_chain ( self ) :
@ -76,6 +86,11 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
assert_equal ( self . nodes [ 2 ] . getbalance ( ) , 0 )
assert_equal ( self . nodes [ 3 ] . getbalance ( ) , 0 )
check_value_pool ( self . nodes [ 0 ] , ' sprout ' , 0 )
check_value_pool ( self . nodes [ 1 ] , ' sprout ' , 0 )
check_value_pool ( self . nodes [ 2 ] , ' sprout ' , 0 )
check_value_pool ( self . nodes [ 3 ] , ' sprout ' , 0 )
# Send will fail because we are enforcing the consensus rule that
# coinbase utxos can only be sent to a zaddr.
errorString = " "
@ -141,8 +156,9 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
assert_equal ( " wallet does not allow any change " in errorString , True )
# 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 = [ ]
recipients . append ( { " address " : myzaddr , " amount " : Decimal ( ' 20.0 ' ) - Decimal ( ' 0.0001 ' ) } )
recipients . append ( { " address " : myzaddr , " amount " : shieldvalue } )
myopid = self . nodes [ 0 ] . z_sendmany ( mytaddr , recipients )
mytxid = self . wait_and_assert_operationid_status ( myopid )
self . sync_all ( )
@ -169,6 +185,10 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
assert_equal ( Decimal ( resp [ " private " ] ) , Decimal ( ' 19.9999 ' ) )
assert_equal ( Decimal ( resp [ " total " ] ) , Decimal ( ' 39.9999 ' ) )
# The Sprout value pool should reflect the send
sproutvalue = shieldvalue
check_value_pool ( self . nodes [ 0 ] , ' sprout ' , sproutvalue )
# A custom fee of 0 is okay. Here the node will send the note value back to itself.
recipients = [ ]
recipients . append ( { " address " : myzaddr , " amount " : Decimal ( ' 19.9999 ' ) } )
@ -182,9 +202,13 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
assert_equal ( Decimal ( resp [ " private " ] ) , Decimal ( ' 19.9999 ' ) )
assert_equal ( Decimal ( resp [ " total " ] ) , Decimal ( ' 39.9999 ' ) )
# The Sprout value pool should be unchanged
check_value_pool ( self . nodes [ 0 ] , ' sprout ' , sproutvalue )
# convert note to transparent funds
unshieldvalue = Decimal ( ' 10.0 ' )
recipients = [ ]
recipients . append ( { " address " : mytaddr , " amount " : Decimal ( ' 10.0 ' ) } )
recipients . append ( { " address " : mytaddr , " amount " : unshieldvalue } )
myopid = self . nodes [ 0 ] . z_sendmany ( myzaddr , recipients )
mytxid = self . wait_and_assert_operationid_status ( myopid )
assert ( mytxid is not None )
@ -198,10 +222,12 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
self . sync_all ( )
# check balances
sproutvalue - = unshieldvalue + Decimal ( ' 0.0001 ' )
resp = self . nodes [ 0 ] . z_gettotalbalance ( )
assert_equal ( Decimal ( resp [ " transparent " ] ) , Decimal ( ' 30.0 ' ) )
assert_equal ( Decimal ( resp [ " private " ] ) , Decimal ( ' 9.9998 ' ) )
assert_equal ( Decimal ( resp [ " total " ] ) , Decimal ( ' 39.9998 ' ) )
check_value_pool ( self . nodes [ 0 ] , ' sprout ' , sproutvalue )
# z_sendmany will return an error if there is transparent change output considered dust.
# UTXO selection in z_sendmany sorts in ascending order, so smallest utxos are consumed first.
@ -277,7 +303,9 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
# check balance
node2balance = amount_per_recipient * num_t_recipients
sproutvalue - = node2balance + Decimal ( ' 0.0001 ' )
assert_equal ( self . nodes [ 2 ] . getbalance ( ) , node2balance )
check_value_pool ( self . nodes [ 0 ] , ' sprout ' , sproutvalue )
# Send will fail because fee is negative
try :
@ -336,6 +364,8 @@ class WalletProtectCoinbaseTest (BitcoinTestFramework):
assert_equal ( Decimal ( resp [ " private " ] ) , send_amount )
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 )
if __name__ == ' __main__ ' :
WalletProtectCoinbaseTest ( ) . main ( )