From c568511e8ced011103ef6e3616409fa0ac54408c Mon Sep 17 00:00:00 2001 From: glozow Date: Thu, 14 Aug 2025 15:34:35 -0400 Subject: [PATCH] test fixup for incremental feerate Clarify that the purpose of some parameters are to ensure identical transactions are not created. Also, strengthen the test to catch these cases. --- test/functional/feature_rbf.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/test/functional/feature_rbf.py b/test/functional/feature_rbf.py index 86fe2f5b65b..6922b5e0f40 100755 --- a/test/functional/feature_rbf.py +++ b/test/functional/feature_rbf.py @@ -13,7 +13,6 @@ from test_framework.messages import ( from test_framework.test_framework import BitcoinTestFramework from test_framework.util import ( assert_equal, - assert_greater_than, assert_greater_than_or_equal, assert_raises_rpc_error, get_fee, @@ -603,23 +602,27 @@ class ReplaceByFeeTest(BitcoinTestFramework): low_feerate = min_relay_feerate * 2 confirmed_utxo = self.wallet.get_utxo(confirmed_only=True) - replacee_tx = self.wallet.create_self_transfer(utxo_to_spend=confirmed_utxo, fee_rate=low_feerate, target_vsize=5000) + # Use different versions to avoid creating an identical transaction when failed_replacement_tx is created. + # Use a target vsize that is small, but something larger than the minimum so that we can create a transaction that is 1vB smaller later. + replacee_tx = self.wallet.create_self_transfer(utxo_to_spend=confirmed_utxo, fee_rate=low_feerate, version=3, target_vsize=200) node.sendrawtransaction(replacee_tx['hex']) - replacement_placeholder_tx = self.wallet.create_self_transfer(utxo_to_spend=confirmed_utxo) + replacement_placeholder_tx = self.wallet.create_self_transfer(utxo_to_spend=confirmed_utxo, target_vsize=200) replacement_expected_size = replacement_placeholder_tx['tx'].get_vsize() replacement_required_fee = get_fee(replacement_expected_size, incremental_setting_decimal) + replacee_tx['fee'] - # Should always be required to pay additional fees - if incremental_setting > 0: - assert_greater_than(replacement_required_fee, replacee_tx['fee']) - - # 1 satoshi shy of the required fee - failed_replacement_tx = self.wallet.create_self_transfer(utxo_to_spend=confirmed_utxo, fee=replacement_required_fee - Decimal("0.00000001")) + # Show that replacement fails when paying 1 satoshi shy of the required fee + failed_replacement_tx = self.wallet.create_self_transfer(utxo_to_spend=confirmed_utxo, fee=replacement_required_fee - Decimal("0.00000001"), version=2, target_vsize=200) assert_raises_rpc_error(-26, "insufficient fee", node.sendrawtransaction, failed_replacement_tx['hex']) + replacement_tx = self.wallet.create_self_transfer(utxo_to_spend=confirmed_utxo, fee=replacement_required_fee, version=2, target_vsize=200) - replacement_tx = self.wallet.create_self_transfer(utxo_to_spend=confirmed_utxo, fee=replacement_required_fee) - node.sendrawtransaction(replacement_tx['hex']) + if incremental_setting == 0: + # When incremental relay feerate is 0, additional fees are not required, but higher feerate is still required. + assert_raises_rpc_error(-26, "insufficient fee", node.sendrawtransaction, replacement_tx['hex']) + replacement_tx_smaller = self.wallet.create_self_transfer(utxo_to_spend=confirmed_utxo, fee=replacement_required_fee, version=2, target_vsize=199) + node.sendrawtransaction(replacement_tx_smaller['hex']) + else: + node.sendrawtransaction(replacement_tx['hex']) def test_fullrbf(self): # BIP125 signaling is not respected