Skip to content

Commit

Permalink
Fix mempool space inf loop bug (#1330)
Browse files Browse the repository at this point in the history
* Fix bug

* Fix tech debt
  • Loading branch information
ercecan authored Oct 14, 2024
1 parent 4d1eadb commit e97ead6
Showing 1 changed file with 17 additions and 15 deletions.
32 changes: 17 additions & 15 deletions crates/bitcoin-da/src/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use std::collections::HashSet;
use std::path::PathBuf;
use std::sync::Arc;

use anyhow::{bail, Context, Result};
use anyhow::{anyhow, bail, Context, Result};
use async_trait::async_trait;
use backoff::future::retry as retry_backoff;
use backoff::ExponentialBackoff;
Expand Down Expand Up @@ -560,9 +560,12 @@ impl BitcoinService {
#[instrument(level = "trace", skip_all, ret)]
pub async fn get_fee_rate_as_sat_vb(&self) -> Result<u64, anyhow::Error> {
// If network is regtest or signet, mempool space is not available
let smart_fee = match get_fee_rate_from_mempool_space(self.network).await? {
Some(fee_rate) => Some(fee_rate),
None => self.client.estimate_smart_fee(1, None).await?.fee_rate,
let smart_fee = match get_fee_rate_from_mempool_space(self.network).await {
Ok(fee_rate) => Some(fee_rate),
Err(e) => {
tracing::warn!(?e, "Failed to get fee rate from mempool.space");
self.client.estimate_smart_fee(1, None).await?.fee_rate
}
};
let sat_vkb = smart_fee.map_or(1000, |rate| rate.to_sat());

Expand Down Expand Up @@ -999,9 +1002,7 @@ fn calculate_witness_root(txdata: &[TransactionWrapper]) -> [u8; 32] {
BitcoinMerkleTree::new(hashes).root()
}

pub(crate) async fn get_fee_rate_from_mempool_space(
network: bitcoin::Network,
) -> Result<Option<Amount>> {
pub(crate) async fn get_fee_rate_from_mempool_space(network: bitcoin::Network) -> Result<Amount> {
let url = match network {
bitcoin::Network::Bitcoin => format!(
// Mainnet
Expand All @@ -1012,15 +1013,20 @@ pub(crate) async fn get_fee_rate_from_mempool_space(
"{}testnet4/{}",
MEMPOOL_SPACE_URL, MEMPOOL_SPACE_RECOMMENDED_FEE_ENDPOINT
),
_ => return Ok(None),
_ => {
return Err(anyhow!(
"Unsupported network for mempool space fee estimation"
))
}
};
let fee_rate = reqwest::get(url)
.await?
.json::<serde_json::Value>()
.await?
.get("fastestFee")
.and_then(|fee| fee.as_u64())
.map(|fee| Amount::from_sat(fee * 1000)); // multiply by 1000 to convert to sat/vkb
.map(|fee| Amount::from_sat(fee * 1000)) // multiply by 1000 to convert to sat/vkb
.ok_or(anyhow!("Failed to get fee rate from mempool space"))?;

Ok(fee_rate)
}
Expand Down Expand Up @@ -1503,19 +1509,15 @@ mod tests {
async fn test_mempool_space_fee_rate() {
let _fee_rate = get_fee_rate_from_mempool_space(bitcoin::Network::Bitcoin)
.await
.unwrap()
.unwrap();
let _fee_rate = get_fee_rate_from_mempool_space(bitcoin::Network::Testnet)
.await
.unwrap()
.unwrap();
assert!(get_fee_rate_from_mempool_space(bitcoin::Network::Regtest)
.await
.unwrap()
.is_none());
.is_err());
assert!(get_fee_rate_from_mempool_space(bitcoin::Network::Signet)
.await
.unwrap()
.is_none());
.is_err());
}
}

0 comments on commit e97ead6

Please sign in to comment.