smplx_sdk/provider/
provider.rs1use 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_transaction(&self, txid: &Txid) -> Result<Transaction, ProviderError>;
20
21 fn fetch_address_utxos(&self, address: &Address) -> Result<Vec<(OutPoint, TxOut)>, ProviderError>;
22
23 fn fetch_scripthash_utxos(&self, script: &Script) -> Result<Vec<(OutPoint, TxOut)>, ProviderError>;
24
25 fn fetch_fee_estimates(&self) -> Result<HashMap<String, f64>, ProviderError>;
26
27 fn fetch_fee_rate(&self, target_blocks: u32) -> Result<f32, ProviderError> {
28 let estimates = self.fetch_fee_estimates()?;
29 let target_str = target_blocks.to_string();
30
31 if let Some(&rate) = estimates.get(&target_str) {
32 return Ok((rate * 1000.0) as f32); }
34
35 let fallback_targets = [
36 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,
37 ];
38
39 for &target in fallback_targets.iter().filter(|&&t| t >= target_blocks) {
40 let key = target.to_string();
41
42 if let Some(&rate) = estimates.get(&key) {
43 return Ok((rate * 1000.0) as f32);
44 }
45 }
46
47 for &target in &fallback_targets {
48 let key = target.to_string();
49
50 if let Some(&rate) = estimates.get(&key) {
51 return Ok((rate * 1000.0) as f32);
52 }
53 }
54
55 Ok(DEFAULT_FEE_RATE)
56 }
57}