[][src]Module bdk::wallet::coin_selection

Coin selection

This module provides the trait CoinSelectionAlgorithm that can be implemented to define custom coin selection algorithms.

The coin selection algorithm is not globally part of a Wallet, instead it is selected whenever a Wallet::create_tx call is made, through the use of the TxBuilder structure, specifically with TxBuilder::coin_selection method.

The DefaultCoinSelectionAlgorithm selects the default coin selection algorithm that TxBuilder uses, if it's not explicitly overridden.

Example

#[derive(Debug)]
struct AlwaysSpendEverything;

impl<D: Database> CoinSelectionAlgorithm<D> for AlwaysSpendEverything {
    fn coin_select(
        &self,
        database: &D,
        required_utxos: Vec<(UTXO, usize)>,
        optional_utxos: Vec<(UTXO, usize)>,
        fee_rate: FeeRate,
        amount_needed: u64,
        fee_amount: f32,
    ) -> Result<CoinSelectionResult, bdk::Error> {
        let mut selected_amount = 0;
        let mut additional_weight = 0;
        let all_utxos_selected = required_utxos
            .into_iter().chain(optional_utxos)
            .scan((&mut selected_amount, &mut additional_weight), |(selected_amount, additional_weight), (utxo, weight)| {
                **selected_amount += utxo.txout.value;
                **additional_weight += TXIN_BASE_WEIGHT + weight;

                Some(utxo)
            })
            .collect::<Vec<_>>();
        let additional_fees = additional_weight as f32 * fee_rate.as_sat_vb() / 4.0;

        if (fee_amount + additional_fees).ceil() as u64 + amount_needed > selected_amount {
            return Err(bdk::Error::InsufficientFunds);
        }

        Ok(CoinSelectionResult {
            selected: all_utxos_selected,
            selected_amount,
            fee_amount: fee_amount + additional_fees,
        })
    }
}

// create wallet, sync, ...

let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();
let (psbt, details) = wallet.create_tx(
    TxBuilder::with_recipients(vec![(to_address.script_pubkey(), 50_000)])
        .coin_selection(AlwaysSpendEverything),
)?;

// inspect, sign, broadcast, ...

Structs

BranchAndBoundCoinSelection

Branch and bound coin selection

CoinSelectionResult

Result of a successful coin selection

LargestFirstCoinSelection

Simple and dumb coin selection

Traits

CoinSelectionAlgorithm

Trait for generalized coin selection algorithms

Type Definitions

DefaultCoinSelectionAlgorithm

Default coin selection algorithm used by TxBuilder if not overridden