Skip to content

Commit 0317cd5

Browse files
committed
Minor adjustment to fee rate handling in RBF fee bumping
Use user-provided fee rate for bumping transaction and return an error if it is too low, otherwise use system estimated fee rate and retry mechanism. Also adds a test for the low-fee rejection provided by user, switches the RBF test to use `random_chain_source`, and removes unnecessary sleep-based waits.
1 parent 2f5a966 commit 0317cd5

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

src/wallet/mod.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,8 @@ impl Wallet {
378378
);
379379
let payment =
380380
self.payment_store.get(&payment_id).ok_or(Error::InvalidPaymentId)?;
381-
let pending_payment_details = self
382-
.create_pending_payment_from_tx(payment.clone(), conflict_txids.clone());
381+
let pending_payment_details =
382+
self.create_pending_payment_from_tx(payment, conflict_txids.clone());
383383

384384
self.pending_payment_store.insert_or_update(pending_payment_details)?;
385385
},
@@ -1125,13 +1125,13 @@ impl Wallet {
11251125
old_fee_rate.to_sat_per_kwu() + INCREMENTAL_RELAY_FEE_SAT_PER_1000_WEIGHT as u64;
11261126

11271127
let confirmation_target = ConfirmationTarget::OnchainPayment;
1128-
let estimated_fee_rate =
1129-
fee_rate.unwrap_or_else(|| self.fee_estimator.estimate_fee_rate(confirmation_target));
1128+
let estimated_fee_rate = self.fee_estimator.estimate_fee_rate(confirmation_target);
11301129

11311130
// Use the higher of minimum RBF requirement or current network estimate
11321131
let final_fee_rate_sat_per_kwu =
11331132
min_required_fee_rate_sat_per_kwu.max(estimated_fee_rate.to_sat_per_kwu());
1134-
let final_fee_rate = FeeRate::from_sat_per_kwu(final_fee_rate_sat_per_kwu);
1133+
let final_fee_rate =
1134+
fee_rate.unwrap_or_else(|| FeeRate::from_sat_per_kwu(final_fee_rate_sat_per_kwu));
11351135

11361136
let mut psbt = {
11371137
let mut builder = locked_wallet.build_fee_bump(txid).map_err(|e| {
@@ -1156,6 +1156,17 @@ impl Wallet {
11561156
match builder.finish() {
11571157
Ok(psbt) => Ok(psbt),
11581158
Err(CreateTxError::FeeRateTooLow { required: required_fee_rate }) => {
1159+
if fee_rate.is_some() {
1160+
log_error!(
1161+
self.logger,
1162+
"Provided fee rate {} is too low for RBF fee bump of txid {}, required minimum fee rate: {}",
1163+
fee_rate.unwrap(),
1164+
txid,
1165+
required_fee_rate
1166+
);
1167+
return Err(Error::InvalidFeeRate);
1168+
}
1169+
11591170
log_info!(self.logger, "BDK requires higher fee rate: {}", required_fee_rate);
11601171

11611172
// BDK may require a higher fee rate than our estimate due to

tests/integration_tests_rust.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2466,7 +2466,7 @@ async fn persistence_backwards_compatibility() {
24662466
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
24672467
async fn onchain_fee_bump_rbf() {
24682468
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
2469-
let chain_source = TestChainSource::Esplora(&electrsd);
2469+
let chain_source = random_chain_source(&bitcoind, &electrsd);
24702470
let (node_a, node_b) = setup_two_nodes(&chain_source, false, true, false);
24712471

24722472
// Fund both nodes
@@ -2516,9 +2516,6 @@ async fn onchain_fee_bump_rbf() {
25162516
let new_txid = node_b.onchain_payment().bump_fee_rbf(payment_id, None).unwrap();
25172517
wait_for_tx(&electrsd.client, new_txid).await;
25182518

2519-
// Sleep to allow for transaction propagation
2520-
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
2521-
25222519
node_a.sync_wallets().unwrap();
25232520
node_b.sync_wallets().unwrap();
25242521

@@ -2557,9 +2554,6 @@ async fn onchain_fee_bump_rbf() {
25572554
let second_bump_txid = node_b.onchain_payment().bump_fee_rbf(payment_id, None).unwrap();
25582555
wait_for_tx(&electrsd.client, second_bump_txid).await;
25592556

2560-
// Sleep to allow for transaction propagation
2561-
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
2562-
25632557
node_a.sync_wallets().unwrap();
25642558
node_b.sync_wallets().unwrap();
25652559

0 commit comments

Comments
 (0)