Skip to main content

tx3_resolver/inputs/
mod.rs

1//! Tx input resolution pipeline.
2//!
3//! Orchestrates three stages:
4//! 1. **Narrow**: query the UTxO store to build a pool of candidate UTxOs
5//! 2. **Approximate**: filter and rank candidates for each query independently
6//! 3. **Assign**: allocate UTxOs across all queries simultaneously
7
8use tx3_tir::encoding::AnyTir;
9
10use crate::job::ResolveJob;
11use crate::{Error, UtxoStore};
12
13mod approximate;
14pub(crate) mod assign;
15mod canonical;
16mod narrow;
17
18#[cfg(test)]
19mod tests;
20
21pub use canonical::CanonicalQuery;
22
23impl ResolveJob {
24    /// Run the full input resolution pipeline: narrow, approximate, assign.
25    pub async fn resolve_queries<T: UtxoStore>(&mut self, utxos: &T) -> Result<(), Error> {
26        self.build_utxo_pool(utxos).await?;
27        self.approximate_queries();
28        self.assign_all()?;
29
30        Ok(())
31    }
32
33    /// Resolve all input queries in a TIR transaction.
34    pub async fn resolve_inputs<T: UtxoStore>(
35        &mut self,
36        tx: AnyTir,
37        utxos: &T,
38    ) -> Result<AnyTir, Error> {
39        let mut queries: Vec<(String, CanonicalQuery)> = Vec::new();
40
41        for (name, query) in tx3_tir::reduce::find_queries(&tx) {
42            queries.push((name, CanonicalQuery::try_from(query)?));
43        }
44
45        self.set_input_queries(queries);
46        self.resolve_queries(utxos).await?;
47
48        let all_inputs = self.to_input_map();
49        let out = tx3_tir::reduce::apply_inputs(tx, &all_inputs)?;
50
51        Ok(out)
52    }
53}