@@ -168,23 +168,35 @@ def test_package_rbf_additional_fees(self):
168168 self .assert_mempool_contents (expected = package_txns1 )
169169
170170 self .log .info ("Check replacement pays for incremental bandwidth" )
171- package_hex3 , package_txns3 = self .create_simple_package (coin , parent_fee = DEFAULT_FEE , child_fee = DEFAULT_CHILD_FEE )
172- pkg_results3 = node .submitpackage (package_hex3 )
173- assert_equal (f"package RBF failed: insufficient anti-DoS fees, rejecting replacement { package_txns3 [1 ].rehash ()} , not enough additional fees to relay; 0.00 < 0.00000{ sum ([tx .get_vsize () for tx in package_txns3 ])} " , pkg_results3 ["package_msg" ])
174-
171+ _ , placeholder_txns3 = self .create_simple_package (coin )
172+ package_3_size = sum ([tx .get_vsize () for tx in placeholder_txns3 ])
173+ incremental_sats_required = Decimal (package_3_size ) / COIN
174+ incremental_sats_short = incremental_sats_required - Decimal ("0.00000001" )
175+ # Recreate the package with slightly higher fee once we know the size of the new package, but still short of required fee
176+ failure_package_hex3 , failure_package_txns3 = self .create_simple_package (coin , parent_fee = DEFAULT_FEE , child_fee = DEFAULT_CHILD_FEE + incremental_sats_short )
177+ assert_equal (package_3_size , sum ([tx .get_vsize () for tx in failure_package_txns3 ]))
178+ pkg_results3 = node .submitpackage (failure_package_hex3 )
179+ assert_equal (f"package RBF failed: insufficient anti-DoS fees, rejecting replacement { failure_package_txns3 [1 ].rehash ()} , not enough additional fees to relay; { incremental_sats_short } < { incremental_sats_required } " , pkg_results3 ["package_msg" ])
175180 self .assert_mempool_contents (expected = package_txns1 )
181+
182+ success_package_hex3 , success_package_txns3 = self .create_simple_package (coin , parent_fee = DEFAULT_FEE , child_fee = DEFAULT_CHILD_FEE + incremental_sats_required )
183+ node .submitpackage (success_package_hex3 )
184+ self .assert_mempool_contents (expected = success_package_txns3 )
176185 self .generate (node , 1 )
177186
178187 self .log .info ("Check Package RBF must have strict cpfp structure" )
179188 coin = self .coins .pop ()
180189 package_hex4 , package_txns4 = self .create_simple_package (coin , parent_fee = DEFAULT_FEE , child_fee = DEFAULT_CHILD_FEE )
181190 node .submitpackage (package_hex4 )
182191 self .assert_mempool_contents (expected = package_txns4 )
183- package_hex5 , package_txns5 = self .create_simple_package (coin , parent_fee = DEFAULT_CHILD_FEE , child_fee = DEFAULT_CHILD_FEE - Decimal ( "0.00000001" ) )
192+ package_hex5 , package_txns5 = self .create_simple_package (coin , parent_fee = DEFAULT_CHILD_FEE , child_fee = DEFAULT_CHILD_FEE )
184193 pkg_results5 = node .submitpackage (package_hex5 )
185- assert 'package RBF failed: package feerate is less than parent feerate' in pkg_results5 ["package_msg" ]
186-
194+ assert 'package RBF failed: package feerate is less than or equal to parent feerate' in pkg_results5 ["package_msg" ]
187195 self .assert_mempool_contents (expected = package_txns4 )
196+
197+ package_hex5_1 , package_txns5_1 = self .create_simple_package (coin , parent_fee = DEFAULT_CHILD_FEE , child_fee = DEFAULT_CHILD_FEE + Decimal ("0.00000001" ))
198+ node .submitpackage (package_hex5_1 )
199+ self .assert_mempool_contents (expected = package_txns5_1 )
188200 self .generate (node , 1 )
189201
190202 def test_package_rbf_max_conflicts (self ):
0 commit comments