From: Alekos Filini Date: Tue, 27 Jul 2021 11:23:25 +0000 (+0200) Subject: Merge commit 'refs/pull/392/head' of github.com:bitcoindevkit/bdk X-Git-Tag: 0.10.0~12 X-Git-Url: http://internal-gitweb-vhost/script/%22https:/database/enum.MessageSignatureError.html?a=commitdiff_plain;h=63592f169f4824da2e61b9a7f994763a96170184;p=bdk Merge commit 'refs/pull/392/head' of github.com:bitcoindevkit/bdk --- 63592f169f4824da2e61b9a7f994763a96170184 diff --cc src/wallet/coin_selection.rs index 1af50e6e,41e83da9..c4c88e75 --- a/src/wallet/coin_selection.rs +++ b/src/wallet/coin_selection.rs @@@ -543,52 -555,33 +551,33 @@@ mod test const P2WPKH_WITNESS_SIZE: usize = 73 + 33 + 2; - const FEE_AMOUNT: f32 = 50.0; + const FEE_AMOUNT: u64 = 50; + fn utxo(value: u64, index: u32) -> WeightedUtxo { + assert!(index < 10); + let outpoint = OutPoint::from_str(&format!( + "000000000000000000000000000000000000000000000000000000000000000{}:0", + index + )) + .unwrap(); + WeightedUtxo { + satisfaction_weight: P2WPKH_WITNESS_SIZE, + utxo: Utxo::Local(LocalUtxo { + outpoint, + txout: TxOut { + value, + script_pubkey: Script::new(), + }, + keychain: KeychainKind::External, + }), + } + } + fn get_test_utxos() -> Vec { vec![ - WeightedUtxo { - satisfaction_weight: P2WPKH_WITNESS_SIZE, - utxo: Utxo::Local(LocalUtxo { - outpoint: OutPoint::from_str( - "0000000000000000000000000000000000000000000000000000000000000000:0", - ) - .unwrap(), - txout: TxOut { - value: 100_000, - script_pubkey: Script::new(), - }, - keychain: KeychainKind::External, - }), - }, - WeightedUtxo { - satisfaction_weight: P2WPKH_WITNESS_SIZE, - utxo: Utxo::Local(LocalUtxo { - outpoint: OutPoint::from_str( - "0000000000000000000000000000000000000000000000000000000000000001:0", - ) - .unwrap(), - txout: TxOut { - value: FEE_AMOUNT as u64 - 40, - script_pubkey: Script::new(), - }, - keychain: KeychainKind::External, - }), - }, - WeightedUtxo { - satisfaction_weight: P2WPKH_WITNESS_SIZE, - utxo: Utxo::Local(LocalUtxo { - outpoint: OutPoint::from_str( - "0000000000000000000000000000000000000000000000000000000000000002:0", - ) - .unwrap(), - txout: TxOut { - value: 200_000, - script_pubkey: Script::new(), - }, - keychain: KeychainKind::Internal, - }), - }, + utxo(100_000, 0), + utxo(FEE_AMOUNT as u64 - 40, 1), + utxo(200_000, 2), ] } @@@ -802,9 -795,40 +791,40 @@@ assert_eq!(result.selected.len(), 3); assert_eq!(result.selected_amount(), 300010); - assert!((result.fee_amount - 254.0).abs() < f32::EPSILON); + assert_eq!(result.fee_amount, 254); } + #[test] + fn test_bnb_coin_selection_required_not_enough() { + let utxos = get_test_utxos(); + let database = MemoryDatabase::default(); + + let required = vec![utxos[0].clone()]; + let mut optional = utxos[1..].to_vec(); + optional.push(utxo(500_000, 3)); + + // Defensive assertions, for sanity and in case someone changes the test utxos vector. + let amount: u64 = required.iter().map(|u| u.utxo.txout().value).sum(); + assert_eq!(amount, 100_000); + let amount: u64 = optional.iter().map(|u| u.utxo.txout().value).sum(); + assert!(amount > 150_000); + + let result = BranchAndBoundCoinSelection::default() + .coin_select( + &database, + required, + optional, + FeeRate::from_sat_per_vb(1.0), + 150_000, + FEE_AMOUNT, + ) + .unwrap(); + + assert_eq!(result.selected.len(), 3); + assert_eq!(result.selected_amount(), 300_010); + assert!((result.fee_amount - 254.0).abs() < f32::EPSILON); + } + #[test] #[should_panic(expected = "InsufficientFunds")] fn test_bnb_coin_selection_insufficient_funds() {