clementine_tx_sender/
task.rs

1use 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        // Sync transaction confirmations based on canonical block status
42        self.inner
43            .db
44            .sync_transaction_confirmations(Some(&mut dbtx))
45            .await?;
46
47        // Get current tip height
48        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}