Skip to main content

smplx_sdk/provider/
core.rs

1use std::collections::HashMap;
2
3use simplicityhl::elements::{Address, OutPoint, Script, Transaction, TxOut, Txid};
4
5use crate::provider::SimplicityNetwork;
6
7use super::error::ProviderError;
8
9pub const DEFAULT_FEE_RATE: f32 = 100.0;
10pub const DEFAULT_ESPLORA_TIMEOUT_SECS: u64 = 10;
11
12pub trait ProviderTrait {
13    fn get_network(&self) -> &SimplicityNetwork;
14
15    fn broadcast_transaction(&self, tx: &Transaction) -> Result<Txid, ProviderError>;
16
17    fn wait(&self, txid: &Txid) -> Result<(), ProviderError>;
18
19    fn fetch_tip_height(&self) -> Result<u32, ProviderError>;
20
21    fn fetch_tip_timestamp(&self) -> Result<u64, ProviderError>;
22
23    fn fetch_transaction(&self, txid: &Txid) -> Result<Transaction, ProviderError>;
24
25    fn fetch_address_utxos(&self, address: &Address) -> Result<Vec<(OutPoint, TxOut)>, ProviderError>;
26
27    fn fetch_scripthash_utxos(&self, script: &Script) -> Result<Vec<(OutPoint, TxOut)>, ProviderError>;
28
29    fn fetch_fee_estimates(&self) -> Result<HashMap<String, f64>, ProviderError>;
30
31    fn fetch_fee_rate(&self, target_blocks: u32) -> Result<f32, ProviderError> {
32        let estimates = self.fetch_fee_estimates()?;
33        let target_str = target_blocks.to_string();
34
35        if let Some(&rate) = estimates.get(&target_str) {
36            return Ok((rate * 1000.0) as f32); // Convert sat/vB to sats/kvb
37        }
38
39        let fallback_targets = [
40            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 144, 504, 1008,
41        ];
42
43        for &target in fallback_targets.iter().filter(|&&t| t >= target_blocks) {
44            let key = target.to_string();
45
46            if let Some(&rate) = estimates.get(&key) {
47                return Ok((rate * 1000.0) as f32);
48            }
49        }
50
51        for &target in &fallback_targets {
52            let key = target.to_string();
53
54            if let Some(&rate) = estimates.get(&key) {
55                return Ok((rate * 1000.0) as f32);
56            }
57        }
58
59        Ok(DEFAULT_FEE_RATE)
60    }
61}