@@ -193,7 +193,52 @@ def run_test(self):
193
193
res = self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"feeRate" : 0.1 , "add_inputs" : True })
194
194
assert_approx (res ["fee" ], 0.055 , 0.005 )
195
195
196
- self .log .info ("Test walletcreatefundedpsbt feeRate of 10 BTC/KB produces total fee well above -maxtxfee and raises RPC error" )
196
+ self .log .info ("Test walletcreatefundedpsbt explicit fee rate with conf_target and estimate_mode" )
197
+ for unit , fee_rate in {"btc/kb" : 0.1 , "sat/b" : 10000 }.items ():
198
+ fee = self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"conf_target" : fee_rate , "estimate_mode" : unit , "add_inputs" : True })["fee" ]
199
+ self .log .info ("- conf_target {}, estimate_mode {} produces fee {} at or slightly below -maxtxfee (~0.05290000)" .format (fee_rate , unit , fee ))
200
+ assert_approx (fee , vexp = 0.055 , vspan = 0.005 )
201
+
202
+ for field , fee_rate in {"conf_target" : 0.1 , "estimate_mode" : "sat/b" }.items ():
203
+ self .log .info ("- raises RPC error if both feeRate and {} are passed" .format (field ))
204
+ assert_raises_rpc_error (- 8 , "Cannot specify both {} and feeRate" .format (field ),
205
+ lambda : self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"feeRate" : 0.1 , field : fee_rate , "add_inputs" : True }))
206
+
207
+ self .log .info ("- raises RPC error with invalid estimate_mode settings" )
208
+ for k , v in {"number" : 42 , "object" : {"foo" : "bar" }}.items ():
209
+ assert_raises_rpc_error (- 3 , "Expected type string for estimate_mode, got {}" .format (k ),
210
+ lambda : self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"estimate_mode" : v , "conf_target" : 0.1 , "add_inputs" : True }))
211
+ for mode in ["foo" , Decimal ("3.141592" )]:
212
+ assert_raises_rpc_error (- 8 , "Invalid estimate_mode parameter" ,
213
+ lambda : self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"estimate_mode" : mode , "conf_target" : 0.1 , "add_inputs" : True }))
214
+
215
+ self .log .info ("- raises RPC error if estimate_mode is passed without a conf_target" )
216
+ for unit in ["SAT/B" , "BTC/KB" ]:
217
+ assert_raises_rpc_error (- 8 , "Selected estimate_mode {} requires a fee rate to be specified in conf_target" .format (unit ),
218
+ lambda : self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"estimate_mode" : unit }))
219
+
220
+ self .log .info ("- raises RPC error with invalid conf_target settings" )
221
+ for mode in ["unset" , "economical" , "conservative" , "btc/kb" , "sat/b" ]:
222
+ self .log .debug ("{}" .format (mode ))
223
+ for k , v in {"string" : "" , "object" : {"foo" : "bar" }}.items ():
224
+ assert_raises_rpc_error (- 3 , "Expected type number for conf_target, got {}" .format (k ),
225
+ lambda : self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"estimate_mode" : mode , "conf_target" : v , "add_inputs" : True }))
226
+ if mode in ["btc/kb" , "sat/b" ]:
227
+ assert_raises_rpc_error (- 3 , "Amount out of range" ,
228
+ lambda : self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"estimate_mode" : mode , "conf_target" : - 1 , "add_inputs" : True }))
229
+ assert_raises_rpc_error (- 4 , "Fee rate (0.00000000 BTC/kB) is lower than the minimum fee rate setting (0.00001000 BTC/kB)" ,
230
+ lambda : self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"estimate_mode" : mode , "conf_target" : 0 , "add_inputs" : True }))
231
+ else :
232
+ for n in [- 1 , 0 , 1009 ]:
233
+ assert_raises_rpc_error (- 8 , "Invalid conf_target, must be between 1 and 1008" ,
234
+ lambda : self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"estimate_mode" : mode , "conf_target" : n , "add_inputs" : True }))
235
+
236
+ for unit , fee_rate in {"SAT/B" : 0.99999999 , "BTC/KB" : 0.00000999 }.items ():
237
+ self .log .info ("- raises RPC error 'fee rate too low' if conf_target {} and estimate_mode {} are passed" .format (fee_rate , unit ))
238
+ assert_raises_rpc_error (- 4 , "Fee rate (0.00000999 BTC/kB) is lower than the minimum fee rate setting (0.00001000 BTC/kB)" ,
239
+ lambda : self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"estimate_mode" : unit , "conf_target" : fee_rate , "add_inputs" : True }))
240
+
241
+ self .log .info ("Test walletcreatefundedpsbt feeRate of 10 BTC/kB produces total fee well above -maxtxfee and raises RPC error" )
197
242
# previously this was silently capped at -maxtxfee
198
243
for bool_add , outputs_array in {True : outputs , False : [{self .nodes [1 ].getnewaddress (): 1 }]}.items ():
199
244
assert_raises_rpc_error (- 4 , "Fee exceeds maximum configured by user (e.g. -maxtxfee, maxfeerate)" ,
0 commit comments