Skip to content

Commit 618cece

Browse files
committed
Add back coin_selection tests
1 parent 729f0ec commit 618cece

File tree

2 files changed

+69
-52
lines changed

2 files changed

+69
-52
lines changed

src/psbt/mod.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -192,27 +192,15 @@ mod test {
192192
let mut builder = wallet.build_tx();
193193
builder.drain_to(addr.script_pubkey()).drain_wallet();
194194
builder.fee_rate(FeeRate::from_sat_per_vb(expected_fee_rate));
195-
let (mut psbt, details) = builder.finish().unwrap();
195+
let (mut psbt, _) = builder.finish().unwrap();
196196
let fee_amount = psbt.fee_amount();
197197
assert!(fee_amount.is_some());
198-
let unfinalized_fee_rate = psbt.fee_rate().unwrap();
199-
println!("unfinalized fee rate: {:?}", unfinalized_fee_rate);
200198

199+
let unfinalized_fee_rate = psbt.fee_rate().unwrap();
201200
let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
202201
assert!(finalized);
203202

204-
let tx = psbt.clone().extract_tx();
205-
// println!("tx: {:#?}", tx);
206-
println!("scriptSig weight: {}", tx.input[0].script_sig.len() * 4);
207-
println!("weight: {}", tx.weight());
208-
let vb = tx.weight() as f32 / 4.0;
209-
println!("vbytes: {}", vb);
210-
let fee = details.fee.unwrap_or(0);
211-
println!("fee: {}", details.fee.unwrap_or(0));
212-
println!("feerate: {} sats/vb", fee as f32 / vb);
213-
214203
let finalized_fee_rate = psbt.fee_rate().unwrap();
215-
println!("finalized fee rate: {:?}", finalized_fee_rate);
216204
assert!(finalized_fee_rate.as_sat_per_vb() >= expected_fee_rate);
217205
assert!(finalized_fee_rate.as_sat_per_vb() < unfinalized_fee_rate.as_sat_per_vb());
218206
}

src/wallet/coin_selection.rs

Lines changed: 67 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ impl CoinSelectionAlgorithm for LargestFirstCoinSelection {
216216
let mut pool = selector.unselected().collect::<Vec<_>>();
217217
pool.sort_unstable_by_key(|(_, candidate)| candidate.value);
218218
pool.reverse();
219+
println!("pool: {:?}", pool);
219220
pool
220221
};
221222

@@ -384,6 +385,7 @@ mod test {
384385
use bitcoin::{OutPoint, Script, TxOut};
385386

386387
use super::*;
388+
use crate::bdk_core::CoinSelectorOpt;
387389
// use crate::database::{BatchOperations, MemoryDatabase};
388390
use crate::types::*;
389391
// use crate::wallet::WeightUnits;
@@ -419,12 +421,25 @@ mod test {
419421
}
420422
}
421423

422-
fn get_test_utxos() -> Vec<WeightedUtxo> {
423-
vec![
424+
fn get_test_utxos() -> (Vec<WeightedUtxo>, Vec<bdk_core::WeightedValue>) {
425+
let utxos = vec![
424426
utxo(100_000, 0),
425427
utxo(FEE_AMOUNT as u64 - 40, 1),
426428
utxo(200_000, 2),
427-
]
429+
];
430+
431+
let candidates = utxos
432+
.iter()
433+
.map(|utxo| {
434+
bdk_core::WeightedValue::new(
435+
utxo.utxo.txout().value,
436+
utxo.satisfaction_weight as u32,
437+
utxo.utxo.txout().script_pubkey.is_witness_program(),
438+
)
439+
})
440+
.collect::<Vec<_>>();
441+
442+
(utxos, candidates)
428443
}
429444

430445
fn setup_database_and_get_oldest_first_test_utxos<D: Database>(
@@ -531,46 +546,60 @@ mod test {
531546
.map(|u| u.utxo.txout().value)
532547
.sum()
533548
}
534-
// fn test_largest_first_coin_selection_success() {
535-
// let utxos = get_test_utxos();
536-
// let drain_script = Script::default();
537-
// let target_amount = 250_000 + FEE_AMOUNT;
538549

539-
// let result = LargestFirstCoinSelection::default()
540-
// .coin_select(
541-
// utxos,
542-
// vec![],
543-
// FeeRate::from_sat_per_vb(1.0),
544-
// target_amount,
545-
// &drain_script,
546-
// )
547-
// .unwrap();
550+
fn new_opts(target_value: u64, feerate: f32, drain_script: Script) -> CoinSelectorOpt {
551+
CoinSelectorOpt {
552+
target_feerate: feerate,
553+
..CoinSelectorOpt::fund_outputs(
554+
&[TxOut {
555+
value: target_value,
556+
script_pubkey: Script::default(),
557+
}],
558+
&TxOut {
559+
value: 0,
560+
script_pubkey: drain_script,
561+
},
562+
0,
563+
)
564+
}
565+
}
548566

549-
// assert_eq!(result.selected.len(), 3);
550-
// assert_eq!(result.selected_amount(), 300_010);
551-
// assert_eq!(result.fee_amount, 204)
552-
// }
567+
#[test]
568+
fn test_largest_first_coin_selection_success() {
569+
let (utxos, candidates) = get_test_utxos();
570+
let target_amount = 250_000 + FEE_AMOUNT;
553571

554-
// #[test]
555-
// fn test_largest_first_coin_selection_use_all() {
556-
// let utxos = get_test_utxos();
557-
// let drain_script = Script::default();
558-
// let target_amount = 20_000 + FEE_AMOUNT;
572+
let opts = new_opts(target_amount, 0.25, Script::default());
573+
let selector = bdk_core::CoinSelector::new(&candidates, &opts);
559574

560-
// let result = LargestFirstCoinSelection::default()
561-
// .coin_select(
562-
// utxos,
563-
// vec![],
564-
// FeeRate::from_sat_per_vb(1.0),
565-
// target_amount,
566-
// &drain_script,
567-
// )
568-
// .unwrap();
575+
let result = LargestFirstCoinSelection::default()
576+
.coin_select(&utxos, selector)
577+
.unwrap();
578+
let (strategy_kind, strategy) = result.best_strategy();
579+
println!("strategy_kind: {}", strategy_kind);
569580

570-
// assert_eq!(result.selected.len(), 3);
571-
// assert_eq!(result.selected_amount(), 300_010);
572-
// assert_eq!(result.fee_amount, 204);
573-
// }
581+
assert_eq!(result.selected.len(), 2);
582+
assert_eq!(strategy.fee, 164);
583+
}
584+
585+
#[test]
586+
fn test_largest_first_coin_selection_use_all() {
587+
let (utxos, candidates) = get_test_utxos();
588+
let target_amount = 20_000 + FEE_AMOUNT;
589+
590+
let opts = new_opts(target_amount, 0.25, Script::default());
591+
let mut selector = bdk_core::CoinSelector::new(&candidates, &opts);
592+
selector.select_all();
593+
594+
let result = LargestFirstCoinSelection::default()
595+
.coin_select(&utxos, selector)
596+
.unwrap();
597+
let (_, strategy) = result.best_strategy();
598+
599+
assert_eq!(result.selected.len(), 3);
600+
// assert_eq!(result.selected_amount(), 300_010);
601+
assert_eq!(strategy.fee, 232);
602+
}
574603

575604
// #[test]
576605
// fn test_largest_first_coin_selection_use_only_necessary() {

0 commit comments

Comments
 (0)