Module bdk::wallet::coin_selection [−][src]
Coin selection
This module provides the trait CoinSelectionAlgorithm
that can be implemented to
define custom coin selection algorithms.
You can specify a custom coin selection algorithm through the coin_selection
method on
TxBuilder
. DefaultCoinSelectionAlgorithm
aliases the coin selection algorithm that will
be used if it is not explicitly set.
Example
#[derive(Debug)] struct AlwaysSpendEverything; impl<D: Database> CoinSelectionAlgorithm<D> for AlwaysSpendEverything { fn coin_select( &self, database: &D, required_utxos: Vec<WeightedUtxo>, optional_utxos: Vec<WeightedUtxo>, 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), weighted_utxo| { **selected_amount += weighted_utxo.utxo.txout().value; **additional_weight += TXIN_BASE_WEIGHT + weighted_utxo.satisfaction_weight; Some(weighted_utxo.utxo) }) .collect::<Vec<_>>(); let additional_fees = additional_weight as f32 * fee_rate.as_sat_vb() / 4.0; let amount_needed_with_fees = (fee_amount + additional_fees).ceil() as u64 + amount_needed; if amount_needed_with_fees > selected_amount { return Err(bdk::Error::InsufficientFunds{ needed: amount_needed_with_fees, available: selected_amount }); } Ok(CoinSelectionResult { selected: all_utxos_selected, fee_amount: fee_amount + additional_fees, }) } } // create wallet, sync, ... let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap(); let (psbt, details) = { let mut builder = wallet.build_tx().coin_selection(AlwaysSpendEverything); builder .add_recipient(to_address.script_pubkey(), 50_000); builder.finish()? }; // 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 |