@@ -193,7 +193,52 @@ def run_test(self):
193193 res = self .nodes [1 ].walletcreatefundedpsbt (inputs , outputs , 0 , {"feeRate" : 0.1 , "add_inputs" : True })
194194 assert_approx (res ["fee" ], 0.055 , 0.005 )
195195
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" )
197242 # previously this was silently capped at -maxtxfee
198243 for bool_add , outputs_array in {True : outputs , False : [{self .nodes [1 ].getnewaddress (): 1 }]}.items ():
199244 assert_raises_rpc_error (- 4 , "Fee exceeds maximum configured by user (e.g. -maxtxfee, maxfeerate)" ,
0 commit comments