@@ -216,6 +216,7 @@ impl CoinSelectionAlgorithm for LargestFirstCoinSelection {
216
216
let mut pool = selector. unselected ( ) . collect :: < Vec < _ > > ( ) ;
217
217
pool. sort_unstable_by_key ( |( _, candidate) | candidate. value ) ;
218
218
pool. reverse ( ) ;
219
+ println ! ( "pool: {:?}" , pool) ;
219
220
pool
220
221
} ;
221
222
@@ -384,6 +385,7 @@ mod test {
384
385
use bitcoin:: { OutPoint , Script , TxOut } ;
385
386
386
387
use super :: * ;
388
+ use crate :: bdk_core:: CoinSelectorOpt ;
387
389
// use crate::database::{BatchOperations, MemoryDatabase};
388
390
use crate :: types:: * ;
389
391
// use crate::wallet::WeightUnits;
@@ -419,12 +421,25 @@ mod test {
419
421
}
420
422
}
421
423
422
- fn get_test_utxos ( ) -> Vec < WeightedUtxo > {
423
- vec ! [
424
+ fn get_test_utxos ( ) -> ( Vec < WeightedUtxo > , Vec < bdk_core :: WeightedValue > ) {
425
+ let utxos = vec ! [
424
426
utxo( 100_000 , 0 ) ,
425
427
utxo( FEE_AMOUNT as u64 - 40 , 1 ) ,
426
428
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)
428
443
}
429
444
430
445
fn setup_database_and_get_oldest_first_test_utxos < D : Database > (
@@ -531,46 +546,60 @@ mod test {
531
546
. map ( |u| u. utxo . txout ( ) . value )
532
547
. sum ( )
533
548
}
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;
538
549
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
+ }
548
566
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 ;
553
571
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) ;
559
574
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) ;
569
580
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
+ }
574
603
575
604
// #[test]
576
605
// fn test_largest_first_coin_selection_use_only_necessary() {
0 commit comments