1111 assert_greater_than ,
1212 assert_greater_than_or_equal ,
1313 assert_raises_rpc_error ,
14+ get_fee ,
1415)
1516from test_framework .wallet import (
1617 COIN ,
@@ -595,12 +596,57 @@ def test_reorg_sibling_eviction_1p2c(self):
595596 )
596597 self .check_mempool ([tx_with_multi_children ["txid" ], tx_with_sibling3_rbf ["txid" ], tx_with_sibling2 ["txid" ]])
597598
599+ @cleanup (extra_args = None )
600+ def test_minrelay_in_package_combos (self ):
601+ node = self .nodes [0 ]
602+ self .log .info ("Test that only TRUC transactions can be under minrelaytxfee for various settings..." )
603+
604+ for minrelay_setting in (0 , 5 , 10 , 100 , 500 , 1000 , 5000 , 333333 , 2500000 ):
605+ self .log .info (f"-> Test -minrelaytxfee={ minrelay_setting } sat/kvB..." )
606+ setting_decimal = minrelay_setting / Decimal (COIN )
607+ self .restart_node (0 , extra_args = [f"-minrelaytxfee={ setting_decimal :.8f} " , "-persistmempool=0" ])
608+ minrelayfeerate = node .getmempoolinfo ()["minrelaytxfee" ]
609+ high_feerate = minrelayfeerate * 50
610+
611+ tx_v3_0fee_parent = self .wallet .create_self_transfer (fee = 0 , fee_rate = 0 , confirmed_only = True , version = 3 )
612+ tx_v3_child = self .wallet .create_self_transfer (utxo_to_spend = tx_v3_0fee_parent ["new_utxo" ], fee_rate = high_feerate , version = 3 )
613+ total_v3_fee = tx_v3_child ["fee" ] + tx_v3_0fee_parent ["fee" ]
614+ total_v3_size = tx_v3_child ["tx" ].get_vsize () + tx_v3_0fee_parent ["tx" ].get_vsize ()
615+ assert_greater_than_or_equal (total_v3_fee , get_fee (total_v3_size , minrelayfeerate ))
616+ if minrelayfeerate > 0 :
617+ assert_greater_than (get_fee (tx_v3_0fee_parent ["tx" ].get_vsize (), minrelayfeerate ), 0 )
618+ # Always need to pay at least 1 satoshi for entry, even if minimum feerate is very low
619+ assert_greater_than (total_v3_fee , 0 )
620+
621+ tx_v2_0fee_parent = self .wallet .create_self_transfer (fee = 0 , fee_rate = 0 , confirmed_only = True , version = 2 )
622+ tx_v2_child = self .wallet .create_self_transfer (utxo_to_spend = tx_v2_0fee_parent ["new_utxo" ], fee_rate = high_feerate , version = 2 )
623+ total_v2_fee = tx_v2_child ["fee" ] + tx_v2_0fee_parent ["fee" ]
624+ total_v2_size = tx_v2_child ["tx" ].get_vsize () + tx_v2_0fee_parent ["tx" ].get_vsize ()
625+ assert_greater_than_or_equal (total_v2_fee , get_fee (total_v2_size , minrelayfeerate ))
626+ if minrelayfeerate > 0 :
627+ assert_greater_than (get_fee (tx_v2_0fee_parent ["tx" ].get_vsize (), minrelayfeerate ), 0 )
628+ # Always need to pay at least 1 satoshi for entry, even if minimum feerate is very low
629+ assert_greater_than (total_v2_fee , 0 )
630+
631+ result_truc = node .submitpackage ([tx_v3_0fee_parent ["hex" ], tx_v3_child ["hex" ]], maxfeerate = 0 )
632+ assert_equal (result_truc ["package_msg" ], "success" )
633+
634+ result_non_truc = node .submitpackage ([tx_v2_0fee_parent ["hex" ], tx_v2_child ["hex" ]], maxfeerate = 0 )
635+ if minrelayfeerate > 0 :
636+ assert_equal (result_non_truc ["package_msg" ], "transaction failed" )
637+ min_fee_parent = int (get_fee (tx_v2_0fee_parent ["tx" ].get_vsize (), minrelayfeerate ) * COIN )
638+ assert_equal (result_non_truc ["tx-results" ][tx_v2_0fee_parent ["wtxid" ]]["error" ], f"min relay fee not met, 0 < { min_fee_parent } " )
639+ self .check_mempool ([tx_v3_0fee_parent ["txid" ], tx_v3_child ["txid" ]])
640+ else :
641+ assert_equal (result_non_truc ["package_msg" ], "success" )
642+ self .check_mempool ([tx_v2_0fee_parent ["txid" ], tx_v2_child ["txid" ], tx_v3_0fee_parent ["txid" ], tx_v3_child ["txid" ]])
643+
598644
599645 def run_test (self ):
600646 self .log .info ("Generate blocks to create UTXOs" )
601647 node = self .nodes [0 ]
602648 self .wallet = MiniWallet (node )
603- self .generate (self .wallet , 120 )
649+ self .generate (self .wallet , 200 )
604650 self .test_truc_max_vsize ()
605651 self .test_truc_acceptance ()
606652 self .test_truc_replacement ()
@@ -614,6 +660,7 @@ def run_test(self):
614660 self .test_reorg_2child_rbf ()
615661 self .test_truc_sibling_eviction ()
616662 self .test_reorg_sibling_eviction_1p2c ()
663+ self .test_minrelay_in_package_combos ()
617664
618665
619666if __name__ == "__main__" :
0 commit comments