11
11
assert_greater_than ,
12
12
assert_greater_than_or_equal ,
13
13
assert_raises_rpc_error ,
14
+ get_fee ,
14
15
)
15
16
from test_framework .wallet import (
16
17
COIN ,
@@ -595,12 +596,57 @@ def test_reorg_sibling_eviction_1p2c(self):
595
596
)
596
597
self .check_mempool ([tx_with_multi_children ["txid" ], tx_with_sibling3_rbf ["txid" ], tx_with_sibling2 ["txid" ]])
597
598
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
+
598
644
599
645
def run_test (self ):
600
646
self .log .info ("Generate blocks to create UTXOs" )
601
647
node = self .nodes [0 ]
602
648
self .wallet = MiniWallet (node )
603
- self .generate (self .wallet , 120 )
649
+ self .generate (self .wallet , 200 )
604
650
self .test_truc_max_vsize ()
605
651
self .test_truc_acceptance ()
606
652
self .test_truc_replacement ()
@@ -614,6 +660,7 @@ def run_test(self):
614
660
self .test_reorg_2child_rbf ()
615
661
self .test_truc_sibling_eviction ()
616
662
self .test_reorg_sibling_eviction_1p2c ()
663
+ self .test_minrelay_in_package_combos ()
617
664
618
665
619
666
if __name__ == "__main__" :
0 commit comments