@ -4,11 +4,11 @@
@@ -4,11 +4,11 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
#
# Exercise the wallet. Ported from wallet.sh.
# Exercise the wallet. Ported from wallet.sh.
# Does the following:
# a) creates 3 nodes, with an empty chain (no blocks).
# b) node0 mines a block
# c) node1 mines 101 blocks, so now nodes 0 and 1 have 50btc, node2 has none.
# c) node1 mines 101 blocks, so now nodes 0 and 1 have 50btc, node2 has none.
# d) node0 sends 21 btc to node2, in two transactions (11 btc, then 10 btc).
# e) node0 mines a block, collects the fee on the second transaction
# f) node1 mines 100 blocks, to mature node0's just-mined block
@ -75,14 +75,14 @@ class WalletTest (BitcoinTestFramework):
@@ -75,14 +75,14 @@ class WalletTest (BitcoinTestFramework):
assert_equal ( self . nodes [ 2 ] . getbalance ( ) , 21 )
# Node0 should have two unspent outputs.
# Create a couple of transactions to send them to node2, submit them through
# node1, and make sure both node0 and node2 pick them up properly:
# Create a couple of transactions to send them to node2, submit them through
# node1, and make sure both node0 and node2 pick them up properly:
node0utxos = self . nodes [ 0 ] . listunspent ( 1 )
assert_equal ( len ( node0utxos ) , 2 )
# create both transactions
txns_to_send = [ ]
for utxo in node0utxos :
for utxo in node0utxos :
inputs = [ ]
outputs = { }
inputs . append ( { " txid " : utxo [ " txid " ] , " vout " : utxo [ " vout " ] } )
@ -149,27 +149,27 @@ class WalletTest (BitcoinTestFramework):
@@ -149,27 +149,27 @@ class WalletTest (BitcoinTestFramework):
sync_mempools ( self . nodes )
assert ( txid1 in self . nodes [ 3 ] . getrawmempool ( ) )
#check if we can list zero value tx as available coins
#1. create rawtx
#2. hex-changed one output to 0.0
#2. hex-changed one output to 0.0
#3. sign and send
#4. check if recipient (node0) can list the zero value tx
usp = self . nodes [ 1 ] . listunspent ( )
inputs = [ { " txid " : usp [ 0 ] [ ' txid ' ] , " vout " : usp [ 0 ] [ ' vout ' ] } ]
outputs = { self . nodes [ 1 ] . getnewaddress ( ) : 49.998 , self . nodes [ 0 ] . getnewaddress ( ) : 11.11 }
rawTx = self . nodes [ 1 ] . createrawtransaction ( inputs , outputs ) . replace ( " c0833842 " , " 00000000 " ) #replace 11.11 with 0.0 (int32)
decRawTx = self . nodes [ 1 ] . decoderawtransaction ( rawTx )
signedRawTx = self . nodes [ 1 ] . signrawtransaction ( rawTx )
decRawTx = self . nodes [ 1 ] . decoderawtransaction ( signedRawTx [ ' hex ' ] )
zeroValueTxid = decRawTx [ ' txid ' ]
sendResp = self . nodes [ 1 ] . sendrawtransaction ( signedRawTx [ ' hex ' ] )
self . sync_all ( )
self . nodes [ 1 ] . generate ( 1 ) #mine a block
self . sync_all ( )
unspentTxs = self . nodes [ 0 ] . listunspent ( ) #zero value tx must be in listunspents output
found = False
for uTx in unspentTxs :
@ -177,7 +177,7 @@ class WalletTest (BitcoinTestFramework):
@@ -177,7 +177,7 @@ class WalletTest (BitcoinTestFramework):
found = True
assert_equal ( uTx [ ' amount ' ] , Decimal ( ' 0.00000000 ' ) ) ;
assert ( found )
#do some -walletbroadcast tests
stop_nodes ( self . nodes )
wait_bitcoinds ( )
@ -192,17 +192,17 @@ class WalletTest (BitcoinTestFramework):
@@ -192,17 +192,17 @@ class WalletTest (BitcoinTestFramework):
self . nodes [ 1 ] . generate ( 1 ) #mine a block, tx should not be in there
self . sync_all ( )
assert_equal ( self . nodes [ 2 ] . getbalance ( ) , Decimal ( ' 59.99800000 ' ) ) ; #should not be changed because tx was not broadcasted
#now broadcast from another node, mine a block, sync, and check the balance
self . nodes [ 1 ] . sendrawtransaction ( txObjNotBroadcasted [ ' hex ' ] )
self . nodes [ 1 ] . generate ( 1 )
self . sync_all ( )
txObjNotBroadcasted = self . nodes [ 0 ] . gettransaction ( txIdNotBroadcasted )
assert_equal ( self . nodes [ 2 ] . getbalance ( ) , Decimal ( ' 61.99800000 ' ) ) ; #should not be
#create another tx
txIdNotBroadcasted = self . nodes [ 0 ] . sendtoaddress ( self . nodes [ 2 ] . getnewaddress ( ) , 2 ) ;
#restart the nodes with -walletbroadcast=1
stop_nodes ( self . nodes )
wait_bitcoinds ( )
@ -211,12 +211,44 @@ class WalletTest (BitcoinTestFramework):
@@ -211,12 +211,44 @@ class WalletTest (BitcoinTestFramework):
connect_nodes_bi ( self . nodes , 1 , 2 )
connect_nodes_bi ( self . nodes , 0 , 2 )
sync_blocks ( self . nodes )
self . nodes [ 0 ] . generate ( 1 )
sync_blocks ( self . nodes )
#tx should be added to balance because after restarting the nodes tx should be broadcastet
assert_equal ( self . nodes [ 2 ] . getbalance ( ) , Decimal ( ' 63.99800000 ' ) ) ; #should not be
#send a tx with value in a string (PR#6380 +)
txId = self . nodes [ 0 ] . sendtoaddress ( self . nodes [ 2 ] . getnewaddress ( ) , " 2 " )
txObj = self . nodes [ 0 ] . gettransaction ( txId )
assert_equal ( txObj [ ' amount ' ] , Decimal ( ' -2.00000000 ' ) )
txId = self . nodes [ 0 ] . sendtoaddress ( self . nodes [ 2 ] . getnewaddress ( ) , " 0.0001 " )
txObj = self . nodes [ 0 ] . gettransaction ( txId )
assert_equal ( txObj [ ' amount ' ] , Decimal ( ' -0.00010000 ' ) )
#check if JSON parser can handle scientific notation in strings
txId = self . nodes [ 0 ] . sendtoaddress ( self . nodes [ 2 ] . getnewaddress ( ) , " 1e-4 " )
txObj = self . nodes [ 0 ] . gettransaction ( txId )
assert_equal ( txObj [ ' amount ' ] , Decimal ( ' -0.00010000 ' ) )
#this should fail
errorString = " "
try :
txId = self . nodes [ 0 ] . sendtoaddress ( self . nodes [ 2 ] . getnewaddress ( ) , " 1f-4 " )
except JSONRPCException , e :
errorString = e . error [ ' message ' ]
assert_equal ( " Invalid amount " in errorString , True ) ;
errorString = " "
try :
self . nodes [ 0 ] . generate ( " 2 " ) #use a string to as block amount parameter must fail because it's not interpreted as amount
except JSONRPCException , e :
errorString = e . error [ ' message ' ]
assert_equal ( " not an integer " in errorString , True ) ;
if __name__ == ' __main__ ' :
WalletTest ( ) . main ( )