use bitcoin::FeeRate;
use log::warn;
use crate::Wallet;
use crate::exit::{Exit, ExitProgressStatus};
use crate::onchain::{CpfpError, ExitUnilaterally, MakeCpfpFees};
impl Exit {
pub async fn progress_exits_with_bdk(
&self,
wallet: &Wallet,
onchain: &mut dyn ExitUnilaterally,
fee_rate_override: Option<FeeRate>,
) -> anyhow::Result<Option<Vec<ExitProgressStatus>>> {
self.progress_exits(wallet).await?;
let fee_rate = fee_rate_override.unwrap_or(wallet.chain().fee_rates().await.fast);
for req in self.exits_needing_cpfp().await {
let fees = match req.rbf_requirement {
None => MakeCpfpFees::Effective(fee_rate),
Some(rbf) => {
if fee_rate <= rbf.min_fee_rate {
warn!(
"Skipping exit CPFP RBF: requested fee rate {} is not above current package rate {}",
fee_rate, rbf.min_fee_rate,
);
continue;
}
MakeCpfpFees::Rbf {
min_effective_fee_rate: fee_rate,
current_package_fee: rbf.current_package_fee,
}
},
};
let child_tx = match onchain.make_signed_p2a_cpfp(&req.exit_tx, fees) {
Ok(tx) => tx,
Err(CpfpError::InsufficientConfirmedFunds { needed, available }) => {
warn!("Insufficient funds for exit CPFP: needed {} available {}", needed, available);
continue;
},
Err(e) => return Err(e.into()),
};
onchain.store_signed_p2a_cpfp(&child_tx).await?;
let exit_txid = req.exit_tx.compute_txid();
self.provide_cpfp_tx(wallet, exit_txid, child_tx).await?;
}
self.progress_exits(wallet).await
}
}