diff --git a/src/blockchain/script_sync.rs b/src/blockchain/script_sync.rs index 9aeec7a4..e4c46999 100644 --- a/src/blockchain/script_sync.rs +++ b/src/blockchain/script_sync.rs @@ -9,7 +9,7 @@ use crate::{ wallet::time::Instant, BlockTime, Error, KeychainKind, LocalUtxo, TransactionDetails, }; -use bitcoin::{OutPoint, Script, ScriptBuf, Transaction, TxOut, Txid}; +use bitcoin::{hashes::Hash, OutPoint, Script, ScriptBuf, Transaction, TxOut, Txid}; use log::*; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque}; @@ -444,8 +444,14 @@ impl<'a, D: BatchDatabase> State<'a, D> { /// Remove conflicting transactions -- tie breaking them by fee. fn make_txs_consistent(txs: &[TransactionDetails]) -> Vec<&TransactionDetails> { let mut utxo_index: HashMap = HashMap::default(); + let mut coinbase_txs = vec![]; for tx in txs { for input in &tx.transaction.as_ref().unwrap().input { + if input.previous_output.txid == Txid::all_zeros() { + coinbase_txs.push(tx); + break; + } + utxo_index .entry(input.previous_output) .and_modify(|existing| match (tx.fee, existing.fee) { @@ -463,5 +469,6 @@ fn make_txs_consistent(txs: &[TransactionDetails]) -> Vec<&TransactionDetails> { .collect::>() .into_iter() .map(|(_, tx)| tx) + .chain(coinbase_txs) .collect() } diff --git a/src/testutils/blockchain_tests.rs b/src/testutils/blockchain_tests.rs index 510a2c5b..485c7922 100644 --- a/src/testutils/blockchain_tests.rs +++ b/src/testutils/blockchain_tests.rs @@ -1098,18 +1098,18 @@ macro_rules! bdk_blockchain_tests { wallet.sync(&blockchain, SyncOptions::default()).unwrap(); assert_eq!(wallet.get_balance().unwrap().immature, 0, "incorrect balance"); - test_client.generate(1, Some(wallet_addr)); + test_client.generate(2, Some(wallet_addr)); wallet.sync(&blockchain, SyncOptions::default()).unwrap(); - assert!(wallet.get_balance().unwrap().immature > 0, "incorrect balance after receiving coinbase"); + assert_eq!(wallet.get_balance().unwrap().immature, 5000000000*2, "incorrect balance after receiving coinbase"); // make coinbase mature (100 blocks) let node_addr = test_client.get_node_address(None); test_client.generate(100, Some(node_addr)); wallet.sync(&blockchain, SyncOptions::default()).unwrap(); - assert!(wallet.get_balance().unwrap().confirmed > 0, "incorrect balance after maturing coinbase"); + assert_eq!(wallet.get_balance().unwrap().confirmed, 5000000000 * 2, "incorrect balance after maturing coinbase"); }