@@ -219,6 +219,60 @@ def run_test(self):
219
219
assert_equal (self .nodes [2 ].getbalance (), node_2_bal )
220
220
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' ]))
221
221
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
+
222
276
self .start_node (3 , self .nodes [3 ].extra_args )
223
277
connect_nodes (self .nodes [0 ], 3 )
224
278
self .sync_all ()
@@ -349,6 +403,74 @@ def run_test(self):
349
403
self .nodes [0 ].generate (1 )
350
404
self .sync_all (self .nodes [0 :3 ])
351
405
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
+
352
474
# 2. Import address from node2 to node1
353
475
self .nodes [1 ].importaddress (address_to_import )
354
476
0 commit comments