clementine_tx_sender/
task.rs1use crate::{TxSender, TxSenderDatabase, TxSenderSigner, TxSenderTxBuilder};
2use clementine_errors::BridgeError;
3use std::time::Duration;
4
5pub const POLL_DELAY: Duration = if cfg!(test) {
6 Duration::from_millis(500)
7} else {
8 Duration::from_secs(60)
9};
10
11#[derive(Debug)]
12pub struct TxSenderTaskInternal<S, D, B>
13where
14 S: TxSenderSigner + 'static,
15 D: TxSenderDatabase + Clone + 'static,
16 B: TxSenderTxBuilder + 'static,
17{
18 pub current_tip_height: u32,
19 pub last_processed_tip_height: u32,
20 pub inner: TxSender<S, D, B>,
21}
22
23impl<S, D, B> TxSenderTaskInternal<S, D, B>
24where
25 S: TxSenderSigner + 'static,
26 D: TxSenderDatabase + Clone + 'static,
27 B: TxSenderTxBuilder + 'static,
28{
29 pub fn new(inner: TxSender<S, D, B>) -> Self {
30 Self {
31 current_tip_height: 0,
32 last_processed_tip_height: 0,
33 inner,
34 }
35 }
36
37 #[tracing::instrument(skip(self), name = "tx_sender_task")]
38 pub async fn run_once(&mut self) -> Result<bool, BridgeError> {
39 let mut dbtx = self.inner.db.begin_transaction().await?;
40
41 self.inner
43 .db
44 .sync_transaction_confirmations(Some(&mut dbtx))
45 .await?;
46
47 self.current_tip_height = self
49 .inner
50 .db
51 .get_max_height(Some(&mut dbtx))
52 .await?
53 .unwrap_or(0);
54
55 self.inner.db.commit_transaction(dbtx).await?;
56
57 tracing::debug!("TXSENDER: Getting fee rate");
58 let fee_rate_result = self.inner.get_fee_rate().await;
59 tracing::debug!("TXSENDER: Fee rate result: {:?}", fee_rate_result);
60 let fee_rate = fee_rate_result?;
61
62 self.inner
63 .try_to_send_unconfirmed_txs(
64 fee_rate,
65 self.current_tip_height,
66 self.last_processed_tip_height != self.current_tip_height,
67 )
68 .await?;
69 self.last_processed_tip_height = self.current_tip_height;
70
71 Ok(false)
72 }
73}