@@ -219,6 +219,60 @@ def run_test(self):
219219 assert_equal (self .nodes [2 ].getbalance (), node_2_bal )
220220 node_0_bal = self .check_fee_amount (self .nodes [0 ].getbalance (), node_0_bal + Decimal ('10' ), fee_per_byte , self .get_vsize (self .nodes [2 ].gettransaction (txid )['hex' ]))
221221
222+ # Sendmany with explicit fee (BTC/kB)
223+ # Throw if no conf_target provided
224+ assert_raises_rpc_error (- 8 , "Selected estimate_mode requires a fee rate" ,
225+ self .nodes [2 ].sendmany ,
226+ amounts = { address : 10 },
227+ estimate_mode = 'bTc/kB' )
228+ # Throw if negative feerate
229+ assert_raises_rpc_error (- 3 , "Amount out of range" ,
230+ self .nodes [2 ].sendmany ,
231+ amounts = { address : 10 },
232+ conf_target = - 1 ,
233+ estimate_mode = 'bTc/kB' )
234+ fee_per_kb = 0.0002500
235+ explicit_fee_per_byte = Decimal (fee_per_kb ) / 1000
236+ txid = self .nodes [2 ].sendmany (
237+ amounts = { address : 10 },
238+ conf_target = fee_per_kb ,
239+ estimate_mode = 'bTc/kB' ,
240+ )
241+ self .nodes [2 ].generate (1 )
242+ self .sync_all (self .nodes [0 :3 ])
243+ node_2_bal = self .check_fee_amount (self .nodes [2 ].getbalance (), node_2_bal - Decimal ('10' ), explicit_fee_per_byte , self .get_vsize (self .nodes [2 ].gettransaction (txid )['hex' ]))
244+ assert_equal (self .nodes [2 ].getbalance (), node_2_bal )
245+ node_0_bal += Decimal ('10' )
246+ assert_equal (self .nodes [0 ].getbalance (), node_0_bal )
247+
248+ # Sendmany with explicit fee (SAT/B)
249+ # Throw if no conf_target provided
250+ assert_raises_rpc_error (- 8 , "Selected estimate_mode requires a fee rate" ,
251+ self .nodes [2 ].sendmany ,
252+ amounts = { address : 10 },
253+ estimate_mode = 'sat/b' )
254+ # Throw if negative feerate
255+ assert_raises_rpc_error (- 3 , "Amount out of range" ,
256+ self .nodes [2 ].sendmany ,
257+ amounts = { address : 10 },
258+ conf_target = - 1 ,
259+ estimate_mode = 'sat/b' )
260+ fee_sat_per_b = 2
261+ fee_per_kb = fee_sat_per_b / 100000.0
262+ explicit_fee_per_byte = Decimal (fee_per_kb ) / 1000
263+ txid = self .nodes [2 ].sendmany (
264+ amounts = { address : 10 },
265+ conf_target = fee_sat_per_b ,
266+ estimate_mode = 'sAT/b' ,
267+ )
268+ self .nodes [2 ].generate (1 )
269+ self .sync_all (self .nodes [0 :3 ])
270+ balance = self .nodes [2 ].getbalance ()
271+ node_2_bal = self .check_fee_amount (balance , node_2_bal - Decimal ('10' ), explicit_fee_per_byte , self .get_vsize (self .nodes [2 ].gettransaction (txid )['hex' ]))
272+ assert_equal (balance , node_2_bal )
273+ node_0_bal += Decimal ('10' )
274+ assert_equal (self .nodes [0 ].getbalance (), node_0_bal )
275+
222276 self .start_node (3 , self .nodes [3 ].extra_args )
223277 connect_nodes (self .nodes [0 ], 3 )
224278 self .sync_all ()
@@ -349,6 +403,74 @@ def run_test(self):
349403 self .nodes [0 ].generate (1 )
350404 self .sync_all (self .nodes [0 :3 ])
351405
406+ # send with explicit btc/kb fee
407+ self .log .info ("test explicit fee (sendtoaddress as btc/kb)" )
408+ self .nodes [0 ].generate (1 )
409+ self .sync_all (self .nodes [0 :3 ])
410+ prebalance = self .nodes [2 ].getbalance ()
411+ assert prebalance > 2
412+ address = self .nodes [1 ].getnewaddress ()
413+ # Throw if no conf_target provided
414+ assert_raises_rpc_error (- 8 , "Selected estimate_mode requires a fee rate" ,
415+ self .nodes [2 ].sendtoaddress ,
416+ address = address ,
417+ amount = 1.0 ,
418+ estimate_mode = 'BTc/Kb' )
419+ # Throw if negative feerate
420+ assert_raises_rpc_error (- 3 , "Amount out of range" ,
421+ self .nodes [2 ].sendtoaddress ,
422+ address = address ,
423+ amount = 1.0 ,
424+ conf_target = - 1 ,
425+ estimate_mode = 'btc/kb' )
426+ txid = self .nodes [2 ].sendtoaddress (
427+ address = address ,
428+ amount = 1.0 ,
429+ conf_target = 0.00002500 ,
430+ estimate_mode = 'btc/kb' ,
431+ )
432+ tx_size = self .get_vsize (self .nodes [2 ].gettransaction (txid )['hex' ])
433+ self .sync_all (self .nodes [0 :3 ])
434+ self .nodes [0 ].generate (1 )
435+ self .sync_all (self .nodes [0 :3 ])
436+ postbalance = self .nodes [2 ].getbalance ()
437+ fee = prebalance - postbalance - Decimal ('1' )
438+ assert_fee_amount (fee , tx_size , Decimal ('0.00002500' ))
439+
440+ # send with explicit sat/b fee
441+ self .sync_all (self .nodes [0 :3 ])
442+ self .log .info ("test explicit fee (sendtoaddress as sat/b)" )
443+ self .nodes [0 ].generate (1 )
444+ prebalance = self .nodes [2 ].getbalance ()
445+ assert prebalance > 2
446+ address = self .nodes [1 ].getnewaddress ()
447+ # Throw if no conf_target provided
448+ assert_raises_rpc_error (- 8 , "Selected estimate_mode requires a fee rate" ,
449+ self .nodes [2 ].sendtoaddress ,
450+ address = address ,
451+ amount = 1.0 ,
452+ estimate_mode = 'SAT/b' )
453+ # Throw if negative feerate
454+ assert_raises_rpc_error (- 3 , "Amount out of range" ,
455+ self .nodes [2 ].sendtoaddress ,
456+ address = address ,
457+ amount = 1.0 ,
458+ conf_target = - 1 ,
459+ estimate_mode = 'SAT/b' )
460+ txid = self .nodes [2 ].sendtoaddress (
461+ address = address ,
462+ amount = 1.0 ,
463+ conf_target = 2 ,
464+ estimate_mode = 'SAT/B' ,
465+ )
466+ tx_size = self .get_vsize (self .nodes [2 ].gettransaction (txid )['hex' ])
467+ self .sync_all (self .nodes [0 :3 ])
468+ self .nodes [0 ].generate (1 )
469+ self .sync_all (self .nodes [0 :3 ])
470+ postbalance = self .nodes [2 ].getbalance ()
471+ fee = prebalance - postbalance - Decimal ('1' )
472+ assert_fee_amount (fee , tx_size , Decimal ('0.00002000' ))
473+
352474 # 2. Import address from node2 to node1
353475 self .nodes [1 ].importaddress (address_to_import )
354476
0 commit comments