use async_trait::async_trait;
use bdk_chain::collections::btree_map;
use bdk_chain::{
- bitcoin::{BlockHash, OutPoint, ScriptBuf, Txid},
+ bitcoin::{BlockHash, OutPoint, ScriptBuf, TxOut, Txid},
collections::BTreeMap,
local_chain::{self, CheckPoint},
BlockId, ConfirmationTimeHeightAnchor, TxGraph,
if let Some(anchor) = anchor_from_status(&tx.status) {
let _ = graph.insert_anchor(tx.txid, anchor);
}
+
+ let previous_outputs = tx.vin.iter().filter_map(|vin| {
+ let prevout = vin.prevout.as_ref()?;
+ Some((
+ OutPoint {
+ txid: vin.txid,
+ vout: vin.vout,
+ },
+ TxOut {
+ script_pubkey: prevout.scriptpubkey.clone(),
+ value: prevout.value,
+ },
+ ))
+ });
+
+ for (outpoint, txout) in previous_outputs {
+ let _ = graph.insert_txout(outpoint, txout);
+ }
}
}
use bdk_chain::collections::btree_map;
use bdk_chain::collections::BTreeMap;
use bdk_chain::{
- bitcoin::{BlockHash, OutPoint, ScriptBuf, Txid},
+ bitcoin::{BlockHash, OutPoint, ScriptBuf, TxOut, Txid},
local_chain::{self, CheckPoint},
BlockId, ConfirmationTimeHeightAnchor, TxGraph,
};
if let Some(anchor) = anchor_from_status(&tx.status) {
let _ = graph.insert_anchor(tx.txid, anchor);
}
+
+ let previous_outputs = tx.vin.iter().filter_map(|vin| {
+ let prevout = vin.prevout.as_ref()?;
+ Some((
+ OutPoint {
+ txid: vin.txid,
+ vout: vin.vout,
+ },
+ TxOut {
+ script_pubkey: prevout.scriptpubkey.clone(),
+ value: prevout.value,
+ },
+ ))
+ });
+
+ for (outpoint, txout) in previous_outputs {
+ let _ = graph.insert_txout(outpoint, txout);
+ }
}
}
)
.await?;
+ // Check to see if we have the floating txouts available from our two created transactions'
+ // previous outputs in order to calculate transaction fees.
+ for tx in graph_update.full_txs() {
+ // Retrieve the calculated fee from `TxGraph`, which will panic if we do not have the
+ // floating txouts available from the transactions' previous outputs.
+ let fee = graph_update.calculate_fee(tx.tx).expect("Fee must exist");
+
+ // Retrieve the fee in the transaction data from `bitcoind`.
+ let tx_fee = env
+ .bitcoind
+ .client
+ .get_transaction(&tx.txid, None)
+ .expect("Tx must exist")
+ .fee
+ .expect("Fee must exist")
+ .abs()
+ .to_sat() as u64;
+
+ // Check that the calculated fee matches the fee from the transaction data.
+ assert_eq!(fee, tx_fee);
+ }
+
let mut graph_update_txids: Vec<Txid> = graph_update.full_txs().map(|tx| tx.txid).collect();
graph_update_txids.sort();
let mut expected_txids = vec![txid1, txid2];
1,
)?;
+ // Check to see if we have the floating txouts available from our two created transactions'
+ // previous outputs in order to calculate transaction fees.
+ for tx in graph_update.full_txs() {
+ // Retrieve the calculated fee from `TxGraph`, which will panic if we do not have the
+ // floating txouts available from the transactions' previous outputs.
+ let fee = graph_update.calculate_fee(tx.tx).expect("Fee must exist");
+
+ // Retrieve the fee in the transaction data from `bitcoind`.
+ let tx_fee = env
+ .bitcoind
+ .client
+ .get_transaction(&tx.txid, None)
+ .expect("Tx must exist")
+ .fee
+ .expect("Fee must exist")
+ .abs()
+ .to_sat() as u64;
+
+ // Check that the calculated fee matches the fee from the transaction data.
+ assert_eq!(fee, tx_fee);
+ }
+
let mut graph_update_txids: Vec<Txid> = graph_update.full_txs().map(|tx| tx.txid).collect();
graph_update_txids.sort();
let mut expected_txids = vec![txid1, txid2];